Fix dead code elimination used in tests
authorMichal Terepeta <michal.terepeta@gmail.com>
Sun, 28 Jun 2015 15:03:45 +0000 (17:03 +0200)
committerMichal Terepeta <michal.terepeta@gmail.com>
Sun, 5 Jul 2015 11:55:17 +0000 (13:55 +0200)
The helper functions to fold over instructions and expressions in
test/OptSupport have a bug where they would not recurse for complex
expressions. And since testing/Live module depends on it, complex
expressions would not be fully analyzed, leading to removal of code
that is *not* dead, e.g.,
  var1 = m[0]
  var1 = m[var1] + m[var1]
would get rewritten to just
  var1 = m[var1] + m[var1]
which is clearly wrong.

Note that this bug affects only Hoopl's tests.

testing/Main.hs
testing/OptSupport.hs
testing/tests/test6 [new file with mode: 0644]
testing/tests/test6.expected [new file with mode: 0644]

index 3728be6..000c7ac 100644 (file)
@@ -31,6 +31,7 @@ goldensTests = Framework.testGroup "Goldens tests"
         , "test3"
         , "test4"
         , "test5"
+        , "test6"
         , "if-test"
         , "if-test2"
         , "if-test3"
index 7d587cc..cb9826d 100644 (file)
@@ -114,8 +114,11 @@ fold_EN :: (a -> Expr -> a) -> a -> Insn e x -> a
 
 fold_EE f z e@(Lit _)         = f z e
 fold_EE f z e@(Var _)         = f z e
-fold_EE f z e@(Load addr)     = f (f z addr) e
-fold_EE f z e@(Binop _ e1 e2) = f (f (f z e2) e1) e
+fold_EE f z e@(Load addr)     = f (fold_EE f z addr) e
+fold_EE f z e@(Binop _ e1 e2) =
+  let afterE1 = fold_EE f z e1
+      afterE2 = fold_EE f afterE1 e2
+  in f afterE2 e
 
 fold_EN _ z (Label _)       = z
 fold_EN f z (Assign _ e)    = f z e
diff --git a/testing/tests/test6 b/testing/tests/test6
new file mode 100644 (file)
index 0000000..b6fb8b8
--- /dev/null
@@ -0,0 +1,9 @@
+-- Tests that we don't remove any of var1 as dead code.
+procName(var1, var2) {
+L0:
+  var1 = m[var2]
+  var1 = m[m[var1]]
+  var1 = m[var1 + var1]
+  var1 = m[m[var1]] - m[var1 + var1]
+  ret(var1)
+}
diff --git a/testing/tests/test6.expected b/testing/tests/test6.expected
new file mode 100644 (file)
index 0000000..813cb9a
--- /dev/null
@@ -0,0 +1,8 @@
+procName(var1, var2) {
+L0:
+  var1 = m[var2]
+  var1 = m[m[var1]]
+  var1 = m[var1 + var1]
+  var1 = m[m[var1]] - m[var1 + var1]
+  ret(var1)
+}