[GHC] #11731: Simplifier: Inlining trivial let can lose sharing
GHC
ghc-devs at haskell.org
Wed Mar 30 11:27:34 UTC 2016
#11731: Simplifier: Inlining trivial let can lose sharing
-------------------------------------+-------------------------------------
Reporter: nomeata | Owner:
Type: bug | Status: patch
Priority: normal | Milestone:
Component: Compiler | Version: 8.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D2064
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
For the record, here is the proposed fix (currently on a wip branch):
{{{
commit 7ac5610606e8f338cd2eb92eb5d711e054d9d55a
Author: Joachim Breitner <mail at joachim-breitner.de>
Date: Wed Mar 30 12:55:10 2016 +0200
Used-once variables are not trivial
The specification for exprIsTrivial demands that we are
unconditionally
happy to duplicate the expression. This is not true for variables
where
we would like to exploit (or already have exploited) that they are
used
at most once. In order to preserve this property, they must not be
duplicated nilly-willy. This fixes #11731 and comes with a test case.
>---------------------------------------------------------------
7ac5610606e8f338cd2eb92eb5d711e054d9d55a
compiler/coreSyn/CoreUtils.hs | 12 +++++++-
testsuite/.gitignore | 1 +
testsuite/tests/simplCore/should_run/T11731.hs | 36
++++++++++++++++++++++
testsuite/tests/simplCore/should_run/T11731.stderr | 1 +
testsuite/tests/simplCore/should_run/all.T | 1 +
5 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/compiler/coreSyn/CoreUtils.hs b/compiler/coreSyn/CoreUtils.hs
index 1d9b83b..d02b934 100644
--- a/compiler/coreSyn/CoreUtils.hs
+++ b/compiler/coreSyn/CoreUtils.hs
@@ -62,6 +62,7 @@ import DataCon
import PrimOp
import Id
import IdInfo
+import Demand ( isUsedOnce )
import Type
import Coercion
import TyCon
@@ -755,6 +756,13 @@ Note [exprIsTrivial]
Note [Variables are trivial]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Variables are usually trivial.
+
+Except if 'isUsedOnce (idDemandInfo v) == True':
+In this case we have previously determined that a variable is used at
+most once, and we likely rely on this information, e.g. during code
+generation. In this case, we are not unconditionally happy to duplicate,
so we don’t. See #11731.
+
There used to be a gruesome test for (hasNoBinding v) in the Var case:
exprIsTrivial (Var v) | hasNoBinding v = idArity v == 0 @@ -793,7
+801,9 @@ it off at source.
-}
exprIsTrivial :: CoreExpr -> Bool
-exprIsTrivial (Var _) = True -- See Note [Variables are
trivial]
+exprIsTrivial (Var v) -- See Note [Variables are trivial]
+ | isUsedOnce (idDemandInfo v) = False
+ | otherwise = True
exprIsTrivial (Type _) = True
exprIsTrivial (Coercion _) = True
exprIsTrivial (Lit lit) = litIsTrivial lit
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11731#comment:16>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list