FloatOut: Float to top-level only vs. floating iff there are no free variables
This is the config record for FloatOut:
data FloatOutSwitches = FloatOutSwitches {
floatOutLambdas :: Maybe Int, -- ^ Just n <=> float lambdas to top level, if
-- doing so will abstract over n or fewer
-- value variables
-- Nothing <=> float all lambdas to top level,
-- regardless of how many free variables
-- Just 0 is the vanilla case: float a lambda
-- iff it has no free vars
...
floatToTopLevelOnly :: Bool -- ^ Allow floating to the top level only.
}
I wonder what the difference is between floatOutLambdas = Just 0 and floatToTopLevelOnly = True. Perhaps it is relevant when the RHS of a freely floatable binding has unlifted type? When would we ever float that? Puzzling.
We seem to use floatToTopLevelOnly for static pointer floating exclusively.