Missing substitution in the simplifier?
When creating a binding (in the function completeBind
), we simplify the unfolding in the binder before making a float (in the case we don't inline anyway). However, it seems that the newly obtained final_bndr
is not substituted:
; let final_bndr = addLetBndrInfo new_bndr new_arity is_bot new_unfolding
; if postInlineUnconditionally env top_lvl final_bndr occ_info final_rhs
then […] -- abbreviated
else -- Keep the binding
-- pprTrace "Binding" (ppr final_bndr <+> ppr new_unfolding) $
return (mkFloatBind env (NonRec final_bndr final_rhs)) }
(See in full context here)
This is awfully suspicious: the new_arity
and the new_unfolding
will, I understand, not be available at the binder's use sites (which is where they are to be used).
I don't know how to make evidence of the suspected bad behaviour. And maybe I'm just missing something, and everything is actually fine here.