Skip to content

Commit 91952f1

Browse files
authored
[SimplifyCFG] Probabilities associated with same condition are constant (#155734)
The branch weights capture probability. The probability has everything to do with the (SSA) value the condition is predicated on, and nothing to do with the position in the CFG.
1 parent 58d2475 commit 91952f1

File tree

2 files changed

+35
-47
lines changed

2 files changed

+35
-47
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4812,23 +4812,12 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI,
48124812
SelectInst *NV = cast<SelectInst>(
48134813
Builder.CreateSelect(PBICond, PBIV, BIV, PBIV->getName() + ".mux"));
48144814
PN.setIncomingValue(PBBIdx, NV);
4815-
// Although the select has the same condition as PBI, the original branch
4816-
// weights for PBI do not apply to the new select because the select's
4817-
// 'logical' edges are incoming edges of the phi that is eliminated, not
4818-
// the outgoing edges of PBI.
4815+
// The select has the same condition as PBI, in the same BB. The
4816+
// probabilities don't change.
48194817
if (HasWeights) {
4820-
uint64_t PredCommon = PBIOp ? PredFalseWeight : PredTrueWeight;
4821-
uint64_t PredOther = PBIOp ? PredTrueWeight : PredFalseWeight;
4822-
uint64_t SuccCommon = BIOp ? SuccFalseWeight : SuccTrueWeight;
4823-
uint64_t SuccOther = BIOp ? SuccTrueWeight : SuccFalseWeight;
4824-
// The weight to PredCommonDest should be PredCommon * SuccTotal.
4825-
// The weight to PredOtherDest should be PredOther * SuccCommon.
4826-
uint64_t NewWeights[2] = {PredCommon * (SuccCommon + SuccOther),
4827-
PredOther * SuccCommon};
4828-
4829-
fitWeights(NewWeights);
4830-
4831-
setBranchWeights(NV, NewWeights[0], NewWeights[1],
4818+
uint64_t TrueWeight = PBIOp ? PredFalseWeight : PredTrueWeight;
4819+
uint64_t FalseWeight = PBIOp ? PredTrueWeight : PredFalseWeight;
4820+
setBranchWeights(NV, TrueWeight, FalseWeight,
48324821
/*IsExpected=*/false);
48334822
}
48344823
}

llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -610,8 +610,8 @@ define i32 @SimplifyCondBranchToCondBranchSwapMissingWeight(i1 %cmpa, i1 %cmpb)
610610
; CHECK-NEXT: [[CMPA_NOT:%.*]] = xor i1 [[CMPA:%.*]], true
611611
; CHECK-NEXT: [[CMPB_NOT:%.*]] = xor i1 [[CMPB:%.*]], true
612612
; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[CMPA_NOT]], i1 true, i1 [[CMPB_NOT]]
613-
; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof [[PROF17:![0-9]+]]
614-
; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof [[PROF18:![0-9]+]]
613+
; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof [[PROF15]]
614+
; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof [[PROF17:![0-9]+]]
615615
; CHECK-NEXT: ret i32 [[OUTVAL]]
616616
;
617617
block1:
@@ -636,7 +636,7 @@ define void @or_icmps_harmful(i32 %x, i32 %y, ptr %p) {
636636
; CHECK-LABEL: @or_icmps_harmful(
637637
; CHECK-NEXT: entry:
638638
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
639-
; CHECK-NEXT: br i1 [[EXPECTED_TRUE]], label [[EXIT:%.*]], label [[RARE:%.*]], !prof [[PROF19:![0-9]+]]
639+
; CHECK-NEXT: br i1 [[EXPECTED_TRUE]], label [[EXIT:%.*]], label [[RARE:%.*]], !prof [[PROF18:![0-9]+]]
640640
; CHECK: rare:
641641
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
642642
; CHECK-NEXT: br i1 [[EXPENSIVE]], label [[EXIT]], label [[FALSE:%.*]]
@@ -669,7 +669,7 @@ define void @or_icmps_harmful_inverted(i32 %x, i32 %y, ptr %p) {
669669
; CHECK-LABEL: @or_icmps_harmful_inverted(
670670
; CHECK-NEXT: entry:
671671
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
672-
; CHECK-NEXT: br i1 [[EXPECTED_FALSE]], label [[RARE:%.*]], label [[EXIT:%.*]], !prof [[PROF20:![0-9]+]]
672+
; CHECK-NEXT: br i1 [[EXPECTED_FALSE]], label [[RARE:%.*]], label [[EXIT:%.*]], !prof [[PROF19:![0-9]+]]
673673
; CHECK: rare:
674674
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
675675
; CHECK-NEXT: br i1 [[EXPENSIVE]], label [[EXIT]], label [[FALSE:%.*]]
@@ -702,7 +702,7 @@ define void @or_icmps_probably_not_harmful(i32 %x, i32 %y, ptr %p) {
702702
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
703703
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
704704
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
705-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF21:![0-9]+]], !unpredictable [[META22:![0-9]+]]
705+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF20:![0-9]+]], !unpredictable [[META21:![0-9]+]]
706706
; CHECK: false:
707707
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
708708
; CHECK-NEXT: br label [[EXIT]]
@@ -734,7 +734,7 @@ define void @or_icmps_not_that_harmful(i32 %x, i32 %y, ptr %p) {
734734
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
735735
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
736736
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
737-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23:![0-9]+]]
737+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF22:![0-9]+]]
738738
; CHECK: false:
739739
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
740740
; CHECK-NEXT: br label [[EXIT]]
@@ -766,7 +766,7 @@ define void @or_icmps_not_that_harmful_inverted(i32 %x, i32 %y, ptr %p) {
766766
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
767767
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
768768
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
769-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24:![0-9]+]]
769+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23:![0-9]+]]
770770
; CHECK: false:
771771
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
772772
; CHECK-NEXT: br label [[EXIT]]
@@ -797,7 +797,7 @@ define void @or_icmps_useful(i32 %x, i32 %y, ptr %p) {
797797
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
798798
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
799799
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
800-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF25:![0-9]+]]
800+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24:![0-9]+]]
801801
; CHECK: false:
802802
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
803803
; CHECK-NEXT: br label [[EXIT]]
@@ -828,7 +828,7 @@ define void @or_icmps_useful_inverted(i32 %x, i32 %y, ptr %p) {
828828
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
829829
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
830830
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 true, i1 [[EXPENSIVE]]
831-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF25]]
831+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24]]
832832
; CHECK: false:
833833
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
834834
; CHECK-NEXT: br label [[EXIT]]
@@ -889,7 +889,7 @@ define void @and_icmps_harmful(i32 %x, i32 %y, ptr %p) {
889889
; CHECK-LABEL: @and_icmps_harmful(
890890
; CHECK-NEXT: entry:
891891
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
892-
; CHECK-NEXT: br i1 [[EXPECTED_FALSE]], label [[RARE:%.*]], label [[EXIT:%.*]], !prof [[PROF20]]
892+
; CHECK-NEXT: br i1 [[EXPECTED_FALSE]], label [[RARE:%.*]], label [[EXIT:%.*]], !prof [[PROF19]]
893893
; CHECK: rare:
894894
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
895895
; CHECK-NEXT: br i1 [[EXPENSIVE]], label [[FALSE:%.*]], label [[EXIT]]
@@ -922,7 +922,7 @@ define void @and_icmps_harmful_inverted(i32 %x, i32 %y, ptr %p) {
922922
; CHECK-LABEL: @and_icmps_harmful_inverted(
923923
; CHECK-NEXT: entry:
924924
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
925-
; CHECK-NEXT: br i1 [[EXPECTED_TRUE]], label [[EXIT:%.*]], label [[RARE:%.*]], !prof [[PROF19]]
925+
; CHECK-NEXT: br i1 [[EXPECTED_TRUE]], label [[EXIT:%.*]], label [[RARE:%.*]], !prof [[PROF18]]
926926
; CHECK: rare:
927927
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
928928
; CHECK-NEXT: br i1 [[EXPENSIVE]], label [[FALSE:%.*]], label [[EXIT]]
@@ -957,7 +957,7 @@ define void @and_icmps_not_that_harmful(i32 %x, i32 %y, ptr %p) {
957957
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
958958
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
959959
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
960-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26:![0-9]+]]
960+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25:![0-9]+]]
961961
; CHECK: false:
962962
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
963963
; CHECK-NEXT: br label [[EXIT]]
@@ -989,7 +989,7 @@ define void @and_icmps_not_that_harmful_inverted(i32 %x, i32 %y, ptr %p) {
989989
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
990990
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
991991
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
992-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26]]
992+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25]]
993993
; CHECK: false:
994994
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
995995
; CHECK-NEXT: br label [[EXIT]]
@@ -1020,7 +1020,7 @@ define void @and_icmps_useful(i32 %x, i32 %y, ptr %p) {
10201020
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
10211021
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
10221022
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
1023-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF27:![0-9]+]]
1023+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26:![0-9]+]]
10241024
; CHECK: false:
10251025
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
10261026
; CHECK-NEXT: br label [[EXIT]]
@@ -1051,7 +1051,7 @@ define void @and_icmps_useful_inverted(i32 %x, i32 %y, ptr %p) {
10511051
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sle i32 [[X:%.*]], -1
10521052
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
10531053
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
1054-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF27]]
1054+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26]]
10551055
; CHECK: false:
10561056
; CHECK-NEXT: store i8 42, ptr [[P:%.*]], align 1
10571057
; CHECK-NEXT: br label [[EXIT]]
@@ -1096,11 +1096,11 @@ exit:
10961096
!19 = !{!"branch_weights", i32 0, i32 0}
10971097
!20 = !{}
10981098

1099-
;.
1099+
; .
11001100
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nounwind uwtable }
11011101
; CHECK: attributes #[[ATTR1]] = { nounwind }
11021102
; CHECK: attributes #[[ATTR2:[0-9]+]] = { noredzone nounwind ssp memory(none) }
1103-
;.
1103+
; .
11041104
; CHECK: [[PROF0]] = !{!"branch_weights", i32 5, i32 11}
11051105
; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 5}
11061106
; CHECK: [[PROF2]] = !{!"branch_weights", i32 1, i32 3}
@@ -1114,19 +1114,18 @@ exit:
11141114
; CHECK: [[PROF10]] = !{!"branch_weights", i32 8, i32 33}
11151115
; CHECK: [[PROF11]] = !{!"branch_weights", i32 112017436, i32 -735157296}
11161116
; CHECK: [[PROF12]] = !{!"branch_weights", i32 3, i32 5}
1117-
; CHECK: [[PROF13]] = !{!"branch_weights", i32 22, i32 12}
1117+
; CHECK: [[PROF13]] = !{!"branch_weights", i32 2, i32 3}
11181118
; CHECK: [[PROF14]] = !{!"branch_weights", i32 34, i32 21}
1119-
; CHECK: [[PROF15]] = !{!"branch_weights", i32 33, i32 14}
1119+
; CHECK: [[PROF15]] = !{!"branch_weights", i32 3, i32 2}
11201120
; CHECK: [[PROF16]] = !{!"branch_weights", i32 47, i32 8}
1121-
; CHECK: [[PROF17]] = !{!"branch_weights", i32 6, i32 2}
1122-
; CHECK: [[PROF18]] = !{!"branch_weights", i32 8, i32 2}
1123-
; CHECK: [[PROF19]] = !{!"branch_weights", i32 99, i32 1}
1124-
; CHECK: [[PROF20]] = !{!"branch_weights", i32 1, i32 99}
1125-
; CHECK: [[PROF21]] = !{!"branch_weights", i32 199, i32 1}
1126-
; CHECK: [[META22]] = !{}
1127-
; CHECK: [[PROF23]] = !{!"branch_weights", i32 197, i32 1}
1128-
; CHECK: [[PROF24]] = !{!"branch_weights", i32 100, i32 98}
1129-
; CHECK: [[PROF25]] = !{!"branch_weights", i32 101, i32 99}
1130-
; CHECK: [[PROF26]] = !{!"branch_weights", i32 1, i32 197}
1131-
; CHECK: [[PROF27]] = !{!"branch_weights", i32 99, i32 101}
1132-
;.
1121+
; CHECK: [[PROF17]] = !{!"branch_weights", i32 8, i32 2}
1122+
; CHECK: [[PROF18]] = !{!"branch_weights", i32 99, i32 1}
1123+
; CHECK: [[PROF19]] = !{!"branch_weights", i32 1, i32 99}
1124+
; CHECK: [[PROF20]] = !{!"branch_weights", i32 199, i32 1}
1125+
; CHECK: [[META21]] = !{}
1126+
; CHECK: [[PROF22]] = !{!"branch_weights", i32 197, i32 1}
1127+
; CHECK: [[PROF23]] = !{!"branch_weights", i32 100, i32 98}
1128+
; CHECK: [[PROF24]] = !{!"branch_weights", i32 101, i32 99}
1129+
; CHECK: [[PROF25]] = !{!"branch_weights", i32 1, i32 197}
1130+
; CHECK: [[PROF26]] = !{!"branch_weights", i32 99, i32 101}
1131+
; .

0 commit comments

Comments
 (0)