Add unconditional branching.

This commit is contained in:
cfreksen 2017-10-29 18:42:38 +01:00
parent 05782f6fca
commit a4885103c0
No known key found for this signature in database
GPG Key ID: EAC13EE101008978

View File

@ -51,6 +51,11 @@ def step(insns, terminator, blocks, stack_frames, ssa_env, global_env, memory,
def terminate(terminator, blocks, stack_frames, ssa_env, global_env, memory):
def clear_block_from_ssa_env(insns, ssa_env):
for (id, insn) in insns:
if id is not None and id in ssa_env:
del ssa_env[id]
if isinstance(terminator, ll.Ret):
oper = terminator.oper
if oper is None:
@ -64,6 +69,22 @@ def terminate(terminator, blocks, stack_frames, ssa_env, global_env, memory):
new_stack_frames = stack_frames[1:]
return (new_insns, new_terminator, new_blocks, new_stack_frames,
new_ssa_env, memory, oper_v)
elif isinstance(terminator, ll.Br):
label = terminator.label
next_block = blocks[label]
new_insns = next_block.insns
new_terminator = next_block.terminator
# TODO: Might need to find a better solution as we will ignore
# multiple assignments, if they are spread over multiple
# blocks.
clear_block_from_ssa_env(new_insns, ssa_env)
print('Jumping unconditionally to {}'
.format(label))
return (new_insns, new_terminator, blocks, stack_frames,
ssa_env, memory, None)
else:
err('Unknown LLVM terminator: {}'
.format(terminator))
@ -118,18 +139,19 @@ def gogo():
data = r'''
define i64 @tigermain (i64 %U_mainSL_8, i64 %U_mainDummy_9) {
%a = add i64 3, 5 ; please be 8
br label %L1
L1:
%b = add i64 %a, %a
%c = add i64 %a, %b
%d = add i64 100, %c
%e = mul i64 7, %b
%f = sdiv i64 %e, 2
%g = sub i64 %d, %f
%h = or i64 1, %g
%i = shl i64 %h, 2
ret i64 %g
ret i64 %c
L2:
%d = add i64 %a, 1
%e = add i64 10, %b
ret i64 %e
}
'''
print(data)
ast = p.parse(data)
tdecs = ast.tdecls