From 194eb4bbf6a96d08fee652e244dfc31685abf10e Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Fri, 18 Jan 2008 17:17:54 +0000 Subject: [PATCH] Wibble to SetLevels.abstractVars I've gotten this wrong more than once. Hopefully this has it nailed. The issue is that in float-out we must abstract over the correct variables. --- compiler/simplCore/FloatOut.lhs | 2 +- compiler/simplCore/SetLevels.lhs | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/compiler/simplCore/FloatOut.lhs b/compiler/simplCore/FloatOut.lhs index 7cac08d..e6e8b7a 100644 --- a/compiler/simplCore/FloatOut.lhs +++ b/compiler/simplCore/FloatOut.lhs @@ -322,7 +322,7 @@ floatExpr lvl (Note InlineMe expr) -- Other than SCCs -- them into floating_defns (which would mean testing for -- inlineCtxt at every let) (fs, [], Note InlineMe (install floating_defns expr')) } - -- See Note [FloatOut inside INLINE] + -- See Note [FloatOut inside INLINE] in SetLevels -- I'm guessing that floating_dens should be empty floatExpr lvl (Note note expr) -- Other than SCCs diff --git a/compiler/simplCore/SetLevels.lhs b/compiler/simplCore/SetLevels.lhs index 020ed71..8be8dd6 100644 --- a/compiler/simplCore/SetLevels.lhs +++ b/compiler/simplCore/SetLevels.lhs @@ -669,8 +669,8 @@ type LevelEnv = (FloatOutSwitches, -- We also use these envs when making a variable polymorphic -- because we want to float it out past a big lambda. -- - -- The SubstEnv and IdEnv always implement the same mapping, but the - -- SubstEnv maps to CoreExpr and the IdEnv to LevelledExpr + -- The Subst and IdEnv always implement the same mapping, but the + -- Subst maps to CoreExpr and the IdEnv to LevelledExpr -- Since the range is always a variable or type application, -- there is never any difference between the two, but sadly -- the types differ. The SubstEnv is used when substituting in @@ -774,9 +774,11 @@ abstractVars :: Level -> LevelEnv -> VarSet -> [Var] -- These are the ones we are going to abstract out abstractVars dest_lvl (_, lvl_env, _, id_env) fvs = map zap $ uniq $ sortLe le - [var | fv <- varSetElems fvs - , var <- absVarsOf id_env fv - , abstract_me var] + [var | fv <- varSetElems fvs + , var <- absVarsOf id_env fv + , abstract_me var ] + -- NB: it's important to call abstract_me only on the OutIds the + -- come from absVarsOf (not on fv, which is an InId) where -- Sort the variables so the true type variables come first; -- the tyvars scope over Ids and coercion vars -- 1.7.10.4