Fix faulty substitutions in StgCse (#11532).
authorklebinger.andreas@gmx.at <klebinger.andreas@gmx.at>
Tue, 2 Apr 2019 12:20:12 +0000 (14:20 +0200)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Wed, 3 Apr 2019 04:34:57 +0000 (00:34 -0400)
`substBndr` should rename bindings which shadow existing ids.
However while it was renaming the bindings it was not adding proper substitutions
for renamed bindings.
Instead of adding a substitution of the form `old -> new` for renamed
bindings it mistakenly added `old -> old` if no replacement had taken
place while adding none if `old` had been renamed.

As a byproduct this should improve performance, as we no longer add
useless substitutions for unshadowed bindings.

compiler/simplStg/StgCse.hs

index 386515e..269738e 100644 (file)
@@ -245,8 +245,8 @@ substBndr env old_id
     new_id = uniqAway (ce_in_scope env) old_id
     no_change = new_id == old_id
     env' = env { ce_in_scope = ce_in_scope env `extendInScopeSet` new_id }
-    new_env | no_change = env' { ce_subst = extendVarEnv (ce_subst env) old_id new_id }
-            | otherwise = env'
+    new_env | no_change = env'
+            | otherwise = env' { ce_subst = extendVarEnv (ce_subst env) old_id new_id }
 
 substBndrs :: CseEnv -> [InVar] -> (CseEnv, [OutVar])
 substBndrs env bndrs = mapAccumL substBndr env bndrs