From 9632f2f148bf545fea09f25f34a316ec8ae86256 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Sat, 11 Mar 2023 21:51:10 +0100 Subject: 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. --- test/mem2.ssa | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 test/mem2.ssa (limited to 'test') 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 +} -- cgit 1.4.1