{-# LANGUAGE ScopedTypeVariables #-}
-{-# OPTIONS -Wall -fno-warn-name-shadowing #-}
module MkZipCfg
( AGraph, (<*>), emptyAGraph, withFreshLabel, withUnique
, mkMiddle, mkMiddles, mkLast, mkZTail, mkBranch, mkLabel, mkIfThenElse, mkWhileDo
-- | For the structured control-flow constructs, a condition is
-- represented as a function that takes as arguments the labels to
-- goto on truth or falsehood.
+--
+-- mkIfThenElse mk_cond then else
+-- = (mk_cond L1 L2) <*> L1: then <*> goto J
+-- <*> L2: else <*> goto J
+-- <*> J:
+--
+-- where L1, L2, J are fresh
mkIfThenElse :: (Outputable m, Outputable l, LastNode l)
=> (BlockId -> BlockId -> AGraph m l) -- branch condition
note_this_code_becomes_unreachable ::
(Monad m, LastNode l, Outputable middle, Outputable l) => ZTail middle l -> m ()
+#ifdef DEBUG
note_this_code_becomes_unreachable = u
where u (ZLast LastExit) = return ()
u (ZLast (LastOther l)) | isBranchNode l = return ()
-- Note [Branch follows branch]
u tail = fail ("unreachable code: " ++ showSDoc (ppr tail))
+#else
+note_this_code_becomes_unreachable _ = return ()
+#endif
+
{-
Note [Branch follows branch]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~