From 71d0e9a03797a194209cb61b7f75c2e1c8ddf237 Mon Sep 17 00:00:00 2001 From: Roman Leshchinskiy Date: Sat, 27 Nov 2010 12:50:25 +0000 Subject: [PATCH] Inherit the ForceSpecConstr flag in non-recursive nested bindings This makes sure that join points are fully specialised in loops which are marked as ForceSpecConstr. --- compiler/specialise/SpecConstr.lhs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/compiler/specialise/SpecConstr.lhs b/compiler/specialise/SpecConstr.lhs index 0b61a57..3c84d3a 100644 --- a/compiler/specialise/SpecConstr.lhs +++ b/compiler/specialise/SpecConstr.lhs @@ -452,6 +452,10 @@ sc_force to True when calling specLoop. This flag does three things: * Specialise even for arguments that are not scrutinised in the loop (see argToPat; Trac #4488) +This flag is inherited for nested non-recursive bindings (which are likely to +be join points and hence should be fully specialised) but reset for nested +recursive bindings. + What alternatives did I consider? Annotating the loop itself doesn't work because (a) it is local and (b) it will be w/w'ed and I having w/w propagating annotation somehow doesn't seem like a good idea. The @@ -1041,11 +1045,9 @@ scExpr' env (Let (NonRec bndr rhs) body) ; (body_usg, body') <- scExpr body_env3 body - -- NB: We don't use the ForceSpecConstr mechanism (see - -- Note [Forcing specialisation]) for non-recursive bindings - -- at the moment. I'm not sure if this is the right thing to do. - ; let env' = scForce env False - ; (spec_usg, specs) <- specialise env' + -- NB: For non-recursive bindings we inherit sc_force flag from + -- the parent function (see Note [Forcing specialisation]) + ; (spec_usg, specs) <- specialise env (scu_calls body_usg) rhs_info (SI [] 0 (Just rhs_usg)) -- 1.7.10.4