1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -jump-table-density=40 -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -O0 -jump-table-density=40 -verify-machineinstrs | FileCheck --check-prefix=NOOPT %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare void @g(i32) 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @basic(i32 %x) { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 9*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 10*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 11*9880d681SAndroid Build Coastguard Worker i32 4, label %bb1 12*9880d681SAndroid Build Coastguard Worker i32 5, label %bb2 13*9880d681SAndroid Build Coastguard Worker ] 14*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 15*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 16*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 1) br label %return 17*9880d681SAndroid Build Coastguard Workerreturn: ret void 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; Lowered as a jump table, both with and without optimization. 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: basic 21*9880d681SAndroid Build Coastguard Worker; CHECK: decl 22*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $4 23*9880d681SAndroid Build Coastguard Worker; CHECK: ja 24*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 25*9880d681SAndroid Build Coastguard Worker; NOOPT-LABEL: basic 26*9880d681SAndroid Build Coastguard Worker; NOOPT: decl 27*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $4 28*9880d681SAndroid Build Coastguard Worker; NOOPT: ja 29*9880d681SAndroid Build Coastguard Worker; NOOPT: movq .LJTI 30*9880d681SAndroid Build Coastguard Worker; NOOPT: jmpq 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; Should never be lowered as a jump table because of the attribute 34*9880d681SAndroid Build Coastguard Workerdefine void @basic_nojumptable(i32 %x) "no-jump-tables"="true" { 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 37*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 38*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 39*9880d681SAndroid Build Coastguard Worker i32 4, label %bb1 40*9880d681SAndroid Build Coastguard Worker i32 5, label %bb2 41*9880d681SAndroid Build Coastguard Worker ] 42*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 43*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 44*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 1) br label %return 45*9880d681SAndroid Build Coastguard Workerreturn: ret void 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; Lowered as a jump table, both with and without optimization. 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: basic_nojumptable 49*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: jmpq *.LJTI 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; Should be lowered as a jump table because of the attribute 53*9880d681SAndroid Build Coastguard Workerdefine void @basic_nojumptable_false(i32 %x) "no-jump-tables"="false" { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 56*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 57*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 58*9880d681SAndroid Build Coastguard Worker i32 4, label %bb1 59*9880d681SAndroid Build Coastguard Worker i32 5, label %bb2 60*9880d681SAndroid Build Coastguard Worker ] 61*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 62*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 63*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 1) br label %return 64*9880d681SAndroid Build Coastguard Workerreturn: ret void 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; Lowered as a jump table, both with and without optimization. 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: basic_nojumptable_false 68*9880d681SAndroid Build Coastguard Worker; CHECK: decl 69*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $4 70*9880d681SAndroid Build Coastguard Worker; CHECK: ja 71*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine void @simple_ranges(i32 %x) { 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 78*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 79*9880d681SAndroid Build Coastguard Worker i32 1, label %bb0 80*9880d681SAndroid Build Coastguard Worker i32 2, label %bb0 81*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 82*9880d681SAndroid Build Coastguard Worker i32 100, label %bb1 83*9880d681SAndroid Build Coastguard Worker i32 101, label %bb1 84*9880d681SAndroid Build Coastguard Worker i32 102, label %bb1 85*9880d681SAndroid Build Coastguard Worker i32 103, label %bb1 86*9880d681SAndroid Build Coastguard Worker ] 87*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 88*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 89*9880d681SAndroid Build Coastguard Workerreturn: ret void 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; Should be lowered to two range checks. 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: simple_ranges 95*9880d681SAndroid Build Coastguard Worker; CHECK: leal -100 96*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $4 97*9880d681SAndroid Build Coastguard Worker; CHECK: jb 98*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $3 99*9880d681SAndroid Build Coastguard Worker; CHECK: ja 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; We do this even at -O0, because it's cheap and makes codegen faster. 102*9880d681SAndroid Build Coastguard Worker; NOOPT-LABEL: simple_ranges 103*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $4 104*9880d681SAndroid Build Coastguard Worker; NOOPT: jb 105*9880d681SAndroid Build Coastguard Worker; NOOPT: addl $-100 106*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $4 107*9880d681SAndroid Build Coastguard Worker; NOOPT: jb 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine void @jt_is_better(i32 %x) { 112*9880d681SAndroid Build Coastguard Workerentry: 113*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 114*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 115*9880d681SAndroid Build Coastguard Worker i32 2, label %bb0 116*9880d681SAndroid Build Coastguard Worker i32 4, label %bb0 117*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 118*9880d681SAndroid Build Coastguard Worker i32 3, label %bb1 119*9880d681SAndroid Build Coastguard Worker i32 5, label %bb1 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker i32 6, label %bb2 122*9880d681SAndroid Build Coastguard Worker i32 7, label %bb3 123*9880d681SAndroid Build Coastguard Worker i32 8, label %bb4 124*9880d681SAndroid Build Coastguard Worker ] 125*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 126*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 127*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 128*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 129*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 130*9880d681SAndroid Build Coastguard Workerreturn: ret void 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; Cases 0-5 could be lowered with two bit tests, 133*9880d681SAndroid Build Coastguard Worker; but with 6-8, the whole switch is suitable for a jump table. 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: jt_is_better 135*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $8 136*9880d681SAndroid Build Coastguard Worker; CHECK: ja 137*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine void @bt_is_better(i32 %x) { 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 144*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 145*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 146*9880d681SAndroid Build Coastguard Worker i32 6, label %bb0 147*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 148*9880d681SAndroid Build Coastguard Worker i32 4, label %bb1 149*9880d681SAndroid Build Coastguard Worker i32 7, label %bb1 150*9880d681SAndroid Build Coastguard Worker i32 2, label %bb2 151*9880d681SAndroid Build Coastguard Worker i32 5, label %bb2 152*9880d681SAndroid Build Coastguard Worker i32 8, label %bb2 153*9880d681SAndroid Build Coastguard Worker ] 154*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 155*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 156*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 157*9880d681SAndroid Build Coastguard Workerreturn: ret void 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; This could be lowered as a jump table, but bit tests is more efficient. 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bt_is_better 161*9880d681SAndroid Build Coastguard Worker; The bit test on 2,5,8 is unnecessary as all cases cover the rage [0, 8]. 162*9880d681SAndroid Build Coastguard Worker; The range check guarantees that cases other than 0,3,6 and 1,4,7 must be 163*9880d681SAndroid Build Coastguard Worker; in 2,5,8. 164*9880d681SAndroid Build Coastguard Worker; 165*9880d681SAndroid Build Coastguard Worker; 73 = 2^0 + 2^3 + 2^6 166*9880d681SAndroid Build Coastguard Worker; CHECK: movl $73 167*9880d681SAndroid Build Coastguard Worker; CHECK: btl 168*9880d681SAndroid Build Coastguard Worker; 146 = 2^1 + 2^4 + 2^7 169*9880d681SAndroid Build Coastguard Worker; CHECK: movl $146 170*9880d681SAndroid Build Coastguard Worker; CHECK: btl 171*9880d681SAndroid Build Coastguard Worker; 292 = 2^2 + 2^5 + 2^8 172*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl $292 173*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: btl 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdefine void @bt_is_better2(i32 %x) { 177*9880d681SAndroid Build Coastguard Workerentry: 178*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 179*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 180*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 181*9880d681SAndroid Build Coastguard Worker i32 6, label %bb0 182*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 183*9880d681SAndroid Build Coastguard Worker i32 4, label %bb1 184*9880d681SAndroid Build Coastguard Worker i32 7, label %bb1 185*9880d681SAndroid Build Coastguard Worker i32 2, label %bb2 186*9880d681SAndroid Build Coastguard Worker i32 8, label %bb2 187*9880d681SAndroid Build Coastguard Worker ] 188*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 189*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 190*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 191*9880d681SAndroid Build Coastguard Workerreturn: ret void 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker; This will also be lowered as bit test, but as the range [0,8] is not fully 194*9880d681SAndroid Build Coastguard Worker; covered (5 missing), the default statement can be jumped to and we end up 195*9880d681SAndroid Build Coastguard Worker; with one more branch. 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bt_is_better2 197*9880d681SAndroid Build Coastguard Worker; 198*9880d681SAndroid Build Coastguard Worker; 73 = 2^0 + 2^3 + 2^6 199*9880d681SAndroid Build Coastguard Worker; CHECK: movl $73 200*9880d681SAndroid Build Coastguard Worker; CHECK: btl 201*9880d681SAndroid Build Coastguard Worker; 146 = 2^1 + 2^4 + 2^7 202*9880d681SAndroid Build Coastguard Worker; CHECK: movl $146 203*9880d681SAndroid Build Coastguard Worker; CHECK: btl 204*9880d681SAndroid Build Coastguard Worker; 260 = 2^2 + 2^8 205*9880d681SAndroid Build Coastguard Worker; CHECK: movl $260 206*9880d681SAndroid Build Coastguard Worker; CHECK: btl 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine void @bt_is_better3(i32 %x) { 210*9880d681SAndroid Build Coastguard Workerentry: 211*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 212*9880d681SAndroid Build Coastguard Worker i32 10, label %bb0 213*9880d681SAndroid Build Coastguard Worker i32 13, label %bb0 214*9880d681SAndroid Build Coastguard Worker i32 16, label %bb0 215*9880d681SAndroid Build Coastguard Worker i32 11, label %bb1 216*9880d681SAndroid Build Coastguard Worker i32 14, label %bb1 217*9880d681SAndroid Build Coastguard Worker i32 17, label %bb1 218*9880d681SAndroid Build Coastguard Worker i32 12, label %bb2 219*9880d681SAndroid Build Coastguard Worker i32 18, label %bb2 220*9880d681SAndroid Build Coastguard Worker ] 221*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 222*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 223*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 224*9880d681SAndroid Build Coastguard Workerreturn: ret void 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker; We don't have to subtract 10 from the case value to let the range become 227*9880d681SAndroid Build Coastguard Worker; [0, 8], as each value in the range [10, 18] can be represented by bits in a 228*9880d681SAndroid Build Coastguard Worker; word. Then we still need a branch to jump to the default statement for the 229*9880d681SAndroid Build Coastguard Worker; range [0, 10). 230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bt_is_better3 231*9880d681SAndroid Build Coastguard Worker; 232*9880d681SAndroid Build Coastguard Worker; 74752 = 2^10 + 2^13 + 2^16 233*9880d681SAndroid Build Coastguard Worker; CHECK: movl $74752 234*9880d681SAndroid Build Coastguard Worker; CHECK: btl 235*9880d681SAndroid Build Coastguard Worker; 149504 = 2^11 + 2^14 + 2^17 236*9880d681SAndroid Build Coastguard Worker; CHECK: movl $149504 237*9880d681SAndroid Build Coastguard Worker; CHECK: btl 238*9880d681SAndroid Build Coastguard Worker; 266240 = 2^12 + 2^15 + 2^18 239*9880d681SAndroid Build Coastguard Worker; CHECK: movl $266240 240*9880d681SAndroid Build Coastguard Worker; CHECK: btl 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdefine void @optimal_pivot1(i32 %x) { 245*9880d681SAndroid Build Coastguard Workerentry: 246*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 247*9880d681SAndroid Build Coastguard Worker i32 100, label %bb0 248*9880d681SAndroid Build Coastguard Worker i32 200, label %bb1 249*9880d681SAndroid Build Coastguard Worker i32 300, label %bb0 250*9880d681SAndroid Build Coastguard Worker i32 400, label %bb1 251*9880d681SAndroid Build Coastguard Worker i32 500, label %bb0 252*9880d681SAndroid Build Coastguard Worker i32 600, label %bb1 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker ] 255*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 256*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 257*9880d681SAndroid Build Coastguard Workerreturn: ret void 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker; Should pivot around 400 for two subtrees of equal size. 260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: optimal_pivot1 261*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 262*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $399 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Workerdefine void @optimal_pivot2(i32 %x) { 267*9880d681SAndroid Build Coastguard Workerentry: 268*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 269*9880d681SAndroid Build Coastguard Worker i32 100, label %bb0 i32 101, label %bb1 i32 102, label %bb2 i32 103, label %bb3 270*9880d681SAndroid Build Coastguard Worker i32 200, label %bb0 i32 201, label %bb1 i32 202, label %bb2 i32 203, label %bb3 271*9880d681SAndroid Build Coastguard Worker i32 300, label %bb0 i32 301, label %bb1 i32 302, label %bb2 i32 303, label %bb3 272*9880d681SAndroid Build Coastguard Worker i32 400, label %bb0 i32 401, label %bb1 i32 402, label %bb2 i32 403, label %bb3 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker ] 275*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 276*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 277*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 278*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 279*9880d681SAndroid Build Coastguard Workerreturn: ret void 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; Should pivot around 300 for two subtrees with two jump tables each. 282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: optimal_pivot2 283*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 284*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $299 285*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 286*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 287*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 288*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 289*9880d681SAndroid Build Coastguard Worker} 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Workerdefine void @optimal_jump_table1(i32 %x) { 293*9880d681SAndroid Build Coastguard Workerentry: 294*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 295*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 296*9880d681SAndroid Build Coastguard Worker i32 5, label %bb1 297*9880d681SAndroid Build Coastguard Worker i32 6, label %bb2 298*9880d681SAndroid Build Coastguard Worker i32 12, label %bb3 299*9880d681SAndroid Build Coastguard Worker i32 13, label %bb4 300*9880d681SAndroid Build Coastguard Worker i32 15, label %bb5 301*9880d681SAndroid Build Coastguard Worker ] 302*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 303*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 304*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 305*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 306*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 307*9880d681SAndroid Build Coastguard Workerbb5: tail call void @g(i32 5) br label %return 308*9880d681SAndroid Build Coastguard Workerreturn: ret void 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker; Splitting in the largest gap (between 6 and 12) would yield suboptimal result. 311*9880d681SAndroid Build Coastguard Worker; Expecting a jump table from 5 to 15. 312*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: optimal_jump_table1 313*9880d681SAndroid Build Coastguard Worker; CHECK: leal -5 314*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $10 315*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker; At -O0, we don't build jump tables for only parts of a switch. 318*9880d681SAndroid Build Coastguard Worker; NOOPT-LABEL: optimal_jump_table1 319*9880d681SAndroid Build Coastguard Worker; NOOPT: testl %edi, %edi 320*9880d681SAndroid Build Coastguard Worker; NOOPT: je 321*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $5, %eax 322*9880d681SAndroid Build Coastguard Worker; NOOPT: je 323*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $6, %eax 324*9880d681SAndroid Build Coastguard Worker; NOOPT: je 325*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $12, %eax 326*9880d681SAndroid Build Coastguard Worker; NOOPT: je 327*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $13, %eax 328*9880d681SAndroid Build Coastguard Worker; NOOPT: je 329*9880d681SAndroid Build Coastguard Worker; NOOPT: subl $15, %eax 330*9880d681SAndroid Build Coastguard Worker; NOOPT: je 331*9880d681SAndroid Build Coastguard Worker} 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Workerdefine void @optimal_jump_table2(i32 %x) { 335*9880d681SAndroid Build Coastguard Workerentry: 336*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 337*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 338*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 339*9880d681SAndroid Build Coastguard Worker i32 2, label %bb2 340*9880d681SAndroid Build Coastguard Worker i32 9, label %bb3 341*9880d681SAndroid Build Coastguard Worker i32 14, label %bb4 342*9880d681SAndroid Build Coastguard Worker i32 15, label %bb5 343*9880d681SAndroid Build Coastguard Worker ] 344*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 345*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 346*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 347*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 348*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 349*9880d681SAndroid Build Coastguard Workerbb5: tail call void @g(i32 5) br label %return 350*9880d681SAndroid Build Coastguard Workerreturn: ret void 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker; Partitioning the cases to the minimum number of dense sets is not good enough. 353*9880d681SAndroid Build Coastguard Worker; This can be partitioned as {0,1,2,9},{14,15} or {0,1,2},{9,14,15}. The former 354*9880d681SAndroid Build Coastguard Worker; should be preferred. Expecting a table from 0-9. 355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: optimal_jump_table2 356*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $9 357*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 358*9880d681SAndroid Build Coastguard Worker} 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Workerdefine void @optimal_jump_table3(i32 %x) { 362*9880d681SAndroid Build Coastguard Workerentry: 363*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 364*9880d681SAndroid Build Coastguard Worker i32 1, label %bb0 365*9880d681SAndroid Build Coastguard Worker i32 2, label %bb1 366*9880d681SAndroid Build Coastguard Worker i32 3, label %bb2 367*9880d681SAndroid Build Coastguard Worker i32 10, label %bb3 368*9880d681SAndroid Build Coastguard Worker i32 13, label %bb0 369*9880d681SAndroid Build Coastguard Worker i32 14, label %bb1 370*9880d681SAndroid Build Coastguard Worker i32 15, label %bb2 371*9880d681SAndroid Build Coastguard Worker i32 20, label %bb3 372*9880d681SAndroid Build Coastguard Worker i32 25, label %bb4 373*9880d681SAndroid Build Coastguard Worker ] 374*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 375*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 376*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 377*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 378*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 379*9880d681SAndroid Build Coastguard Workerreturn: ret void 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Worker; Splitting to maximize left-right density sum and gap size would split this 382*9880d681SAndroid Build Coastguard Worker; between 3 and 10, and then between 20 and 25. It's better to build a table 383*9880d681SAndroid Build Coastguard Worker; from 1-20. 384*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: optimal_jump_table3 385*9880d681SAndroid Build Coastguard Worker; CHECK: leal -1 386*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $19 387*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker%struct.S = type { %struct.S*, i32 } 391*9880d681SAndroid Build Coastguard Workerdefine void @phi_node_trouble(%struct.S* %s) { 392*9880d681SAndroid Build Coastguard Workerentry: 393*9880d681SAndroid Build Coastguard Worker br label %header 394*9880d681SAndroid Build Coastguard Workerheader: 395*9880d681SAndroid Build Coastguard Worker %ptr = phi %struct.S* [ %s, %entry ], [ %next, %loop ] 396*9880d681SAndroid Build Coastguard Worker %bool = icmp eq %struct.S* %ptr, null 397*9880d681SAndroid Build Coastguard Worker br i1 %bool, label %exit, label %loop 398*9880d681SAndroid Build Coastguard Workerloop: 399*9880d681SAndroid Build Coastguard Worker %nextptr = getelementptr inbounds %struct.S, %struct.S* %ptr, i64 0, i32 0 400*9880d681SAndroid Build Coastguard Worker %next = load %struct.S*, %struct.S** %nextptr 401*9880d681SAndroid Build Coastguard Worker %xptr = getelementptr inbounds %struct.S, %struct.S* %next, i64 0, i32 1 402*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %xptr 403*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %exit [ 404*9880d681SAndroid Build Coastguard Worker i32 4, label %header 405*9880d681SAndroid Build Coastguard Worker i32 36, label %exit2 406*9880d681SAndroid Build Coastguard Worker i32 69, label %exit2 407*9880d681SAndroid Build Coastguard Worker i32 25, label %exit2 408*9880d681SAndroid Build Coastguard Worker ] 409*9880d681SAndroid Build Coastguard Workerexit: 410*9880d681SAndroid Build Coastguard Worker ret void 411*9880d681SAndroid Build Coastguard Workerexit2: 412*9880d681SAndroid Build Coastguard Worker ret void 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker; This will be lowered to a comparison with 4 and then bit tests. Make sure 415*9880d681SAndroid Build Coastguard Worker; that the phi node in %header gets a value from the comparison block. 416*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: phi_node_trouble 417*9880d681SAndroid Build Coastguard Worker; CHECK: movq (%[[REG1:[a-z]+]]), %[[REG1]] 418*9880d681SAndroid Build Coastguard Worker; CHECK: movl 8(%[[REG1]]), %[[REG2:[a-z]+]] 419*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $4, %[[REG2]] 420*9880d681SAndroid Build Coastguard Worker} 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerdefine void @default_only(i32 %x) { 424*9880d681SAndroid Build Coastguard Workerentry: 425*9880d681SAndroid Build Coastguard Worker br label %sw 426*9880d681SAndroid Build Coastguard Workerreturn: 427*9880d681SAndroid Build Coastguard Worker ret void 428*9880d681SAndroid Build Coastguard Workersw: 429*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 430*9880d681SAndroid Build Coastguard Worker ] 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Worker; Branch directly to the default. 433*9880d681SAndroid Build Coastguard Worker; (In optimized builds the switch is removed earlier.) 434*9880d681SAndroid Build Coastguard Worker; NOOPT-LABEL: default_only 435*9880d681SAndroid Build Coastguard Worker; NOOPT: .[[L:[A-Z0-9_]+]]: 436*9880d681SAndroid Build Coastguard Worker; NOOPT-NEXT: retq 437*9880d681SAndroid Build Coastguard Worker; NOOPT: jmp .[[L]] 438*9880d681SAndroid Build Coastguard Worker} 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Workerdefine void @int_max_table_cluster(i8 %x) { 442*9880d681SAndroid Build Coastguard Workerentry: 443*9880d681SAndroid Build Coastguard Worker switch i8 %x, label %return [ 444*9880d681SAndroid Build Coastguard Worker i8 0, label %bb0 i8 1, label %bb0 i8 2, label %bb0 i8 3, label %bb0 445*9880d681SAndroid Build Coastguard Worker i8 4, label %bb0 i8 5, label %bb0 i8 6, label %bb0 i8 7, label %bb0 446*9880d681SAndroid Build Coastguard Worker i8 8, label %bb0 i8 9, label %bb0 i8 10, label %bb0 i8 11, label %bb0 447*9880d681SAndroid Build Coastguard Worker i8 12, label %bb0 i8 13, label %bb0 i8 14, label %bb0 i8 15, label %bb0 448*9880d681SAndroid Build Coastguard Worker i8 16, label %bb0 i8 17, label %bb0 i8 18, label %bb0 i8 19, label %bb0 449*9880d681SAndroid Build Coastguard Worker i8 20, label %bb0 i8 21, label %bb0 i8 22, label %bb0 i8 23, label %bb0 450*9880d681SAndroid Build Coastguard Worker i8 24, label %bb0 i8 25, label %bb0 i8 26, label %bb0 i8 27, label %bb0 451*9880d681SAndroid Build Coastguard Worker i8 28, label %bb0 i8 29, label %bb0 i8 30, label %bb0 i8 31, label %bb0 452*9880d681SAndroid Build Coastguard Worker i8 32, label %bb0 i8 33, label %bb0 i8 34, label %bb0 i8 35, label %bb0 453*9880d681SAndroid Build Coastguard Worker i8 36, label %bb0 i8 37, label %bb0 i8 38, label %bb0 i8 39, label %bb0 454*9880d681SAndroid Build Coastguard Worker i8 40, label %bb0 i8 41, label %bb0 i8 42, label %bb0 i8 43, label %bb0 455*9880d681SAndroid Build Coastguard Worker i8 44, label %bb0 i8 45, label %bb0 i8 46, label %bb0 i8 47, label %bb0 456*9880d681SAndroid Build Coastguard Worker i8 48, label %bb0 i8 49, label %bb0 i8 50, label %bb0 i8 51, label %bb0 457*9880d681SAndroid Build Coastguard Worker i8 52, label %bb0 i8 53, label %bb0 i8 54, label %bb0 i8 55, label %bb0 458*9880d681SAndroid Build Coastguard Worker i8 56, label %bb0 i8 57, label %bb0 i8 58, label %bb0 i8 59, label %bb0 459*9880d681SAndroid Build Coastguard Worker i8 60, label %bb0 i8 61, label %bb0 i8 62, label %bb0 i8 63, label %bb0 460*9880d681SAndroid Build Coastguard Worker i8 64, label %bb0 i8 65, label %bb0 i8 66, label %bb0 i8 67, label %bb0 461*9880d681SAndroid Build Coastguard Worker i8 68, label %bb0 i8 69, label %bb0 i8 70, label %bb0 i8 71, label %bb0 462*9880d681SAndroid Build Coastguard Worker i8 72, label %bb0 i8 73, label %bb0 i8 74, label %bb0 i8 75, label %bb0 463*9880d681SAndroid Build Coastguard Worker i8 76, label %bb0 i8 77, label %bb0 i8 78, label %bb0 i8 79, label %bb0 464*9880d681SAndroid Build Coastguard Worker i8 80, label %bb0 i8 81, label %bb0 i8 82, label %bb0 i8 83, label %bb0 465*9880d681SAndroid Build Coastguard Worker i8 84, label %bb0 i8 85, label %bb0 i8 86, label %bb0 i8 87, label %bb0 466*9880d681SAndroid Build Coastguard Worker i8 88, label %bb0 i8 89, label %bb0 i8 90, label %bb0 i8 91, label %bb0 467*9880d681SAndroid Build Coastguard Worker i8 92, label %bb0 i8 93, label %bb0 i8 94, label %bb0 i8 95, label %bb0 468*9880d681SAndroid Build Coastguard Worker i8 96, label %bb0 i8 97, label %bb0 i8 98, label %bb0 i8 99, label %bb0 469*9880d681SAndroid Build Coastguard Worker i8 100, label %bb0 i8 101, label %bb0 i8 102, label %bb0 i8 103, label %bb0 470*9880d681SAndroid Build Coastguard Worker i8 104, label %bb0 i8 105, label %bb0 i8 106, label %bb0 i8 107, label %bb0 471*9880d681SAndroid Build Coastguard Worker i8 108, label %bb0 i8 109, label %bb0 i8 110, label %bb0 i8 111, label %bb0 472*9880d681SAndroid Build Coastguard Worker i8 112, label %bb0 i8 113, label %bb0 i8 114, label %bb0 i8 115, label %bb0 473*9880d681SAndroid Build Coastguard Worker i8 116, label %bb0 i8 117, label %bb0 i8 118, label %bb0 i8 119, label %bb0 474*9880d681SAndroid Build Coastguard Worker i8 120, label %bb0 i8 121, label %bb0 i8 122, label %bb0 i8 123, label %bb0 475*9880d681SAndroid Build Coastguard Worker i8 124, label %bb0 i8 125, label %bb0 i8 126, label %bb0 i8 127, label %bb0 476*9880d681SAndroid Build Coastguard Worker i8 -64, label %bb1 i8 -63, label %bb1 i8 -62, label %bb1 i8 -61, label %bb1 477*9880d681SAndroid Build Coastguard Worker i8 -60, label %bb1 i8 -59, label %bb1 i8 -58, label %bb1 i8 -57, label %bb1 478*9880d681SAndroid Build Coastguard Worker i8 -56, label %bb1 i8 -55, label %bb1 i8 -54, label %bb1 i8 -53, label %bb1 479*9880d681SAndroid Build Coastguard Worker i8 -52, label %bb1 i8 -51, label %bb1 i8 -50, label %bb1 i8 -49, label %bb1 480*9880d681SAndroid Build Coastguard Worker i8 -48, label %bb1 i8 -47, label %bb1 i8 -46, label %bb1 i8 -45, label %bb1 481*9880d681SAndroid Build Coastguard Worker i8 -44, label %bb1 i8 -43, label %bb1 i8 -42, label %bb1 i8 -41, label %bb1 482*9880d681SAndroid Build Coastguard Worker i8 -40, label %bb1 i8 -39, label %bb1 i8 -38, label %bb1 i8 -37, label %bb1 483*9880d681SAndroid Build Coastguard Worker i8 -36, label %bb1 i8 -35, label %bb1 i8 -34, label %bb1 i8 -33, label %bb1 484*9880d681SAndroid Build Coastguard Worker i8 -32, label %bb2 i8 -31, label %bb2 i8 -30, label %bb2 i8 -29, label %bb2 485*9880d681SAndroid Build Coastguard Worker i8 -28, label %bb2 i8 -27, label %bb2 i8 -26, label %bb2 i8 -25, label %bb2 486*9880d681SAndroid Build Coastguard Worker i8 -24, label %bb2 i8 -23, label %bb2 i8 -22, label %bb2 i8 -21, label %bb2 487*9880d681SAndroid Build Coastguard Worker i8 -20, label %bb2 i8 -19, label %bb2 i8 -18, label %bb2 i8 -17, label %bb2 488*9880d681SAndroid Build Coastguard Worker i8 -16, label %bb3 i8 -15, label %bb3 i8 -14, label %bb3 i8 -13, label %bb3 489*9880d681SAndroid Build Coastguard Worker i8 -12, label %bb3 i8 -11, label %bb3 i8 -10, label %bb3 i8 -9, label %bb3 490*9880d681SAndroid Build Coastguard Worker ] 491*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 492*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 493*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 1) br label %return 494*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 1) br label %return 495*9880d681SAndroid Build Coastguard Workerreturn: ret void 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Worker; Don't infloop on jump tables where the upper bound is the max value of the 498*9880d681SAndroid Build Coastguard Worker; input type (in this case 127). 499*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: int_max_table_cluster 500*9880d681SAndroid Build Coastguard Worker; CHECK: jmpq *.LJTI 501*9880d681SAndroid Build Coastguard Worker} 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard Worker 504*9880d681SAndroid Build Coastguard Workerdefine void @bt_order_by_weight(i32 %x) { 505*9880d681SAndroid Build Coastguard Workerentry: 506*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 507*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 508*9880d681SAndroid Build Coastguard Worker i32 3, label %bb0 509*9880d681SAndroid Build Coastguard Worker i32 6, label %bb0 510*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 511*9880d681SAndroid Build Coastguard Worker i32 4, label %bb1 512*9880d681SAndroid Build Coastguard Worker i32 7, label %bb1 513*9880d681SAndroid Build Coastguard Worker i32 2, label %bb2 514*9880d681SAndroid Build Coastguard Worker i32 5, label %bb2 515*9880d681SAndroid Build Coastguard Worker i32 8, label %bb2 516*9880d681SAndroid Build Coastguard Worker i32 9, label %bb2 517*9880d681SAndroid Build Coastguard Worker ], !prof !1 518*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 519*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 520*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 521*9880d681SAndroid Build Coastguard Workerreturn: ret void 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Worker; Cases 1,4,7 have a very large branch weight (which shouldn't overflow), so 524*9880d681SAndroid Build Coastguard Worker; their bit test should come first. 0,3,6 and 2,5,8,9 both have a weight of 12, 525*9880d681SAndroid Build Coastguard Worker; but the latter set has more cases, so should be tested for earlier. 526*9880d681SAndroid Build Coastguard Worker; The bit test on 0,3,6 is unnecessary as all cases cover the rage [0, 9]. 527*9880d681SAndroid Build Coastguard Worker; The range check guarantees that cases other than 1,4,7 and 2,5,8,9 must be 528*9880d681SAndroid Build Coastguard Worker; in 0,3,6. 529*9880d681SAndroid Build Coastguard Worker 530*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bt_order_by_weight 531*9880d681SAndroid Build Coastguard Worker; 146 = 2^1 + 2^4 + 2^7 532*9880d681SAndroid Build Coastguard Worker; CHECK: movl $146 533*9880d681SAndroid Build Coastguard Worker; CHECK: btl 534*9880d681SAndroid Build Coastguard Worker; 292 = 2^2 + 2^5 + 2^8 + 2^9 535*9880d681SAndroid Build Coastguard Worker; CHECK: movl $804 536*9880d681SAndroid Build Coastguard Worker; CHECK: btl 537*9880d681SAndroid Build Coastguard Worker; 73 = 2^0 + 2^3 + 2^6 538*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl $73 539*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: btl 540*9880d681SAndroid Build Coastguard Worker} 541*9880d681SAndroid Build Coastguard Worker 542*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", 543*9880d681SAndroid Build Coastguard Worker ; Default: 544*9880d681SAndroid Build Coastguard Worker i32 1, 545*9880d681SAndroid Build Coastguard Worker ; Cases 0,3,6: 546*9880d681SAndroid Build Coastguard Worker i32 4, i32 4, i32 4, 547*9880d681SAndroid Build Coastguard Worker ; Cases 1,4,7: 548*9880d681SAndroid Build Coastguard Worker i32 4294967295, i32 2, i32 4294967295, 549*9880d681SAndroid Build Coastguard Worker ; Cases 2,5,8,9: 550*9880d681SAndroid Build Coastguard Worker i32 3, i32 3, i32 3, i32 3} 551*9880d681SAndroid Build Coastguard Worker 552*9880d681SAndroid Build Coastguard Workerdefine void @order_by_weight_and_fallthrough(i32 %x) { 553*9880d681SAndroid Build Coastguard Workerentry: 554*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 555*9880d681SAndroid Build Coastguard Worker i32 100, label %bb1 556*9880d681SAndroid Build Coastguard Worker i32 200, label %bb0 557*9880d681SAndroid Build Coastguard Worker i32 300, label %bb0 558*9880d681SAndroid Build Coastguard Worker ], !prof !2 559*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 560*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 561*9880d681SAndroid Build Coastguard Workerreturn: ret void 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker; Case 200 has the highest weight and should come first. 100 and 300 have the 564*9880d681SAndroid Build Coastguard Worker; same weight, but 300 goes to the 'next' block, so should be last. 565*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: order_by_weight_and_fallthrough 566*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $200 567*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $100 568*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $300 569*9880d681SAndroid Build Coastguard Worker} 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", 572*9880d681SAndroid Build Coastguard Worker ; Default: 573*9880d681SAndroid Build Coastguard Worker i32 1, 574*9880d681SAndroid Build Coastguard Worker ; Case 100: 575*9880d681SAndroid Build Coastguard Worker i32 10, 576*9880d681SAndroid Build Coastguard Worker ; Case 200: 577*9880d681SAndroid Build Coastguard Worker i32 1000, 578*9880d681SAndroid Build Coastguard Worker ; Case 300: 579*9880d681SAndroid Build Coastguard Worker i32 10} 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Workerdefine void @zero_weight_tree(i32 %x) { 583*9880d681SAndroid Build Coastguard Workerentry: 584*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 585*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 586*9880d681SAndroid Build Coastguard Worker i32 10, label %bb1 587*9880d681SAndroid Build Coastguard Worker i32 20, label %bb2 588*9880d681SAndroid Build Coastguard Worker i32 30, label %bb3 589*9880d681SAndroid Build Coastguard Worker i32 40, label %bb4 590*9880d681SAndroid Build Coastguard Worker i32 50, label %bb5 591*9880d681SAndroid Build Coastguard Worker ], !prof !3 592*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 593*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 594*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 595*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 596*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 597*9880d681SAndroid Build Coastguard Workerbb5: tail call void @g(i32 5) br label %return 598*9880d681SAndroid Build Coastguard Workerreturn: ret void 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker; Make sure to pick a pivot in the middle also with zero-weight cases. 601*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zero_weight_tree 602*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 603*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $29 604*9880d681SAndroid Build Coastguard Worker} 605*9880d681SAndroid Build Coastguard Worker 606*9880d681SAndroid Build Coastguard Worker!3 = !{!"branch_weights", i32 1, i32 10, i32 0, i32 0, i32 0, i32 0, i32 10} 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Worker 609*9880d681SAndroid Build Coastguard Workerdefine void @left_leaning_weight_balanced_tree(i32 %x) { 610*9880d681SAndroid Build Coastguard Workerentry: 611*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 612*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 613*9880d681SAndroid Build Coastguard Worker i32 10, label %bb1 614*9880d681SAndroid Build Coastguard Worker i32 20, label %bb2 615*9880d681SAndroid Build Coastguard Worker i32 30, label %bb3 616*9880d681SAndroid Build Coastguard Worker i32 40, label %bb4 617*9880d681SAndroid Build Coastguard Worker i32 50, label %bb5 618*9880d681SAndroid Build Coastguard Worker i32 60, label %bb6 619*9880d681SAndroid Build Coastguard Worker i32 70, label %bb6 620*9880d681SAndroid Build Coastguard Worker ], !prof !4 621*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 622*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 623*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 624*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 625*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 626*9880d681SAndroid Build Coastguard Workerbb5: tail call void @g(i32 5) br label %return 627*9880d681SAndroid Build Coastguard Workerbb6: tail call void @g(i32 6) br label %return 628*9880d681SAndroid Build Coastguard Workerbb7: tail call void @g(i32 7) br label %return 629*9880d681SAndroid Build Coastguard Workerreturn: ret void 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker; Without branch probabilities, the pivot would be 40, since that would yield 632*9880d681SAndroid Build Coastguard Worker; equal-sized sub-trees. When taking weights into account, case 70 becomes the 633*9880d681SAndroid Build Coastguard Worker; pivot. Since there is room for 3 cases in a leaf, cases 50 and 60 are also 634*9880d681SAndroid Build Coastguard Worker; included in the right-hand side because that doesn't reduce their rank. 635*9880d681SAndroid Build Coastguard Worker 636*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: left_leaning_weight_balanced_tree 637*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 638*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $49 639*9880d681SAndroid Build Coastguard Worker} 640*9880d681SAndroid Build Coastguard Worker 641*9880d681SAndroid Build Coastguard Worker!4 = !{!"branch_weights", i32 1, i32 10, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1000} 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Worker 644*9880d681SAndroid Build Coastguard Workerdefine void @left_leaning_weight_balanced_tree2(i32 %x) { 645*9880d681SAndroid Build Coastguard Workerentry: 646*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 647*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 648*9880d681SAndroid Build Coastguard Worker i32 10, label %bb1 649*9880d681SAndroid Build Coastguard Worker i32 20, label %bb2 650*9880d681SAndroid Build Coastguard Worker i32 30, label %bb3 651*9880d681SAndroid Build Coastguard Worker i32 40, label %bb4 652*9880d681SAndroid Build Coastguard Worker i32 50, label %bb5 653*9880d681SAndroid Build Coastguard Worker i32 60, label %bb6 654*9880d681SAndroid Build Coastguard Worker i32 70, label %bb6 655*9880d681SAndroid Build Coastguard Worker ], !prof !5 656*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 657*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 658*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 659*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 660*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 661*9880d681SAndroid Build Coastguard Workerbb5: tail call void @g(i32 5) br label %return 662*9880d681SAndroid Build Coastguard Workerbb6: tail call void @g(i32 6) br label %return 663*9880d681SAndroid Build Coastguard Workerbb7: tail call void @g(i32 7) br label %return 664*9880d681SAndroid Build Coastguard Workerreturn: ret void 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Worker; Same as the previous test, except case 50 has higher rank to the left than it 667*9880d681SAndroid Build Coastguard Worker; would have on the right. Case 60 would have the same rank on both sides, so is 668*9880d681SAndroid Build Coastguard Worker; moved into the leaf. 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: left_leaning_weight_balanced_tree2 671*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 672*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $59 673*9880d681SAndroid Build Coastguard Worker} 674*9880d681SAndroid Build Coastguard Worker 675*9880d681SAndroid Build Coastguard Worker!5 = !{!"branch_weights", i32 1, i32 10, i32 1, i32 1, i32 1, i32 1, i32 90, i32 70, i32 1000} 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Worker 678*9880d681SAndroid Build Coastguard Workerdefine void @right_leaning_weight_balanced_tree(i32 %x) { 679*9880d681SAndroid Build Coastguard Workerentry: 680*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 681*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 682*9880d681SAndroid Build Coastguard Worker i32 10, label %bb1 683*9880d681SAndroid Build Coastguard Worker i32 20, label %bb2 684*9880d681SAndroid Build Coastguard Worker i32 30, label %bb3 685*9880d681SAndroid Build Coastguard Worker i32 40, label %bb4 686*9880d681SAndroid Build Coastguard Worker i32 50, label %bb5 687*9880d681SAndroid Build Coastguard Worker i32 60, label %bb6 688*9880d681SAndroid Build Coastguard Worker i32 70, label %bb6 689*9880d681SAndroid Build Coastguard Worker ], !prof !6 690*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 691*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 692*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 693*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 694*9880d681SAndroid Build Coastguard Workerbb4: tail call void @g(i32 4) br label %return 695*9880d681SAndroid Build Coastguard Workerbb5: tail call void @g(i32 5) br label %return 696*9880d681SAndroid Build Coastguard Workerbb6: tail call void @g(i32 6) br label %return 697*9880d681SAndroid Build Coastguard Workerbb7: tail call void @g(i32 7) br label %return 698*9880d681SAndroid Build Coastguard Workerreturn: ret void 699*9880d681SAndroid Build Coastguard Worker 700*9880d681SAndroid Build Coastguard Worker; Analogous to left_leaning_weight_balanced_tree. 701*9880d681SAndroid Build Coastguard Worker 702*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: right_leaning_weight_balanced_tree 703*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 704*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $19 705*9880d681SAndroid Build Coastguard Worker} 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Worker!6 = !{!"branch_weights", i32 1, i32 1000, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 10} 708*9880d681SAndroid Build Coastguard Worker 709*9880d681SAndroid Build Coastguard Worker 710*9880d681SAndroid Build Coastguard Workerdefine void @jump_table_affects_balance(i32 %x) { 711*9880d681SAndroid Build Coastguard Workerentry: 712*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %return [ 713*9880d681SAndroid Build Coastguard Worker ; Jump table: 714*9880d681SAndroid Build Coastguard Worker i32 0, label %bb0 715*9880d681SAndroid Build Coastguard Worker i32 1, label %bb1 716*9880d681SAndroid Build Coastguard Worker i32 2, label %bb2 717*9880d681SAndroid Build Coastguard Worker i32 3, label %bb3 718*9880d681SAndroid Build Coastguard Worker 719*9880d681SAndroid Build Coastguard Worker i32 100, label %bb0 720*9880d681SAndroid Build Coastguard Worker i32 200, label %bb1 721*9880d681SAndroid Build Coastguard Worker i32 300, label %bb2 722*9880d681SAndroid Build Coastguard Worker ] 723*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 724*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 725*9880d681SAndroid Build Coastguard Workerbb2: tail call void @g(i32 2) br label %return 726*9880d681SAndroid Build Coastguard Workerbb3: tail call void @g(i32 3) br label %return 727*9880d681SAndroid Build Coastguard Workerreturn: ret void 728*9880d681SAndroid Build Coastguard Worker 729*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: jump_table_affects_balance 730*9880d681SAndroid Build Coastguard Worker; If the tree were balanced based on number of clusters, {0-3,100} would go on 731*9880d681SAndroid Build Coastguard Worker; the left and {200,300} on the right. However, the jump table weights as much 732*9880d681SAndroid Build Coastguard Worker; as its components, so 100 is selected as the pivot. 733*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 734*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $99 735*9880d681SAndroid Build Coastguard Worker} 736*9880d681SAndroid Build Coastguard Worker 737*9880d681SAndroid Build Coastguard Worker 738*9880d681SAndroid Build Coastguard Workerdefine void @pr23738(i4 %x) { 739*9880d681SAndroid Build Coastguard Workerentry: 740*9880d681SAndroid Build Coastguard Worker switch i4 %x, label %bb0 [ 741*9880d681SAndroid Build Coastguard Worker i4 0, label %bb1 742*9880d681SAndroid Build Coastguard Worker i4 1, label %bb1 743*9880d681SAndroid Build Coastguard Worker i4 -5, label %bb1 744*9880d681SAndroid Build Coastguard Worker ] 745*9880d681SAndroid Build Coastguard Workerbb0: tail call void @g(i32 0) br label %return 746*9880d681SAndroid Build Coastguard Workerbb1: tail call void @g(i32 1) br label %return 747*9880d681SAndroid Build Coastguard Workerreturn: ret void 748*9880d681SAndroid Build Coastguard Worker; Don't assert due to truncating the bitwidth (64) to i4 when checking 749*9880d681SAndroid Build Coastguard Worker; that the bit-test range fits in a word. 750*9880d681SAndroid Build Coastguard Worker} 751*9880d681SAndroid Build Coastguard Worker 752*9880d681SAndroid Build Coastguard Worker 753*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27135(i32 %i) { 754*9880d681SAndroid Build Coastguard Workerentry: 755*9880d681SAndroid Build Coastguard Worker br i1 undef, label %sw, label %end 756*9880d681SAndroid Build Coastguard Workersw: 757*9880d681SAndroid Build Coastguard Worker switch i32 %i, label %end [ 758*9880d681SAndroid Build Coastguard Worker i32 99, label %sw.bb 759*9880d681SAndroid Build Coastguard Worker i32 98, label %sw.bb 760*9880d681SAndroid Build Coastguard Worker i32 101, label %sw.bb 761*9880d681SAndroid Build Coastguard Worker i32 97, label %sw.bb2 762*9880d681SAndroid Build Coastguard Worker i32 96, label %sw.bb2 763*9880d681SAndroid Build Coastguard Worker i32 100, label %sw.bb2 764*9880d681SAndroid Build Coastguard Worker ] 765*9880d681SAndroid Build Coastguard Workersw.bb: 766*9880d681SAndroid Build Coastguard Worker unreachable 767*9880d681SAndroid Build Coastguard Workersw.bb2: 768*9880d681SAndroid Build Coastguard Worker unreachable 769*9880d681SAndroid Build Coastguard Workerend: 770*9880d681SAndroid Build Coastguard Worker %p = phi i32 [ 1, %sw ], [ 0, %entry ] 771*9880d681SAndroid Build Coastguard Worker ret i32 %p 772*9880d681SAndroid Build Coastguard Worker 773*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pr27135: 774*9880d681SAndroid Build Coastguard Worker; The switch is lowered with bit tests. Since the case range is contiguous, the 775*9880d681SAndroid Build Coastguard Worker; second bit test is redundant and can be skipped. Check that we don't update 776*9880d681SAndroid Build Coastguard Worker; the phi node with an incoming value from the MBB of the skipped bit test 777*9880d681SAndroid Build Coastguard Worker; (-verify-machine-instrs cathces this). 778*9880d681SAndroid Build Coastguard Worker; CHECK: btl 779*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: btl 780*9880d681SAndroid Build Coastguard Worker} 781