summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2022-01-20 14:32:00 +0100
committerJoachim Breitner <mail@joachim-breitner.de>2022-01-21 10:33:06 +0100
commitc1e346634a3b578b48bb45f45f0d3f96ce04deae (patch)
tree97c6c02e39e155037520a0193769c1dae4201fc2
parent3b009e1a6247057ff976043695b797b5d0649414 (diff)
downloadhaskell-wip/joachim/prepareBinding-floats-fix.tar.gz
Simplifier: Do the right thing if doFloatFromRhs = Falsewip/joachim/prepareBinding-floats-fix
If `doFloatFromRhs` is `False` then the result from `prepareBinding` should not be used. Previously it was in ways that are silly (but not completly wrong, as the simplifier would clean that up again, so no test case). This was spotted by Simon during a phone call. Fixes #20976
-rw-r--r--compiler/GHC/Core/Opt/Simplify.hs14
1 files changed, 7 insertions, 7 deletions
diff --git a/compiler/GHC/Core/Opt/Simplify.hs b/compiler/GHC/Core/Opt/Simplify.hs
index b21d931c25..4c60bd3669 100644
--- a/compiler/GHC/Core/Opt/Simplify.hs
+++ b/compiler/GHC/Core/Opt/Simplify.hs
@@ -370,8 +370,8 @@ simplLazyBind env top_lvl is_rec bndr bndr1 rhs rhs_se
; (rhs_floats, body3)
<- if not (doFloatFromRhs top_lvl is_rec False body_floats2 body2)
- then -- No floating, revert to body1
- return (emptyFloats env, wrapFloats body_floats2 body1)
+ then -- Do not float; abandon prepareBinding entirely and revert to body1
+ return (emptyFloats env, wrapFloats body_floats1 body1)
else if null tvs then -- Simple floating
{-#SCC "simplLazyBind-simple-floating" #-}
@@ -450,15 +450,15 @@ completeNonRecX :: TopLevelFlag -> SimplEnv
completeNonRecX top_lvl env is_strict old_bndr new_bndr new_rhs
= assertPpr (not (isJoinId new_bndr)) (ppr new_bndr) $
- do { (prepd_floats, new_rhs) <- prepareBinding env top_lvl new_bndr new_rhs
+ do { (prepd_floats, prepd_rhs) <- prepareBinding env top_lvl new_bndr new_rhs
; let floats = emptyFloats env `addLetFloats` prepd_floats
; (rhs_floats, rhs2) <-
- if doFloatFromRhs NotTopLevel NonRecursive is_strict floats new_rhs
+ if doFloatFromRhs NotTopLevel NonRecursive is_strict floats prepd_rhs
then -- Add the floats to the main env
do { tick LetFloatFromLet
- ; return (floats, new_rhs) }
- else -- Do not float; wrap the floats around the RHS
- return (emptyFloats env, wrapFloats floats new_rhs)
+ ; return (floats, prepd_rhs) }
+ else -- Do not float; abandon prepareBinding entirely and revert to new_rhs
+ return (emptyFloats env, new_rhs)
; (bind_float, env2) <- completeBind (env `setInScopeFromF` rhs_floats)
NotTopLevel Nothing