1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare void @helper(i32) 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @test1(i1 %a, i1 %b) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker br i1 %a, label %Y, label %X, !prof !0 10*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !0 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard WorkerX: 13*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 14*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Z, label %Y, !prof !1 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard WorkerY: 17*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard WorkerZ: 21*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Make sure the metadata name string is "branch_weights" before propagating it. 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine void @fake_weights(i1 %a, i1 %b) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fake_weights( 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker br i1 %a, label %Y, label %X, !prof !12 31*9880d681SAndroid Build Coastguard Worker; CHECK: %or.cond = and i1 %a.not, %c 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %or.cond, label %Z, label %Y, !prof !1 33*9880d681SAndroid Build Coastguard Worker; CHECK: Y: 34*9880d681SAndroid Build Coastguard WorkerX: 35*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 36*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Z, label %Y, !prof !1 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard WorkerY: 39*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard WorkerZ: 43*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine void @test2(i1 %a, i1 %b) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker br i1 %a, label %X, label %Y, !prof !1 51*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !2 52*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: !prof 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard WorkerX: 55*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 56*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Z, label %Y, !prof !2 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard WorkerY: 59*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard WorkerZ: 63*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine void @test3(i1 %a, i1 %b) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 69*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !1 70*9880d681SAndroid Build Coastguard Workerentry: 71*9880d681SAndroid Build Coastguard Worker br i1 %a, label %X, label %Y, !prof !1 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard WorkerX: 74*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 75*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Z, label %Y 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard WorkerY: 78*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard WorkerZ: 82*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine void @test4(i1 %a, i1 %b) { 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 88*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !1 89*9880d681SAndroid Build Coastguard Workerentry: 90*9880d681SAndroid Build Coastguard Worker br i1 %a, label %X, label %Y 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard WorkerX: 93*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 94*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Z, label %Y, !prof !1 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard WorkerY: 97*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard WorkerZ: 101*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker;; test5 - The case where it jumps to the default target will be removed. 106*9880d681SAndroid Build Coastguard Workerdefine void @test5(i32 %M, i32 %N) nounwind uwtable { 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw2 [ 109*9880d681SAndroid Build Coastguard Worker i32 1, label %sw2 110*9880d681SAndroid Build Coastguard Worker i32 2, label %sw.bb 111*9880d681SAndroid Build Coastguard Worker i32 3, label %sw.bb1 112*9880d681SAndroid Build Coastguard Worker ], !prof !3 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 114*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw2 [ 115*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb1 116*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.bb 117*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !3 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workersw.bb: 120*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 121*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workersw.bb1: 124*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 125*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workersw2: 128*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) 129*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workersw.epilog: 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker;; test6 - Some cases of the second switch are pruned during optimization. 136*9880d681SAndroid Build Coastguard Worker;; Then the second switch will be converted to a branch, finally, the first 137*9880d681SAndroid Build Coastguard Worker;; switch and the branch will be merged into a single switch. 138*9880d681SAndroid Build Coastguard Workerdefine void @test6(i32 %M, i32 %N) nounwind uwtable { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw2 [ 141*9880d681SAndroid Build Coastguard Worker i32 1, label %sw2 142*9880d681SAndroid Build Coastguard Worker i32 2, label %sw.bb 143*9880d681SAndroid Build Coastguard Worker i32 3, label %sw.bb1 144*9880d681SAndroid Build Coastguard Worker ], !prof !4 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 146*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw.epilog 147*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb1 148*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.bb 149*9880d681SAndroid Build Coastguard Worker; CHECK: i32 4, label %sw.bb5 150*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !4 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workersw.bb: 153*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 154*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workersw.bb1: 157*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 158*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workersw2: 161*9880d681SAndroid Build Coastguard Worker;; Here "case 2" is invalidated since the default case of the first switch 162*9880d681SAndroid Build Coastguard Worker;; does not include "case 2". 163*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw.epilog [ 164*9880d681SAndroid Build Coastguard Worker i32 2, label %sw.bb4 165*9880d681SAndroid Build Coastguard Worker i32 4, label %sw.bb5 166*9880d681SAndroid Build Coastguard Worker ], !prof !5 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workersw.bb4: 169*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) 170*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workersw.bb5: 173*9880d681SAndroid Build Coastguard Worker call void @helper(i32 3) 174*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workersw.epilog: 177*9880d681SAndroid Build Coastguard Worker ret void 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker;; This test is based on test1 but swapped the targets of the second branch. 181*9880d681SAndroid Build Coastguard Workerdefine void @test1_swap(i1 %a, i1 %b) { 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1_swap( 183*9880d681SAndroid Build Coastguard Workerentry: 184*9880d681SAndroid Build Coastguard Worker br i1 %a, label %Y, label %X, !prof !0 185*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Y, label %Z, !prof !5 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard WorkerX: 188*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 189*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Y, label %Z, !prof !1 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard WorkerY: 192*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 193*9880d681SAndroid Build Coastguard Worker ret void 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard WorkerZ: 196*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 197*9880d681SAndroid Build Coastguard Worker ret void 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Workerdefine void @test7(i1 %a, i1 %b) { 201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 202*9880d681SAndroid Build Coastguard Workerentry: 203*9880d681SAndroid Build Coastguard Worker %c = or i1 %b, false 204*9880d681SAndroid Build Coastguard Worker br i1 %a, label %Y, label %X, !prof !0 205*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %brmerge, label %Y, label %Z, !prof !6 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard WorkerX: 208*9880d681SAndroid Build Coastguard Worker br i1 %c, label %Y, label %Z, !prof !6 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard WorkerY: 211*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 212*9880d681SAndroid Build Coastguard Worker ret void 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard WorkerZ: 215*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) 216*9880d681SAndroid Build Coastguard Worker ret void 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker; Test basic folding to a conditional branch. 220*9880d681SAndroid Build Coastguard Workerdefine void @test8(i64 %x, i64 %y) nounwind { 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 222*9880d681SAndroid Build Coastguard Workerentry: 223*9880d681SAndroid Build Coastguard Worker %lt = icmp slt i64 %x, %y 224*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %lt, label %a, label %b, !prof !7 225*9880d681SAndroid Build Coastguard Worker %qux = select i1 %lt, i32 0, i32 2 226*9880d681SAndroid Build Coastguard Worker switch i32 %qux, label %bees [ 227*9880d681SAndroid Build Coastguard Worker i32 0, label %a 228*9880d681SAndroid Build Coastguard Worker i32 1, label %b 229*9880d681SAndroid Build Coastguard Worker i32 2, label %b 230*9880d681SAndroid Build Coastguard Worker ], !prof !7 231*9880d681SAndroid Build Coastguard Workera: 232*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind 233*9880d681SAndroid Build Coastguard Worker ret void 234*9880d681SAndroid Build Coastguard Workerb: 235*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind 236*9880d681SAndroid Build Coastguard Worker ret void 237*9880d681SAndroid Build Coastguard Workerbees: 238*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) nounwind 239*9880d681SAndroid Build Coastguard Worker ret void 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker; Test edge splitting when the default target has icmp and unconditinal 243*9880d681SAndroid Build Coastguard Worker; branch 244*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i32 %x, i32 %y) nounwind { 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 246*9880d681SAndroid Build Coastguard Workerentry: 247*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %bees [ 248*9880d681SAndroid Build Coastguard Worker i32 0, label %a 249*9880d681SAndroid Build Coastguard Worker i32 1, label %end 250*9880d681SAndroid Build Coastguard Worker i32 2, label %end 251*9880d681SAndroid Build Coastguard Worker ], !prof !7 252*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %x, label %bees [ 253*9880d681SAndroid Build Coastguard Worker; CHECK: i32 0, label %a 254*9880d681SAndroid Build Coastguard Worker; CHECK: i32 1, label %end 255*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %end 256*9880d681SAndroid Build Coastguard Worker; CHECK: i32 92, label %end 257*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !8 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workera: 260*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind 261*9880d681SAndroid Build Coastguard Worker %reta = icmp slt i32 %x, %y 262*9880d681SAndroid Build Coastguard Worker ret i1 %reta 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerbees: 265*9880d681SAndroid Build Coastguard Worker %tmp = icmp eq i32 %x, 92 266*9880d681SAndroid Build Coastguard Worker br label %end 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerend: 269*9880d681SAndroid Build Coastguard Worker; CHECK: end: 270*9880d681SAndroid Build Coastguard Worker; CHECK: %ret = phi i1 [ true, %entry ], [ false, %bees ], [ true, %entry ], [ true, %entry ] 271*9880d681SAndroid Build Coastguard Worker %ret = phi i1 [ true, %entry ], [%tmp, %bees], [true, %entry] 272*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) nounwind 273*9880d681SAndroid Build Coastguard Worker ret i1 %ret 274*9880d681SAndroid Build Coastguard Worker} 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Workerdefine void @test10(i32 %x) nounwind readnone ssp noredzone { 277*9880d681SAndroid Build Coastguard Workerentry: 278*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %lor.rhs [ 279*9880d681SAndroid Build Coastguard Worker i32 2, label %lor.end 280*9880d681SAndroid Build Coastguard Worker i32 1, label %lor.end 281*9880d681SAndroid Build Coastguard Worker i32 3, label %lor.end 282*9880d681SAndroid Build Coastguard Worker ], !prof !7 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Workerlor.rhs: 285*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind 286*9880d681SAndroid Build Coastguard Worker ret void 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerlor.end: 289*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind 290*9880d681SAndroid Build Coastguard Worker ret void 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 293*9880d681SAndroid Build Coastguard Worker; CHECK: %x.off = add i32 %x, -1 294*9880d681SAndroid Build Coastguard Worker; CHECK: %switch = icmp ult i32 %x.off, 3 295*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %switch, label %lor.end, label %lor.rhs, !prof !9 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker; Remove dead cases from the switch. 299*9880d681SAndroid Build Coastguard Workerdefine void @test11(i32 %x) nounwind { 300*9880d681SAndroid Build Coastguard Worker %i = shl i32 %x, 1 301*9880d681SAndroid Build Coastguard Worker switch i32 %i, label %a [ 302*9880d681SAndroid Build Coastguard Worker i32 21, label %b 303*9880d681SAndroid Build Coastguard Worker i32 24, label %c 304*9880d681SAndroid Build Coastguard Worker ], !prof !8 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 306*9880d681SAndroid Build Coastguard Worker; CHECK: %cond = icmp eq i32 %i, 24 307*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cond, label %c, label %a, !prof !10 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Workera: 310*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind 311*9880d681SAndroid Build Coastguard Worker ret void 312*9880d681SAndroid Build Coastguard Workerb: 313*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind 314*9880d681SAndroid Build Coastguard Worker ret void 315*9880d681SAndroid Build Coastguard Workerc: 316*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) nounwind 317*9880d681SAndroid Build Coastguard Worker ret void 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker;; test12 - Don't crash if the whole switch is removed 321*9880d681SAndroid Build Coastguard Workerdefine void @test12(i32 %M, i32 %N) nounwind uwtable { 322*9880d681SAndroid Build Coastguard Workerentry: 323*9880d681SAndroid Build Coastguard Worker switch i32 %N, label %sw.bb [ 324*9880d681SAndroid Build Coastguard Worker i32 1, label %sw.bb 325*9880d681SAndroid Build Coastguard Worker ], !prof !9 326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @helper 329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Workersw.bb: 332*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) 333*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workersw.epilog: 336*9880d681SAndroid Build Coastguard Worker ret void 337*9880d681SAndroid Build Coastguard Worker} 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker;; If every case is dead, make sure they are all removed. This used to 340*9880d681SAndroid Build Coastguard Worker;; crash trying to merge the metadata. 341*9880d681SAndroid Build Coastguard Workerdefine void @test13(i32 %x) nounwind { 342*9880d681SAndroid Build Coastguard Workerentry: 343*9880d681SAndroid Build Coastguard Worker %i = shl i32 %x, 1 344*9880d681SAndroid Build Coastguard Worker switch i32 %i, label %a [ 345*9880d681SAndroid Build Coastguard Worker i32 21, label %b 346*9880d681SAndroid Build Coastguard Worker i32 25, label %c 347*9880d681SAndroid Build Coastguard Worker ], !prof !8 348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @helper 351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workera: 354*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind 355*9880d681SAndroid Build Coastguard Worker ret void 356*9880d681SAndroid Build Coastguard Workerb: 357*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind 358*9880d681SAndroid Build Coastguard Worker ret void 359*9880d681SAndroid Build Coastguard Workerc: 360*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) nounwind 361*9880d681SAndroid Build Coastguard Worker ret void 362*9880d681SAndroid Build Coastguard Worker} 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker;; When folding branches to common destination, the updated branch weights 365*9880d681SAndroid Build Coastguard Worker;; can exceed uint32 by more than factor of 2. We should keep halving the 366*9880d681SAndroid Build Coastguard Worker;; weights until they can fit into uint32. 367*9880d681SAndroid Build Coastguard Worker@max_regno = common global i32 0, align 4 368*9880d681SAndroid Build Coastguard Workerdefine void @test14(i32* %old, i32 %final) { 369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14 370*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %for.exit, label %for.inc, !prof !11 371*9880d681SAndroid Build Coastguard Workerfor.cond: 372*9880d681SAndroid Build Coastguard Worker br label %for.cond2 373*9880d681SAndroid Build Coastguard Workerfor.cond2: 374*9880d681SAndroid Build Coastguard Worker %i.1 = phi i32 [ %inc19, %for.inc ], [ 0, %for.cond ] 375*9880d681SAndroid Build Coastguard Worker %bit.0 = phi i32 [ %shl, %for.inc ], [ 1, %for.cond ] 376*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %bit.0, 0 377*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.exit, label %for.body3, !prof !10 378*9880d681SAndroid Build Coastguard Workerfor.body3: 379*9880d681SAndroid Build Coastguard Worker %v3 = load i32, i32* @max_regno, align 4 380*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp eq i32 %i.1, %v3 381*9880d681SAndroid Build Coastguard Worker br i1 %cmp4, label %for.exit, label %for.inc, !prof !11 382*9880d681SAndroid Build Coastguard Workerfor.inc: 383*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %bit.0, 1 384*9880d681SAndroid Build Coastguard Worker %inc19 = add nsw i32 %i.1, 1 385*9880d681SAndroid Build Coastguard Worker br label %for.cond2 386*9880d681SAndroid Build Coastguard Workerfor.exit: 387*9880d681SAndroid Build Coastguard Worker ret void 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker; Don't drop the metadata. 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Workerdefine i32 @HoistThenElseCodeToIf(i32 %n) { 393*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @HoistThenElseCodeToIf( 394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 395*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 %n, 0 396*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL]], i32 1, i32 234, !prof !12 397*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[DOT]] 398*9880d681SAndroid Build Coastguard Worker; 399*9880d681SAndroid Build Coastguard Workerentry: 400*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %n, 0 401*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if, label %else, !prof !0 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerif: 404*9880d681SAndroid Build Coastguard Worker br label %return 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Workerelse: 407*9880d681SAndroid Build Coastguard Worker br label %return 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Workerreturn: 410*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ 1, %if ], [ 234, %else ] 411*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 412*9880d681SAndroid Build Coastguard Worker} 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker; The selects should have freshly calculated branch weights. 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Workerdefine i32 @SimplifyCondBranchToCondBranch(i1 %cmpa, i1 %cmpb) { 417*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @SimplifyCondBranchToCondBranch( 418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block1: 419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 %cmpa, %cmpb 420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 %cmpa, i32 0, i32 2, !prof !13 421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !14 422*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OUTVAL]] 423*9880d681SAndroid Build Coastguard Worker; 424*9880d681SAndroid Build Coastguard Workerblock1: 425*9880d681SAndroid Build Coastguard Worker br i1 %cmpa, label %block3, label %block2, !prof !13 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Workerblock2: 428*9880d681SAndroid Build Coastguard Worker br i1 %cmpb, label %block3, label %exit, !prof !14 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Workerblock3: 431*9880d681SAndroid Build Coastguard Worker %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ] 432*9880d681SAndroid Build Coastguard Worker br label %exit 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Workerexit: 435*9880d681SAndroid Build Coastguard Worker %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ] 436*9880d681SAndroid Build Coastguard Worker ret i32 %outval 437*9880d681SAndroid Build Coastguard Worker} 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker; Swap the operands of the compares to verify that the weights update correctly. 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Workerdefine i32 @SimplifyCondBranchToCondBranchSwap(i1 %cmpa, i1 %cmpb) { 442*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwap( 443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block1: 444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMPA_NOT:%.*]] = xor i1 %cmpa, true 445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMPB_NOT:%.*]] = xor i1 %cmpb, true 446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]] 447*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !15 448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !16 449*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OUTVAL]] 450*9880d681SAndroid Build Coastguard Worker; 451*9880d681SAndroid Build Coastguard Workerblock1: 452*9880d681SAndroid Build Coastguard Worker br i1 %cmpa, label %block2, label %block3, !prof !13 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Workerblock2: 455*9880d681SAndroid Build Coastguard Worker br i1 %cmpb, label %exit, label %block3, !prof !14 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Workerblock3: 458*9880d681SAndroid Build Coastguard Worker %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ] 459*9880d681SAndroid Build Coastguard Worker br label %exit 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Workerexit: 462*9880d681SAndroid Build Coastguard Worker %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ] 463*9880d681SAndroid Build Coastguard Worker ret i32 %outval 464*9880d681SAndroid Build Coastguard Worker} 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Workerdefine i32 @SimplifyCondBranchToCondBranchSwapMissingWeight(i1 %cmpa, i1 %cmpb) { 467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwapMissingWeight( 468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block1: 469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMPA_NOT:%.*]] = xor i1 %cmpa, true 470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMPB_NOT:%.*]] = xor i1 %cmpb, true 471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]] 472*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !17 473*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !18 474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OUTVAL]] 475*9880d681SAndroid Build Coastguard Worker; 476*9880d681SAndroid Build Coastguard Workerblock1: 477*9880d681SAndroid Build Coastguard Worker br i1 %cmpa, label %block2, label %block3, !prof !13 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Workerblock2: 480*9880d681SAndroid Build Coastguard Worker br i1 %cmpb, label %exit, label %block3 481*9880d681SAndroid Build Coastguard Worker 482*9880d681SAndroid Build Coastguard Workerblock3: 483*9880d681SAndroid Build Coastguard Worker %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ] 484*9880d681SAndroid Build Coastguard Worker br label %exit 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Workerexit: 487*9880d681SAndroid Build Coastguard Worker %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ] 488*9880d681SAndroid Build Coastguard Worker ret i32 %outval 489*9880d681SAndroid Build Coastguard Worker} 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 3, i32 5} 492*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 1, i32 1} 493*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 1, i32 2} 494*9880d681SAndroid Build Coastguard Worker!3 = !{!"branch_weights", i32 4, i32 3, i32 2, i32 1} 495*9880d681SAndroid Build Coastguard Worker!4 = !{!"branch_weights", i32 4, i32 3, i32 2, i32 1} 496*9880d681SAndroid Build Coastguard Worker!5 = !{!"branch_weights", i32 7, i32 6, i32 5} 497*9880d681SAndroid Build Coastguard Worker!6 = !{!"branch_weights", i32 1, i32 3} 498*9880d681SAndroid Build Coastguard Worker!7 = !{!"branch_weights", i32 33, i32 9, i32 8, i32 7} 499*9880d681SAndroid Build Coastguard Worker!8 = !{!"branch_weights", i32 33, i32 9, i32 8} 500*9880d681SAndroid Build Coastguard Worker!9 = !{!"branch_weights", i32 7, i32 6} 501*9880d681SAndroid Build Coastguard Worker!10 = !{!"branch_weights", i32 672646, i32 21604207} 502*9880d681SAndroid Build Coastguard Worker!11 = !{!"branch_weights", i32 6960, i32 21597248} 503*9880d681SAndroid Build Coastguard Worker!12 = !{!"these_are_not_the_branch_weights_you_are_looking_for", i32 3, i32 5} 504*9880d681SAndroid Build Coastguard Worker!13 = !{!"branch_weights", i32 2, i32 3} 505*9880d681SAndroid Build Coastguard Worker!14 = !{!"branch_weights", i32 4, i32 7} 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Worker; CHECK: !0 = !{!"branch_weights", i32 5, i32 11} 508*9880d681SAndroid Build Coastguard Worker; CHECK: !1 = !{!"branch_weights", i32 1, i32 3} 509*9880d681SAndroid Build Coastguard Worker; CHECK: !2 = !{!"branch_weights", i32 1, i32 5} 510*9880d681SAndroid Build Coastguard Worker; CHECK: !3 = !{!"branch_weights", i32 7, i32 1, i32 2} 511*9880d681SAndroid Build Coastguard Worker; CHECK: !4 = !{!"branch_weights", i32 49, i32 12, i32 24, i32 35} 512*9880d681SAndroid Build Coastguard Worker; CHECK: !5 = !{!"branch_weights", i32 11, i32 5} 513*9880d681SAndroid Build Coastguard Worker; CHECK: !6 = !{!"branch_weights", i32 17, i32 15} 514*9880d681SAndroid Build Coastguard Worker; CHECK: !7 = !{!"branch_weights", i32 9, i32 7} 515*9880d681SAndroid Build Coastguard Worker; CHECK: !8 = !{!"branch_weights", i32 17, i32 9, i32 8, i32 7, i32 17} 516*9880d681SAndroid Build Coastguard Worker; CHECK: !9 = !{!"branch_weights", i32 24, i32 33} 517*9880d681SAndroid Build Coastguard Worker; CHECK: !10 = !{!"branch_weights", i32 8, i32 33} 518*9880d681SAndroid Build Coastguard Worker;; The false weight prints out as a negative integer here, but inside llvm, we 519*9880d681SAndroid Build Coastguard Worker;; treat the weight as an unsigned integer. 520*9880d681SAndroid Build Coastguard Worker; CHECK: !11 = !{!"branch_weights", i32 112017436, i32 -735157296} 521*9880d681SAndroid Build Coastguard Worker; CHECK: !12 = !{!"branch_weights", i32 3, i32 5} 522*9880d681SAndroid Build Coastguard Worker; CHECK: !13 = !{!"branch_weights", i32 22, i32 12} 523*9880d681SAndroid Build Coastguard Worker; CHECK: !14 = !{!"branch_weights", i32 34, i32 21} 524*9880d681SAndroid Build Coastguard Worker; CHECK: !15 = !{!"branch_weights", i32 33, i32 14} 525*9880d681SAndroid Build Coastguard Worker; CHECK: !16 = !{!"branch_weights", i32 47, i32 8} 526*9880d681SAndroid Build Coastguard Worker; CHECK: !17 = !{!"branch_weights", i32 6, i32 2} 527*9880d681SAndroid Build Coastguard Worker; CHECK: !18 = !{!"branch_weights", i32 8, i32 2} 528