summaryrefslogtreecommitdiff
path: root/compiler/cmm/CmmImplementSwitchPlans.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cmm/CmmImplementSwitchPlans.hs')
-rw-r--r--compiler/cmm/CmmImplementSwitchPlans.hs19
1 files changed, 10 insertions, 9 deletions
diff --git a/compiler/cmm/CmmImplementSwitchPlans.hs b/compiler/cmm/CmmImplementSwitchPlans.hs
index 2e2da5d305..b24915d08b 100644
--- a/compiler/cmm/CmmImplementSwitchPlans.hs
+++ b/compiler/cmm/CmmImplementSwitchPlans.hs
@@ -41,7 +41,8 @@ visitSwitches :: DynFlags -> CmmBlock -> UniqSM [CmmBlock]
visitSwitches dflags block
| (entry@(CmmEntry _ scope), middle, CmmSwitch expr ids) <- blockSplit block
= do
- let plan = createSwitchPlan ids
+ let balanceByWeight = gopt Opt_WeightBalanceAlts dflags
+ let plan = createSwitchPlan balanceByWeight ids
(newTail, newBlocks) <- implementSwitchPlan dflags scope expr plan
@@ -57,11 +58,11 @@ visitSwitches dflags block
implementSwitchPlan :: DynFlags -> CmmTickScope -> CmmExpr -> SwitchPlan -> UniqSM (Block CmmNode O C, [CmmBlock])
implementSwitchPlan dflags scope expr = go
where
- go (Unconditionally l)
- = return (emptyBlock `blockJoinTail` CmmBranch l, [])
+ go (Unconditionally li)
+ = return (emptyBlock `blockJoinTail` CmmBranch (liLbl li), [])
go (JumpTable ids)
= return (emptyBlock `blockJoinTail` CmmSwitch expr ids, [])
- go (IfLT signed i ids1 ids2)
+ go (IfLT signed i ids1 ids2 freq)
= do
(bid1, newBlocks1) <- go' ids1
(bid2, newBlocks2) <- go' ids2
@@ -69,20 +70,20 @@ implementSwitchPlan dflags scope expr = go
let lt | signed = cmmSLtWord
| otherwise = cmmULtWord
scrut = lt dflags expr $ CmmLit $ mkWordCLit dflags i
- lastNode = CmmCondBranch scrut bid1 bid2 Nothing
+ lastNode = CmmCondBranch scrut bid1 bid2 freq
lastBlock = emptyBlock `blockJoinTail` lastNode
return (lastBlock, newBlocks1++newBlocks2)
- go (IfEqual i l ids2)
+ go (IfEqual i (l,_f) ids2 freq)
= do
(bid2, newBlocks2) <- go' ids2
- let scrut = cmmNeWord dflags expr $ CmmLit $ mkWordCLit dflags i
- lastNode = CmmCondBranch scrut bid2 l Nothing
+ let scrut = cmmEqWord dflags expr $ CmmLit $ mkWordCLit dflags i
+ lastNode = CmmCondBranch scrut l bid2 freq
lastBlock = emptyBlock `blockJoinTail` lastNode
return (lastBlock, newBlocks2)
-- Same but returning a label to branch to
- go' (Unconditionally l)
+ go' (Unconditionally (l,_f))
= return (l, [])
go' p
= do