diff options
author | Quentin Carbonneaux <quentin@c9x.me> | 2023-03-11 21:51:10 +0100 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2023-03-11 21:51:10 +0100 |
commit | 9632f2f148bf545fea09f25f34a316ec8ae86256 (patch) | |
tree | ce7985a7ac0726af70000757ba47afdd950e7966 /test | |
parent | f1b21d145ba03c6052b4b722dc457f8e944e6fca (diff) | |
download | roux-9632f2f148bf545fea09f25f34a316ec8ae86256.tar.gz |
kill dead stores when coalescing slots
This is necessary because, post fusion, dead stores may clobber data. A new test case exposes one such situation.
Diffstat (limited to 'test')
-rw-r--r-- | test/mem2.ssa | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/mem2.ssa b/test/mem2.ssa new file mode 100644 index 0000000..4a136b4 --- /dev/null +++ b/test/mem2.ssa @@ -0,0 +1,32 @@ +# Ember Sawady reported this bug +# in stack-slot coalescing + +type :t = { w 2 } + +function :t $func() { +@start.0 + %temp =l alloc4 4 + %ret =l alloc4 8 + storew 1, %temp + # storew can also go here + %field =l add %ret, 4 + storew 2, %ret + blit %temp, %field, 4 + # removing either of these storews causes it to work + storew 2, %ret + ret %ret +} + +export function w $main() { +@start + %ret =:t call $func() + %fptr =l add %ret, 4 + %field =w loaduw %fptr + %x =w ceqw %field, 1 + jnz %x, @passed, @failed +@failed + # this fails despite 1 => temp => ret + 4 => field + call $abort() +@passed + ret 0 +} |