diff options
Diffstat (limited to 'compiler/cmm/PprCmm.hs')
-rw-r--r-- | compiler/cmm/PprCmm.hs | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/compiler/cmm/PprCmm.hs b/compiler/cmm/PprCmm.hs index 9d9f3081dc..d5999f53fa 100644 --- a/compiler/cmm/PprCmm.hs +++ b/compiler/cmm/PprCmm.hs @@ -43,6 +43,7 @@ import BlockId () import CLabel import Cmm import CmmUtils +import CmmSwitch import DynFlags import FastString import Outputable @@ -228,25 +229,31 @@ pprNode node = pp_node <+> pp_debug , ppr f <> semi ] - CmmSwitch expr maybe_ids -> - hang (hcat [ ptext (sLit "switch [0 .. ") - , int (length maybe_ids - 1) - , ptext (sLit "] ") + CmmSwitch expr ids -> + hang (hsep [ ptext (sLit "switch") + , range , if isTrivialCmmExpr expr then ppr expr else parens (ppr expr) - , ptext (sLit " {") + , ptext (sLit "{") ]) - 4 (vcat ( map caseify pairs )) $$ rbrace - where pairs = groupBy snds (zip [0 .. ] maybe_ids ) - snds a b = (snd a) == (snd b) - caseify ixs@((_,Nothing):_) = ptext (sLit "/* impossible: ") - <> hcat (intersperse comma (map (int.fst) ixs)) <> ptext (sLit " */") - caseify as = let (is,ids) = unzip as - in hsep [ ptext (sLit "case") - , hcat (punctuate comma (map int is)) - , ptext (sLit ": goto") - , ppr (head [ id | Just id <- ids]) <> semi ] + 4 (vcat (map ppCase cases) $$ def) $$ rbrace + where + (cases, mbdef) = switchTargetsFallThrough ids + ppCase (is,l) = hsep + [ ptext (sLit "case") + , commafy $ map integer is + , ptext (sLit ": goto") + , ppr l <> semi + ] + def | Just l <- mbdef = hsep + [ ptext (sLit "default: goto") + , ppr l <> semi + ] + | otherwise = empty + + range = brackets $ hsep [integer lo, ptext (sLit ".."), integer hi] + where (lo,hi) = switchTargetsRange ids CmmCall tgt k regs out res updfr_off -> hcat [ ptext (sLit "call"), space |