fiExpr dflags to_drop lam@(_, AnnLam _ _)
  | okToFloatInside bndrs       -- Float in
     -- NB: Must line up with noFloatIntoRhs (AnnLam...); see Trac #7088
  = mkLams bndrs (fiExpr dflags to_drop body)

  | otherwise           -- Dump it all here
  = wrapFloats to_drop (mkLams bndrs (fiExpr dflags [] body))

  where
    (bndrs, body) = collectAnnBndrs lam

{-
We don't float lets inwards past an SCC.
        ToDo: keep info on current cc, and when passing
        one, if it is not the same, annotate all lets in binds with current
        cc, change current cc to the new one and float binds into expr.
-}
fiExpr dflags to_drop lam@(_, AnnLam _ _)
  | okToFloatInside bndrs       -- Float in
     -- NB: Must line up with noFloatIntoRhs (AnnLam...); see Trac #7088
  = mkLams bndrs (fiExpr dflags to_drop body)

  | otherwise           -- Dump it all here
  = wrapFloats to_drop (mkLams bndrs (fiExpr dflags [] body))

  where
    (bndrs, body) = collectAnnBndrs lam

{-
We don't float lets inwards past an SCC.
        ToDo: keep info on current cc, and when passing
        one, if it is not the same, annotate all lets in binds with current
        cc, change current cc to the new one and float binds into expr.
-}
fiExpr dflags to_drop lam@(_, AnnLam _ _)
  | okToFloatInside bndrs       -- Float in
     -- NB: Must line up with noFloatIntoRhs (AnnLam...); see Trac #7088
  = mkLams bndrs (fiExpr dflags to_drop body)

  | otherwise           -- Dump it all here
  = wrapFloats to_drop (mkLams bndrs (fiExpr dflags [] body))

  where
    (bndrs, body) = collectAnnBndrs lam

{-
We don't float lets inwards past an SCC.
        ToDo: keep info on current cc, and when passing
        one, if it is not the same, annotate all lets in binds with current
        cc, change current cc to the new one and float binds into expr.
-}