136 lines · plain
1; RUN: llc -mtriple=x86_64-linux-gnu -stop-after=finalize-isel < %s | FileCheck %s2 3define i32 @foo(i32 %n) !prof !1 {4entry:5 switch i32 %n, label %bb_default [6 i32 8, label %bb17 i32 -8826, label %bb28 i32 18312, label %bb39 i32 18568, label %bb410 i32 129, label %bb511 ], !prof !212 13; CHECK: successors: %[[PEELED_CASE_LABEL:.*]](0x5999999a), %[[PEELED_SWITCH_LABEL:.*]](0x26666666)14; CHECK: %[[VAL:[0-9]+]]:gr32 = COPY $edi15; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %[[VAL]], 18568, implicit-def $eflags16; CHECK: JCC_1 %[[PEELED_CASE_LABEL]], 4, implicit $eflags17; 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 $eflags21; CHECK: JCC_1 %[[BB2_LABEL]], 15, implicit $eflags22; 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 $eflags26; CHECK: JCC_1 %[[CASE2_LABEL]], 4, implicit $eflags27; 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 $eflags31; CHECK: JCC_1 %[[CASE5_LABEL]], 4, implicit $eflags32; 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 = SUB32ri %[[VAL]], 8, implicit-def $eflags36; CHECK: JCC_1 %[[CASE1_LABEL]], 4, implicit $eflags37; 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 $eflags41; CHECK: JCC_1 %[[CASE3_LABEL]], 4, implicit $eflags42; CHECK: JMP_1 %[[DEFAULT_BB_LABEL]]43 44bb1:45 br label %return46bb2:47 br label %return48bb3:49 br label %return50bb4:51 br label %return52bb5:53 br label %return54bb_default:55 br label %return56 57return:58 %retval = phi i32 [ 0, %bb_default ], [ 5, %bb5 ], [ 4, %bb4 ], [ 3, %bb3 ], [ 2, %bb2 ], [ 1, %bb1 ]59 ret i32 %retval60}61 62; Test the peeling of the merged cases value 85 and 86.63define i32 @foo1(i32 %n) !prof !1 {64entry:65 switch i32 %n, label %bb_default [66 i32 -40, label %bb167 i32 86, label %bb268 i32 85, label %bb269 i32 1, label %bb370 i32 5, label %bb471 i32 7, label %bb572 i32 49, label %bb673 ], !prof !374 75; CHECK: successors: %[[PEELED_CASE_LABEL:.*]](0x59999999), %[[PEELED_SWITCH_LABEL:.*]](0x26666667)76; CHECK: %[[VAL:[0-9]+]]:gr32 = COPY $edi77; CHECK: %{{[0-9]+}}:gr32 = ADD32ri %{{[0-9]+}}, -85, implicit-def dead $eflags78; CHECK: %{{[0-9]+}}:gr32 = SUB32ri %{{[0-9]+}}, 2, implicit-def $eflags79; CHECK: JCC_1 %[[PEELED_CASE_LABEL]], 2, implicit $eflags80; 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 = SUB32ri %[[VAL]], 4, implicit-def $eflags84; CHECK: JCC_1 %[[BB2_LABEL]], 15, implicit $eflags85; 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 = SUB32ri %[[VAL]], 1, implicit-def $eflags89; CHECK: JCC_1 %[[CASE4_LABEL]], 4, implicit $eflags90; 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 = SUB32ri %[[VAL]], -40, implicit-def $eflags94; CHECK: JCC_1 %[[CASE1_LABEL]], 4, implicit $eflags95; 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 = SUB32ri %[[VAL]], 5, implicit-def $eflags99; CHECK: JCC_1 %[[CASE5_LABEL]], 4, implicit $eflags100; 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 = SUB32ri %[[VAL]], 7, implicit-def $eflags104; CHECK: JCC_1 %[[CASE6_LABEL]], 4, implicit $eflags105; 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 = SUB32ri %[[VAL]], 49, implicit-def $eflags109; CHECK: JCC_1 %[[CASE7_LABEL]], 4, implicit $eflags110; CHECK: JMP_1 %[[DEFAULT_BB_LABEL]]111 112 113bb1:114 br label %return115bb2:116 br label %return117bb3:118 br label %return119bb4:120 br label %return121bb5:122 br label %return123bb6:124 br label %return125bb_default:126 br label %return127 128return:129 %retval = phi i32 [ 0, %bb_default ], [ 6, %bb6 ], [ 5, %bb5 ], [ 4, %bb4 ], [ 3, %bb3 ], [ 2, %bb2 ], [ 1, %bb1 ]130 ret i32 %retval131}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