@@ -412,22 +412,48 @@ return:
412412 ret i32 %retval.0
413413}
414414
415- ; The 1st select should have branch weights equal to the 1st branch.
416- ; The 2nd select should have freshly calculated branch weights.
415+ ; The selects should have freshly calculated branch weights.
417416
418417define i32 @SimplifyCondBranchToCondBranch (i1 %cmpa , i1 %cmpb ) {
419418; CHECK-LABEL: @SimplifyCondBranchToCondBranch(
420419; CHECK-NEXT: block1:
421- ; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 %cmpb , %cmpa
422- ; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 %cmpb , i32 0, i32 2
423- ; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !12
420+ ; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 %cmpa , %cmpb
421+ ; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 %cmpa , i32 0, i32 2, !prof !12
422+ ; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !13
424423; CHECK-NEXT: ret i32 [[OUTVAL]]
425424;
426425block1:
427- br i1 %cmpb , label %block3 , label %block2 , !prof !0
426+ br i1 %cmpa , label %block3 , label %block2 , !prof !13
428427
429428block2:
430- br i1 %cmpa , label %block3 , label %exit , !prof !2
429+ br i1 %cmpb , label %block3 , label %exit , !prof !14
430+
431+ block3:
432+ %cowval = phi i32 [ 2 , %block2 ], [ 0 , %block1 ]
433+ br label %exit
434+
435+ exit:
436+ %outval = phi i32 [ %cowval , %block3 ], [ 1 , %block2 ]
437+ ret i32 %outval
438+ }
439+
440+ ; Swap the operands of the compares to verify that the weights update correctly.
441+
442+ define i32 @SimplifyCondBranchToCondBranchSwap (i1 %cmpa , i1 %cmpb ) {
443+ ; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwap(
444+ ; CHECK-NEXT: block1:
445+ ; CHECK-NEXT: [[CMPA_NOT:%.*]] = xor i1 %cmpa, true
446+ ; CHECK-NEXT: [[CMPB_NOT:%.*]] = xor i1 %cmpb, true
447+ ; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]]
448+ ; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !14
449+ ; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !15
450+ ; CHECK-NEXT: ret i32 [[OUTVAL]]
451+ ;
452+ block1:
453+ br i1 %cmpa , label %block2 , label %block3 , !prof !13
454+
455+ block2:
456+ br i1 %cmpb , label %exit , label %block3 , !prof !14
431457
432458block3:
433459 %cowval = phi i32 [ 2 , %block2 ], [ 0 , %block1 ]
@@ -452,6 +478,8 @@ exit:
452478!10 = !{!"branch_weights" , i32 672646 , i32 21604207 }
453479!11 = !{!"branch_weights" , i32 6960 , i32 21597248 }
454480!12 = !{!"these_are_not_the_branch_weights_you_are_looking_for" , i32 3 , i32 5 }
481+ !13 = !{!"branch_weights" , i32 2 , i32 3 }
482+ !14 = !{!"branch_weights" , i32 4 , i32 7 }
455483
456484; CHECK: !0 = !{!"branch_weights", i32 5, i32 11}
457485; CHECK: !1 = !{!"branch_weights", i32 1, i32 5}
@@ -467,5 +495,8 @@ exit:
467495;; treat the weight as an unsigned integer.
468496; CHECK: !10 = !{!"branch_weights", i32 112017436, i32 -735157296}
469497; CHECK: !11 = !{!"branch_weights", i32 3, i32 5}
470- ; CHECK: !12 = !{!"branch_weights", i32 14, i32 10}
498+ ; CHECK: !12 = !{!"branch_weights", i32 22, i32 12}
499+ ; CHECK: !13 = !{!"branch_weights", i32 34, i32 21}
500+ ; CHECK: !14 = !{!"branch_weights", i32 33, i32 14}
501+ ; CHECK: !15 = !{!"branch_weights", i32 47, i32 8}
471502
0 commit comments