Mark retry# as returning bottom.
authorAustin Seipp <aseipp@pobox.com>
Sun, 11 Aug 2013 03:39:15 +0000 (22:39 -0500)
committerAustin Seipp <aseipp@pobox.com>
Sun, 11 Aug 2013 04:12:27 +0000 (23:12 -0500)
This change helps the simplifier eliminate unreachable code, since
retry# technically doesn't return.

This closes ticket #8091.

Authored-by: Patrick Palka <patrick@parcs.ath.cx>
Signed-off-by: Austin Seipp <aseipp@pobox.com>
compiler/prelude/primops.txt.pp

index 3d3518b..0c325a6 100644 (file)
@@ -1611,9 +1611,24 @@ primop   AtomicallyOp "atomically#" GenPrimOp
    out_of_line = True
    has_side_effects = True
 
+-- NB: retry#'s strictness information specifies it to return bottom.
+-- This lets the compiler perform some extra simplifications, since retry#
+-- will technically never return.
+--
+-- This allows the simplifier to replace things like:
+--
+--   case retry# s1
+--     (# s2, a #) -> e
+--
+-- with:
+--
+--   retry# s1
+--
+-- where 'e' would be unreachable anyway.
 primop  RetryOp "retry#" GenPrimOp
    State# RealWorld -> (# State# RealWorld, a #)
    with 
+   strictness  = { \ _arity -> mkStrictSig (mkTopDmdType [topDmd] botRes) }
    out_of_line = True
    has_side_effects = True