- replace_eid (G.LGraph eid blocks) = G.LGraph (lookup eid) blocks
- last (LastBranch id) = LastBranch (lookup id)
- last (LastCondBranch e ti fi) = LastCondBranch e (lookup ti) (lookup fi)
- last (LastSwitch e tbl) = LastSwitch e (map (fmap lookup) tbl)
- last (LastCall tgt (Just id)) = LastCall tgt (Just $ lookup id)
- last exit_jump_return = exit_jump_return
- lookup id = lookupBlockEnv env id `orElse` id
+ replace_eid (G.LGraph eid off blocks) = G.LGraph (lookup eid) off blocks
+ middle = mapExpDeepMiddle exp
+ last l = mapExpDeepLast exp (last' l)
+ last' (LastBranch bid) = LastBranch (lookup bid)
+ last' (LastCondBranch p t f) = LastCondBranch p (lookup t) (lookup f)
+ last' (LastSwitch e arms) = LastSwitch e (map (liftM lookup) arms)
+ last' (LastCall t k a r) = LastCall t (liftM lookup k) a r
+ exp (CmmLit (CmmBlock bid)) = CmmLit (CmmBlock (lookup bid))
+ exp (CmmStackSlot (CallArea (Young id)) i) =
+ CmmStackSlot (CallArea (Young (lookup id))) i
+ exp e = e
+ lookup id = fmap lookup (lookupBlockEnv env id) `orElse` id
+
+replaceBranches :: BlockEnv BlockId -> CmmGraph -> CmmGraph
+replaceBranches env g = map_nodes id id last g
+ where
+ last (LastBranch id) = LastBranch (lookup id)
+ last (LastCondBranch e ti fi) = LastCondBranch e (lookup ti) (lookup fi)
+ last (LastSwitch e tbl) = LastSwitch e (map (fmap lookup) tbl)
+ last l@(LastCall {}) = l
+ lookup id = fmap lookup (lookupBlockEnv env id) `orElse` id