1*9880d681SAndroid Build Coastguard Worker; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare void @func2(i32) 4*9880d681SAndroid Build Coastguard Workerdeclare void @func4(i32) 5*9880d681SAndroid Build Coastguard Workerdeclare void @func6(i32) 6*9880d681SAndroid Build Coastguard Workerdeclare void @func8(i32) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker;; test1 - create a switch with case 2 and case 4 from two branches: N == 2 9*9880d681SAndroid Build Coastguard Worker;; and N == 4. 10*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %N) nounwind uwtable { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %N, 2 13*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.else, !prof !0 14*9880d681SAndroid Build Coastguard Worker; CHECK: test1 15*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N 16*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !0 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerif.then: 19*9880d681SAndroid Build Coastguard Worker call void @func2(i32 %N) nounwind 20*9880d681SAndroid Build Coastguard Worker br label %if.end9 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerif.else: 23*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp eq i32 %N, 4 24*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %if.then7, label %if.else8, !prof !1 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerif.then7: 27*9880d681SAndroid Build Coastguard Worker call void @func4(i32 %N) nounwind 28*9880d681SAndroid Build Coastguard Worker br label %if.end 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerif.else8: 31*9880d681SAndroid Build Coastguard Worker call void @func8(i32 %N) nounwind 32*9880d681SAndroid Build Coastguard Worker br label %if.end 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerif.end: 35*9880d681SAndroid Build Coastguard Worker br label %if.end9 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerif.end9: 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker;; test2 - Merge two switches where PredDefault == BB. 42*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %M, i32 %N) nounwind uwtable { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %M, 2 45*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %sw1, label %sw2 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workersw1: 48*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw2 [ 49*9880d681SAndroid Build Coastguard Worker i32 2, label %sw.bb 50*9880d681SAndroid Build Coastguard Worker i32 3, label %sw.bb1 51*9880d681SAndroid Build Coastguard Worker ], !prof !2 52*9880d681SAndroid Build Coastguard Worker; CHECK: test2 53*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw.epilog 54*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.bb 55*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb1 56*9880d681SAndroid Build Coastguard Worker; CHECK: i32 4, label %sw.bb5 57*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !1 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workersw.bb: 60*9880d681SAndroid Build Coastguard Worker call void @func2(i32 %N) nounwind 61*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workersw.bb1: 64*9880d681SAndroid Build Coastguard Worker call void @func4(i32 %N) nounwind 65*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workersw2: 68*9880d681SAndroid Build Coastguard Worker;; Here "case 2" is invalidated if control is transferred through default case 69*9880d681SAndroid Build Coastguard Worker;; of the first switch. 70*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw.epilog [ 71*9880d681SAndroid Build Coastguard Worker i32 2, label %sw.bb4 72*9880d681SAndroid Build Coastguard Worker i32 4, label %sw.bb5 73*9880d681SAndroid Build Coastguard Worker ], !prof !3 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workersw.bb4: 76*9880d681SAndroid Build Coastguard Worker call void @func6(i32 %N) nounwind 77*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workersw.bb5: 80*9880d681SAndroid Build Coastguard Worker call void @func8(i32 %N) nounwind 81*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workersw.epilog: 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker;; test3 - Merge two switches where PredDefault != BB. 88*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %M, i32 %N) nounwind uwtable { 89*9880d681SAndroid Build Coastguard Workerentry: 90*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %M, 2 91*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %sw1, label %sw2 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workersw1: 94*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw.bb [ 95*9880d681SAndroid Build Coastguard Worker i32 2, label %sw2 96*9880d681SAndroid Build Coastguard Worker i32 3, label %sw2 97*9880d681SAndroid Build Coastguard Worker i32 1, label %sw.bb1 98*9880d681SAndroid Build Coastguard Worker ], !prof !4 99*9880d681SAndroid Build Coastguard Worker; CHECK: test3 100*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw.bb 101*9880d681SAndroid Build Coastguard Worker; CHECK: i32 1, label %sw.bb1 102*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb4 103*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.epilog 104*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !3 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workersw.bb: 107*9880d681SAndroid Build Coastguard Worker call void @func2(i32 %N) nounwind 108*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workersw.bb1: 111*9880d681SAndroid Build Coastguard Worker call void @func4(i32 %N) nounwind 112*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workersw2: 115*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw.epilog [ 116*9880d681SAndroid Build Coastguard Worker i32 3, label %sw.bb4 117*9880d681SAndroid Build Coastguard Worker i32 4, label %sw.bb5 118*9880d681SAndroid Build Coastguard Worker ], !prof !5 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workersw.bb4: 121*9880d681SAndroid Build Coastguard Worker call void @func6(i32 %N) nounwind 122*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workersw.bb5: 125*9880d681SAndroid Build Coastguard Worker call void @func8(i32 %N) nounwind 126*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workersw.epilog: 129*9880d681SAndroid Build Coastguard Worker ret void 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4} 133*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 64} 134*9880d681SAndroid Build Coastguard Worker; CHECK: !0 = !{!"branch_weights", i32 256, i32 4352, i32 16} 135*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 4, i32 4, i32 8} 136*9880d681SAndroid Build Coastguard Worker!3 = !{!"branch_weights", i32 8, i32 8, i32 4} 137*9880d681SAndroid Build Coastguard Worker; CHECK: !1 = !{!"branch_weights", i32 32, i32 48, i32 96, i32 16} 138*9880d681SAndroid Build Coastguard Worker!4 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 3} 139*9880d681SAndroid Build Coastguard Worker!5 = !{!"branch_weights", i32 17, i32 13, i32 9} 140*9880d681SAndroid Build Coastguard Worker; CHECK: !3 = !{!"branch_weights", i32 7, i32 3, i32 4, i32 6} 141