- LastJump expr params -> endblock $ CmmJump expr params
- LastReturn params -> endblock $ CmmReturn params
- LastSwitch arg ids -> endblock $ CmmSwitch arg $ ids
- LastCall tgt args Nothing ->
- endblock $ CmmCall tgt [] args CmmUnsafe CmmNeverReturns
- LastCall tgt args (Just k)
- | G.Block id' (G.ZTail (CopyIn _ ress srt) t) : bs <- n,
- id' == k, unique_pred k ->
- let call = CmmCall tgt ress args (CmmSafe srt) CmmMayReturn
- in tail id (call : prev') t bs
- | G.Block id' t : bs <- n, id' == k, unique_pred k ->
- let (ress, srt) = findCopyIn t
- call = CmmCall tgt ress args (CmmSafe srt) CmmMayReturn
- delayed = scomment "delayed CopyIn follows previous call"
- in tail id (delayed : call : prev') t bs
- | otherwise -> panic "unrepairable call"
+ LastJump expr -> endblock $ with_out out $ CmmJump expr
+ LastReturn -> endblock $ with_out out $ CmmReturn
+ LastSwitch arg ids -> endblock $ CmmSwitch arg $ ids
+ LastCall e cont
+ | Just (conv, args) <- out
+ -> let tgt = CmmCallee e (conv_to_cconv conv) in
+ case cont of
+ Nothing ->
+ endblock $ CmmCall tgt [] args CmmUnsafe CmmNeverReturns
+ Just k
+ | G.Block id' (G.ZTail (CopyIn _ ress srt) t) : bs <- n,
+ id' == k, unique_pred k
+ -> let call = CmmCall tgt ress args (CmmSafe srt) CmmMayReturn
+ in tail id (call : prev') Nothing t bs
+ | G.Block id' t : bs <- n, id' == k, unique_pred k
+ -> let (ress, srt) = findCopyIn t
+ call = CmmCall tgt ress args (CmmSafe srt) CmmMayReturn
+ delayed = scomment "delayed CopyIn follows prev. call"
+ in tail id (delayed : call : prev') Nothing t bs
+ | otherwise -> panic "unrepairable call"
+ | otherwise -> panic "call with no CopyOut"
+ with_out (Just (_conv, actuals)) f = f actuals
+ with_out Nothing f = pprPanic "unrepairable data flow to" (ppr $ f [])