Skip to content

Commit

Permalink
Merge pull request #134 from sampsyo/ssa-tweaks
Browse files Browse the repository at this point in the history
More tests and a fix for SSA conversion (from #119)
  • Loading branch information
sampsyo authored Aug 23, 2021
2 parents 33eaedf + 07f81e0 commit 6f7371e
Show file tree
Hide file tree
Showing 22 changed files with 185 additions and 5 deletions.
9 changes: 9 additions & 0 deletions examples/test/ssa_roundtrip/argwrite.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# ARGS: 3
@main(a: int) {
cond: bool = const true;
br cond .here .there;
.here:
a: int = const 5;
.there:
print a;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/argwrite.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
5
14 changes: 14 additions & 0 deletions examples/test/ssa_roundtrip/if-const.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
@main() {
cond: bool = const true;
br cond .true .false;
.true:
a: int = const 0;
jmp .zexit;
.false:
b: int = const 1;
jmp .zexit;
# zexit to trigger a bug in to_ssa.py that depends on
# the order that basic blocks get renamed.
.zexit:
print a;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/if-const.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
17 changes: 17 additions & 0 deletions examples/test/ssa_roundtrip/if-ssa.bril.BROKEN
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# ARGS: true
@main(cond: bool) {
.entry:
a.1: int = const 47;
br cond .left .right;
.left:
a.2: int = add a.1 a.1;
jmp .zexit;
.right:
a.3: int = mul a.1 a.1;
jmp .zexit;
# zexit to trigger a bug in to_ssa.py that depends on
# the order that basic blocks get renamed.
.zexit:
a.4: int = phi .left a.2 .right a.3;
print a.4;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/if-ssa.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
94
14 changes: 14 additions & 0 deletions examples/test/ssa_roundtrip/if.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# ARGS: false
@main(cond: bool) {
.entry:
a: int = const 47;
br cond .left .right;
.left:
a: int = add a a;
jmp .exit;
.right:
a: int = mul a a;
jmp .exit;
.exit:
print a;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/if.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2209
24 changes: 24 additions & 0 deletions examples/test/ssa_roundtrip/loop-branch.bril.BROKEN
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
@func(): int {
n: int = const 5;
ret n;
}

@loop(infinite: bool, print: bool) {
.entry:
.loop.header:
br infinite .loop.body .loop.end;
.loop.body:
br print .loop.print .loop.next;
.loop.print:
v: int = call @func;
print v;
.loop.next:
jmp .loop.header;
.loop.end:
}

@main() {
infinite: bool = const false;
print: bool = const true;
call @loop infinite print;
}
Empty file.
14 changes: 14 additions & 0 deletions examples/test/ssa_roundtrip/loop.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
@main {
.entry:
i: int = const 1;
jmp .loop;
.loop:
max: int = const 10;
cond: bool = lt i max;
br cond .body .exit;
.body:
i: int = add i i;
jmp .loop;
.exit:
print i;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/loop.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
16
14 changes: 14 additions & 0 deletions examples/test/ssa_roundtrip/selfloop.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
@main {
.entry:
one: int = const 1;
zero: int = const 0;
x: int = const 5;
.loop:
x: int = sub x one;
done: bool = eq x zero;
.br:
br done .exit .loop;
.exit:
print x;
ret;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/selfloop.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/turnt.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
command = "bril2json < {filename} | python ../../to_ssa.py | python ../../from_ssa.py | python ../../tdce.py | brili {args}"
13 changes: 13 additions & 0 deletions examples/test/ssa_roundtrip/while.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# ARGS: 5
@main(a: int) {
.while.cond:
zero: int = const 0;
is_term: bool = eq a zero;
br is_term .while.finish .while.body;
.while.body:
one: int = const 1;
a: int = sub a one;
jmp .while.cond;
.while.finish:
print a;
}
1 change: 1 addition & 0 deletions examples/test/ssa_roundtrip/while.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
2 changes: 1 addition & 1 deletion examples/test/to_ssa/if-const.out
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
b.0: int = const 1;
jmp .zexit;
.zexit:
b.1: int = phi b.0 b.0 .false .true;
b.1: int = phi b.0 __undefined .false .true;
a.1: int = phi __undefined a.0 .false .true;
print a.1;
ret;
Expand Down
2 changes: 1 addition & 1 deletion examples/test/to_ssa/if-ssa.out
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
jmp .zexit;
.zexit:
a.3.1: int = phi __undefined a.3.0 .left .right;
a.2.1: int = phi a.2.0 a.2.0 .left .right;
a.2.1: int = phi a.2.0 __undefined .left .right;
a.4.0: int = phi a.2.1 a.3.1 .left .right;
print a.4.0;
ret;
Expand Down
24 changes: 24 additions & 0 deletions examples/test/to_ssa/loop-branch.bril
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
@func(): int {
n: int = const 5;
ret n;
}

@loop(infinite: bool, print: bool) {
.entry:
.loop.header:
br infinite .loop.body .loop.end;
.loop.body:
br print .loop.print .loop.next;
.loop.print:
v: int = call @func;
print v;
.loop.next:
jmp .loop.header;
.loop.end:
}

@main() {
infinite: bool = const false;
print: bool = const true;
call @loop infinite print;
}
30 changes: 30 additions & 0 deletions examples/test/to_ssa/loop-branch.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@func: int {
.b1:
n.0: int = const 5;
ret n.0;
}
@loop(infinite: bool, print: bool) {
.entry:
jmp .loop.header;
.loop.header:
v.0: int = phi __undefined v.1 .entry .loop.next;
br infinite .loop.body .loop.end;
.loop.body:
br print .loop.print .loop.next;
.loop.print:
v.2: int = call @func;
print v.2;
jmp .loop.next;
.loop.next:
v.1: int = phi v.0 v.2 .loop.body .loop.print;
jmp .loop.header;
.loop.end:
ret;
}
@main {
.b1:
infinite.0: bool = const false;
print.0: bool = const true;
call @loop infinite.0 print.0;
ret;
}
5 changes: 2 additions & 3 deletions examples/to_ssa.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from cfg import block_map, successors, add_terminators, add_entry, reassemble
from form_blocks import form_blocks
from dom import get_dom, dom_fronts, dom_tree, map_inv
from dom import get_dom, dom_fronts, dom_tree


def def_blocks(blocks):
Expand Down Expand Up @@ -83,6 +83,7 @@ def _rename(block):
_rename(b)

# Restore stacks.
stack.clear()
stack.update(old_stack)

entry = list(blocks.keys())[0]
Expand All @@ -91,7 +92,6 @@ def _rename(block):
return phi_args, phi_dests



def insert_phis(blocks, phi_args, phi_dests, types):
for block, instrs in blocks.items():
for dest, pairs in sorted(phi_args[block].items()):
Expand Down Expand Up @@ -121,7 +121,6 @@ def func_to_ssa(func):
add_entry(blocks)
add_terminators(blocks)
succ = {name: successors(block[-1]) for name, block in blocks.items()}
pred = map_inv(succ)
dom = get_dom(succ, list(blocks.keys())[0])

df = dom_fronts(dom, succ)
Expand Down

0 comments on commit 6f7371e

Please sign in to comment.