This patch peels off the dominant case in switch statement into a branch. This avoids the extra compares when lowering the switch statement into chain of branches in binary search tree style.
For a switch statement like the following:
switch (i) { case 8: s1; break; case -8826: s2; break; case 18312: s3; break; case 18568: s4; break; case 129: s5; break; }
The lowering generates the following coe
- BB#0: # %entry cmpl $128, %edi jg .LBB0_4
- BB#1: # %entry movl $1, %eax cmpl $8, %edi jne .LBB0_2
- BB#10: # %return retq
.LBB0_4: # %entry
cmpl $129, %edi
Here the coml to $128 is extra. This is happening even if i==8 target has only non-zero branch-weights. Like !{!"branch_weights", i32 0, i32 100000, i32 0, i32 0, i32 0, i32 0}
This patch would peel i==8 into a branch and keep the rest in the switch statement.
I don't think we should do this if SwitchToLookupTable (the call below) can turn the swich into a lookup instead.
In fact, I don't think this should be done at the IR level at all, since it's more of a switch lowering issue. SelectionDAGBuilder::visitSwitch() would be a better place.
That code already takes case weights into account, and when lowering to a binary search tree, it will balance it based on weight, favoring cases that are hot. Do you find that that's not sufficient? (I'm willing to believe that's the case, but I'd like to see it argued.)