
#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
---------------------------------------------------------------
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