[commit: ghc] wip/D2471: Fix binary-trees regression from unnecessary floating in CorePrep. (c2844b8)

git at git.haskell.org git at git.haskell.org
Thu Aug 25 17:54:58 UTC 2016


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/D2471
Link       : http://ghc.haskell.org/trac/ghc/changeset/c2844b81302aba41d558c0921ce461a6c9ef0f1e/ghc

>---------------------------------------------------------------

commit c2844b81302aba41d558c0921ce461a6c9ef0f1e
Author: Edward Z. Yang <ezyang at cs.stanford.edu>
Date:   Tue Aug 23 15:53:49 2016 -0700

    Fix binary-trees regression from unnecessary floating in CorePrep.
    
    Summary:
    In 0d3bf62092de83375025edca6f7242812338542d, I handled lazy @(Int -> Int) f x
    correctly, but failed to handle lazy @Int (f x) (we need
    to collect arguments in f x).
    
    Signed-off-by: Edward Z. Yang <ezyang at cs.stanford.edu>
    
    Test Plan: validate
    
    Reviewers: simonpj, nomeata, austin, bgamari
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D2471


>---------------------------------------------------------------

c2844b81302aba41d558c0921ce461a6c9ef0f1e
 compiler/coreSyn/CorePrep.hs                       | 16 ++++++++++-
 testsuite/tests/simplCore/should_compile/all.T     |  1 +
 testsuite/tests/simplCore/should_compile/par01.hs  | 10 +++++++
 .../tests/simplCore/should_compile/par01.stderr    | 33 ++++++++++++++++++++++
 4 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/compiler/coreSyn/CorePrep.hs b/compiler/coreSyn/CorePrep.hs
index 0d82be5..c7603fc 100644
--- a/compiler/coreSyn/CorePrep.hs
+++ b/compiler/coreSyn/CorePrep.hs
@@ -706,7 +706,21 @@ cpeApp top_env expr
     cpe_app env (Var f) (CpeArg Type{} : CpeArg arg : args) depth
         | f `hasKey` lazyIdKey          -- Replace (lazy a) with a, and
        || f `hasKey` noinlineIdKey      -- Replace (noinline a) with a
-        = cpe_app env arg args (depth - 1)
+        -- Consider the code:
+        --
+        --      lazy (f x) y
+        --
+        -- We need to make sure that we need to recursively collect arguments on
+        -- "f x", otherwise we'll float "f x" out (it's not a variable) and
+        -- end up with this awful -ddump-prep:
+        --
+        --      case f x of f_x {
+        --        __DEFAULT -> f_x y
+        --      }
+        --
+        -- rather than the far superior "f x y".  Test case is par01.
+        = let (terminal, args', depth') = collect_args arg
+          in cpe_app env terminal (args' ++ args) (depth + depth' - 1)
     cpe_app env (Var f) [CpeArg _runtimeRep at Type{}, CpeArg _type at Type{}, CpeArg arg] 1
         | f `hasKey` runRWKey
         -- Replace (runRW# f) by (f realWorld#), beta reducing if possible (this
diff --git a/testsuite/tests/simplCore/should_compile/all.T b/testsuite/tests/simplCore/should_compile/all.T
index 92f9af4..e2e0bb6 100644
--- a/testsuite/tests/simplCore/should_compile/all.T
+++ b/testsuite/tests/simplCore/should_compile/all.T
@@ -243,3 +243,4 @@ test('T12076sat', normal, compile, ['-O'])
 test('T12212', normal, compile, ['-O'])
 
 test('noinline01', only_ways(['optasm']), compile, ['-ddump-stg -dsuppress-uniques -O'])
+test('par01', only_ways(['optasm']), compile, ['-ddump-prep -dsuppress-uniques -O2'])
diff --git a/testsuite/tests/simplCore/should_compile/par01.hs b/testsuite/tests/simplCore/should_compile/par01.hs
new file mode 100644
index 0000000..e67fb13
--- /dev/null
+++ b/testsuite/tests/simplCore/should_compile/par01.hs
@@ -0,0 +1,10 @@
+module Par01 where
+
+import GHC.Conc
+
+-- The smoking gun in -ddump-prep is:
+--  case Par01.depth d of sat { __DEFAULT -> sat }
+-- this should never happen!
+
+depth :: Int -> Int
+depth d = d `par` depth d
diff --git a/testsuite/tests/simplCore/should_compile/par01.stderr b/testsuite/tests/simplCore/should_compile/par01.stderr
new file mode 100644
index 0000000..90d467f
--- /dev/null
+++ b/testsuite/tests/simplCore/should_compile/par01.stderr
@@ -0,0 +1,33 @@
+
+==================== CorePrep ====================
+Result size of CorePrep = {terms: 18, types: 8, coercions: 0}
+
+Rec {
+-- RHS size: {terms: 7, types: 3, coercions: 0}
+Par01.depth [Occ=LoopBreaker] :: GHC.Types.Int -> GHC.Types.Int
+[GblId, Arity=1, Caf=NoCafRefs, Str=<L,U>, Unf=OtherCon []]
+Par01.depth =
+  \ (d :: GHC.Types.Int) ->
+    case GHC.Prim.par# @ GHC.Types.Int d of { __DEFAULT ->
+    Par01.depth d
+    }
+end Rec }
+
+-- RHS size: {terms: 2, types: 0, coercions: 0}
+Par01.$trModule2 :: GHC.Types.TrName
+[GblId, Caf=NoCafRefs, Str=m1, Unf=OtherCon []]
+Par01.$trModule2 = GHC.Types.TrNameS "main"#
+
+-- RHS size: {terms: 2, types: 0, coercions: 0}
+Par01.$trModule1 :: GHC.Types.TrName
+[GblId, Caf=NoCafRefs, Str=m1, Unf=OtherCon []]
+Par01.$trModule1 = GHC.Types.TrNameS "Par01"#
+
+-- RHS size: {terms: 3, types: 0, coercions: 0}
+Par01.$trModule :: GHC.Types.Module
+[GblId, Caf=NoCafRefs, Str=m, Unf=OtherCon []]
+Par01.$trModule =
+  GHC.Types.Module Par01.$trModule2 Par01.$trModule1
+
+
+



More information about the ghc-commits mailing list