diff options
| author | Quentin Carbonneaux <[email protected]> | 2019-02-06 08:34:51 +0100 |
|---|---|---|
| committer | Quentin Carbonneaux <[email protected]> | 2019-02-06 09:02:25 +0100 |
| commit | ce0ab53ed73fb24f9537cab762467efad56f2664 (patch) | |
| tree | f8fb8d9da412938e1d66d7fc2b7a7f98f7a64f19 /test/rega1.ssa | |
| parent | 834b5cb08bbf0f4fbc1992a72327dfc2c0a31796 (diff) | |
2 bug fixes in rega
The worst one was that "part 3" of rega()
could break the critical invariant that
two interferring temporaries get assigned
different registers. This is fixed by
being careful when changing the register
of a temporary based on predecessor
blocks.
Thanks to Michael Forney for reporting
these bugs and helping with the analysis.
Diffstat (limited to 'test/rega1.ssa')
| -rw-r--r-- | test/rega1.ssa | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/test/rega1.ssa b/test/rega1.ssa new file mode 100644 index 0000000..9e87c89 --- /dev/null +++ b/test/rega1.ssa @@ -0,0 +1,24 @@ +# tests that %b and %a0 do not end up in +# the same register at the start of @loop + +export function l $f(l %a) { +@start +@loop + %b =l phi @start 42, @loop0 %a1, @loop1 %a1 + %a0 =l phi @start %a, @loop0 %a1, @loop1 %a1 + %a1 =l sub %a0, 1 + jnz %b, @loop0, @loop1 +@loop0 + jnz %a1, @loop, @end +@loop1 + jnz %a1, @loop, @end +@end + ret %b +} + +# >>> driver +# extern long long f(long long); +# int main() { +# return !(f(1) == 42 && f(2) == 1 && f(42) == 1); +# } +# <<< |
