1 ; RUN: llc -mtriple=x86_64-linux-gnu -stop-after=expand-isel-pseudos < %s | FileCheck %s 2 3 define i32 @foo(i32 %n) !prof !1 { 4 entry: 5 switch i32 %n, label %bb_default [ 6 i32 8, label %bb1 7 i32 -8826, label %bb2 8 i32 18312, label %bb3 9 i32 18568, label %bb4 10 i32 129, label %bb5 11 ], !prof !2 12 13 ; CHECK: successors: %[[PEELED_CASE_LABEL:.*]](0x5999999a), %[[PEELED_SWITCH_LABEL:.*]](0x26666666) 14 ; CHECK: %[[VAL:[0-9]+]]:gr32 = COPY $edi 15 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18568, implicit-def $eflags 16 ; CHECK: JE_1 %[[PEELED_CASE_LABEL]], implicit $eflags 17 ; CHECK: JMP_1 %[[PEELED_SWITCH_LABEL]] 18 ; CHECK: [[PEELED_SWITCH_LABEL]].{{[a-zA-Z0-9.]+}}: 19 ; CHECK: successors: %[[BB1_LABEL:.*]](0x0206d3a0), %[[BB2_LABEL:.*]](0x7df92c60) 20 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18311, implicit-def $eflags 21 ; CHECK: JG_1 %[[BB2_LABEL]], implicit $eflags 22 ; CHECK: JMP_1 %[[BB1_LABEL]] 23 ; CHECK: [[BB1_LABEL]].{{[a-zA-Z0-9.]+}}: 24 ; CHECK: successors: %[[CASE2_LABEL:.*]](0x35e50d5b), %[[BB3_LABEL:.*]](0x4a1af2a5) 25 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], -8826, implicit-def $eflags 26 ; CHECK: JE_1 %[[CASE2_LABEL]], implicit $eflags 27 ; CHECK: JMP_1 %[[BB3_LABEL]] 28 ; CHECK: [[BB3_LABEL]] 29 ; CHECK: successors: %[[CASE5_LABEL:.*]](0x45d173c8), %[[BB4_LABEL:.*]](0x3a2e8c38) 30 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 129, implicit-def $eflags 31 ; CHECK: JE_1 %[[CASE5_LABEL]], implicit $eflags 32 ; CHECK: JMP_1 %[[BB4_LABEL]] 33 ; CHECK: [[BB4_LABEL:.*]].{{[a-zA-Z0-9.]+}}: 34 ; CHECK: successors: %[[CASE1_LABEL:.*]](0x66666666), %[[DEFAULT_BB_LABEL:.*]](0x1999999a) 35 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 8, implicit-def $eflags 36 ; CHECK: JE_1 %[[CASE1_LABEL]], implicit $eflags 37 ; CHECK: JMP_1 %[[DEFAULT_BB_LABEL]] 38 ; CHECK: [[BB2_LABEL]].{{[a-zA-Z0-9.]+}}: 39 ; CHECK: successors: %[[CASE3_LABEL:.*]](0x7fe44107), %[[DEFAULT_BB_LABEL]](0x001bbef9) 40 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18312, implicit-def $eflags 41 ; CHECK: JE_1 %[[CASE3_LABEL]], implicit $eflags 42 ; CHECK: JMP_1 %[[DEFAULT_BB_LABEL]] 43 44 bb1: 45 br label %return 46 bb2: 47 br label %return 48 bb3: 49 br label %return 50 bb4: 51 br label %return 52 bb5: 53 br label %return 54 bb_default: 55 br label %return 56 57 return: 58 %retval = phi i32 [ 0, %bb_default ], [ 5, %bb5 ], [ 4, %bb4 ], [ 3, %bb3 ], [ 2, %bb2 ], [ 1, %bb1 ] 59 ret i32 %retval 60 } 61 62 ; Test the peeling of the merged cases value 85 and 86. 63 define i32 @foo1(i32 %n) !prof !1 { 64 entry: 65 switch i32 %n, label %bb_default [ 66 i32 -40, label %bb1 67 i32 86, label %bb2 68 i32 85, label %bb2 69 i32 1, label %bb3 70 i32 5, label %bb4 71 i32 7, label %bb5 72 i32 49, label %bb6 73 ], !prof !3 74 75 ; CHECK: successors: %[[PEELED_CASE_LABEL:.*]](0x59999999), %[[PEELED_SWITCH_LABEL:.*]](0x26666667) 76 ; CHECK: %[[VAL:[0-9]+]]:gr32 = COPY $edi 77 ; CHECK: %{{[0-9]+}}:gr32 = ADD32ri8 %{{[0-9]+}}, -85, implicit-def dead $eflags 78 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %{{[0-9]+}}, 2, implicit-def $eflags 79 ; CHECK: JB_1 %[[PEELED_CASE_LABEL]], implicit $eflags 80 ; CHECK: JMP_1 %[[PEELED_SWITCH_LABEL]] 81 ; CHECK: [[PEELED_SWITCH_LABEL]].{{[a-zA-Z0-9.]+}}: 82 ; CHECK: successors: %[[BB1_LABEL:.*]](0x0088888a), %[[BB2_LABEL:.*]](0x7f777776) 83 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 4, implicit-def $eflags 84 ; CHECK: JG_1 %[[BB2_LABEL]], implicit $eflags 85 ; CHECK: JMP_1 %[[BB1_LABEL]] 86 ; CHECK: [[BB1_LABEL]].{{[a-zA-Z0-9.]+}}: 87 ; CHECK: successors: %[[CASE4_LABEL:.*]](0x7f775a4f), %[[BB3_LABEL:.*]](0x0088a5b1) 88 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 1, implicit-def $eflags 89 ; CHECK: JE_1 %[[CASE4_LABEL]], implicit $eflags 90 ; CHECK: JMP_1 %[[BB3_LABEL]] 91 ; CHECK: [[BB3_LABEL]].{{[a-zA-Z0-9.]+}}: 92 ; CHECK: successors: %[[CASE1_LABEL:.*]](0x66666666), %[[DEFAULT_BB_LABEL:.*]](0x1999999a) 93 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], -40, implicit-def $eflags 94 ; CHECK: JE_1 %[[CASE1_LABEL]], implicit $eflags 95 ; CHECK: JMP_1 %[[DEFAULT_BB_LABEL]] 96 ; CHECK: [[BB2_LABEL]].{{[a-zA-Z0-9.]+}}: 97 ; CHECK: successors: %[[CASE5_LABEL:.*]](0x00000000), %[[BB4_LABEL:.*]](0x80000000) 98 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 5, implicit-def $eflags 99 ; CHECK: JE_1 %[[CASE5_LABEL]], implicit $eflags 100 ; CHECK: JMP_1 %[[BB4_LABEL]] 101 ; CHECK: [[BB4_LABEL]].{{[a-zA-Z0-9.]+}}: 102 ; CHECK: successors: %[[CASE6_LABEL:.*]](0x00000000), %[[BB5_LABEL:.*]](0x80000000) 103 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 7, implicit-def $eflags 104 ; CHECK: JE_1 %[[CASE6_LABEL]], implicit $eflags 105 ; CHECK: JMP_1 %[[BB5_LABEL]] 106 ; CHECK: [[BB5_LABEL]].{{[a-zA-Z0-9.]+}}: 107 ; CHECK: successors: %[[CASE7_LABEL:.*]](0x00000000), %[[DEFAULT_BB_LABEL]](0x80000000) 108 ; CHECK: %{{[0-9]+}}:gr32 = SUB32ri8 %[[VAL]], 49, implicit-def $eflags 109 ; CHECK: JE_1 %[[CASE7_LABEL]], implicit $eflags 110 ; CHECK: JMP_1 %[[DEFAULT_BB_LABEL]] 111 112 113 bb1: 114 br label %return 115 bb2: 116 br label %return 117 bb3: 118 br label %return 119 bb4: 120 br label %return 121 bb5: 122 br label %return 123 bb6: 124 br label %return 125 bb_default: 126 br label %return 127 128 return: 129 %retval = phi i32 [ 0, %bb_default ], [ 6, %bb6 ], [ 5, %bb5 ], [ 4, %bb4 ], [ 3, %bb3 ], [ 2, %bb2 ], [ 1, %bb1 ] 130 ret i32 %retval 131 } 132 !1 = !{!"function_entry_count", i64 100000} 133 !2 = !{!"branch_weights", i32 50, i32 100, i32 200, i32 29500, i32 70000, i32 150} 134 !3 = !{!"branch_weights", i32 50, i32 100, i32 500, i32 69500, i32 29850, i32 0, i32 0, i32 0} 135 136