Avoid printing uniques in specialization rules
authorJoachim Breitner <mail@joachim-breitner.de>
Fri, 17 Oct 2014 09:09:16 +0000 (11:09 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Fri, 17 Oct 2014 13:37:17 +0000 (15:37 +0200)
Akio found an avoidable cause of non-determinisim: The names of RULES
generated by Specialise had uniques in them:
    "SPEC $cshowsPrec_a2QX @ [GHC.Types.Char]" [ALWAYS] forall ...
By using showSDocForUser instead of showSDocDump when building the rule
name, this is avoided:
    "SPEC $cshowsPrec @ [Char]" [ALWAYS] forall ...
See #4012, comments 61ff.

compiler/specialise/Specialise.lhs
testsuite/tests/simplCore/should_compile/T6056.stderr
testsuite/tests/simplCore/should_compile/T7785.stderr
testsuite/tests/simplCore/should_compile/T8848.stderr

index 09acd70..bc04e06 100644 (file)
@@ -1196,8 +1196,12 @@ specCalls mb_mod env rules_for_me calls_for_me fn rhs
                            Just this_mod  -- Specialising imoprted fn
                                -> ptext (sLit "SPEC/") <> ppr this_mod
 
-                rule_name = mkFastString $ showSDocDump dflags $
+                rule_name = mkFastString $ showSDocForUser dflags neverQualify $
                             herald <+> ppr fn <+> hsep (map ppr_call_key_ty call_ts)
+                            -- This name ends up in interface files, so use showSDocForUser,
+                            -- otherwise uniques end up there, making builds
+                            -- less deterministic (See #4012 comment:61 ff)
+
                 spec_env_rule = mkRule True {- Auto generated -} is_local
                                   rule_name
                                   inl_act       -- Note [Auto-specialisation and RULES]
index d1ae187..b38e34d 100644 (file)
@@ -1,20 +1,12 @@
 Rule fired: foldr/nil
 Rule fired: foldr/nil
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Integer.Type.Integer
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Types.Int
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Integer
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Int
 Rule fired: Class op <
 Rule fired: Class op <
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Integer.Type.Integer
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Integer.Type.Integer
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Types.Int
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Types.Int
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Integer.Type.Integer
-Rule fired:
-    SPEC/main@main:T6056 T6056a.$wsmallerAndRest @ GHC.Types.Int
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Integer
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Integer
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Int
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Int
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Int
+Rule fired: SPEC/T6056 $wsmallerAndRest @ Integer
index c80738f..db80b99 100644 (file)
@@ -1,6 +1,6 @@
 
 ==================== Tidy Core rules ====================
-"SPEC Foo.shared @ []" [ALWAYS]
+"SPEC shared @ []" [ALWAYS]
     forall ($dMyFunctor :: MyFunctor []) (irred :: Domain [] Int).
       shared @ [] $dMyFunctor irred
       = bar_$sshared
index ba77c46..dad6b17 100644 (file)
@@ -16,13 +16,11 @@ Rule fired: Class op <*>
 Rule fired: Class op $p1Applicative
 Rule fired: Class op fmap
 Rule fired: Class op <*>
-Rule fired:
-    SPEC/main@main:T8848 GHC.Base.liftA2 _ _ _ @ (T8848.Shape 'T8848.Z)
+Rule fired: SPEC/T8848 liftA2 _ _ _ @ (Shape 'Z)
 Rule fired: Class op $p1Applicative
 Rule fired: Class op fmap
 Rule fired: Class op <*>
-Rule fired:
-    SPEC/main@main:T8848 GHC.Base.liftA2 _ _ _ @ (T8848.Shape 'T8848.Z)
+Rule fired: SPEC/T8848 liftA2 _ _ _ @ (Shape 'Z)
 Rule fired: Class op $p1Applicative
 Rule fired: Class op fmap
 Rule fired: Class op <*>
@@ -31,13 +29,13 @@ Rule fired: Class op fmap
 Rule fired: Class op <*>
 Rule fired: Class op fmap
 Rule fired: Class op fmap
-Rule fired: SPEC $cfmap @ 'T8848.Z
-Rule fired: SPEC $c<$ @ 'T8848.Z
-Rule fired: SPEC T8848.$fFunctorShape @ 'T8848.Z
+Rule fired: SPEC $cfmap @ 'Z
+Rule fired: SPEC $c<$ @ 'Z
+Rule fired: SPEC $fFunctorShape @ 'Z
 Rule fired: Class op fmap
 Rule fired: Class op fmap
-Rule fired: SPEC $c<$ @ 'T8848.Z
-Rule fired: SPEC T8848.$fFunctorShape @ 'T8848.Z
-Rule fired: SPEC T8848.$fFunctorShape @ 'T8848.Z
+Rule fired: SPEC $c<$ @ 'Z
+Rule fired: SPEC $fFunctorShape @ 'Z
+Rule fired: SPEC $fFunctorShape @ 'Z
 Rule fired: Class op fmap
 Rule fired: Class op fmap