Levity polymorphic expressions mustn't be floated-out in let-bindings.
authorSylvain Henry <sylvain@haskus.fr>
Thu, 1 Dec 2016 17:24:34 +0000 (12:24 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 1 Dec 2016 17:24:35 +0000 (12:24 -0500)
Reviewers: simonpj, austin, bgamari

Reviewed By: simonpj, bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2769

GHC Trac Issues: #12901

compiler/simplCore/SetLevels.hs

index f2f373d..dc36a6c 100644 (file)
@@ -83,6 +83,7 @@ import Demand           ( StrictSig )
 import Name             ( getOccName, mkSystemVarName )
 import OccName          ( occNameString )
 import Type             ( isUnliftedType, Type, mkLamTypes )
+import Kind             ( isLevityPolymorphic, typeKind )
 import BasicTypes       ( Arity, RecFlag(..) )
 import UniqSupply
 import Util
@@ -487,6 +488,9 @@ lvlMFE strict_ctxt env ann_expr
          -- Can't let-bind it; see Note [Unlifted MFEs]
          -- This includes coercions, which we don't want to float anyway
          -- NB: no need to substitute cos isUnliftedType doesn't change
+  || isLevityPolymorphic (typeKind (exprType expr))
+         -- We can't let-bind levity polymorphic expressions
+         -- See Note [Levity polymorphism invariants] in CoreSyn
   || notWorthFloating ann_expr abs_vars
   || not float_me
   =     -- Don't float it out