summaryrefslogtreecommitdiff
path: root/testsuite/tests/eyeball/dead1.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/eyeball/dead1.hs')
-rw-r--r--testsuite/tests/eyeball/dead1.hs42
1 files changed, 42 insertions, 0 deletions
diff --git a/testsuite/tests/eyeball/dead1.hs b/testsuite/tests/eyeball/dead1.hs
new file mode 100644
index 0000000000..108dc8491b
--- /dev/null
+++ b/testsuite/tests/eyeball/dead1.hs
@@ -0,0 +1,42 @@
+{-# OPTIONS -fglasgow-exts -O -ddump-stranal #-}
+
+module Foo(foo) where
+
+foo :: Int -> Int
+foo n = baz (n+1) (bar1 n)
+
+{-# NOINLINE bar1 #-}
+bar1 n = 1 + bar n
+
+bar :: Int -> Int
+{-# NOINLINE bar #-}
+{-# RULES
+"bar/foo" forall n. bar (foo n) = n
+ #-}
+bar n = n-1
+
+baz :: Int -> Int -> Int
+{-# INLINE [0] baz #-}
+baz m n = m
+
+
+{- Ronam writes (Feb08)
+
+ Note that bar becomes dead as soon as baz gets inlined. But strangely,
+ the simplifier only deletes it after full laziness and CSE. That is, it
+ is not deleted in the phase in which baz gets inlined. In fact, it is
+ still there after w/w and the subsequent simplifier run. It gets deleted
+ immediately if I comment out the rule.
+
+ I stumbled over this when I removed one simplifier run after SpecConstr
+ (at the moment, it runs twice at the end but I don't think that should
+ be necessary). With this change, the original version of a specialised
+ loop (the one with the rules) is not longer deleted even if it isn't
+ used any more. I'll reenable the second simplifier run for now but
+ should this really be necessary?
+
+No, it should not be necessary. A refactoring in OccurAnal makes
+this work right. Look at the simplifier output just before strictness
+analysis; there should be a binding for 'foo', but for nothing else.
+
+-}