Skip to content

Commit c2dacb1

Browse files
committed
[SimplifyCFG] Fold branch to common dest: if branch is unpredictable, prefer to speculate
This is consistent with the two other usages of prof md in this pass.
1 parent 59a5964 commit c2dacb1

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3054,7 +3054,8 @@ shouldFoldCondBranchesToCommonDestination(BranchInst *BI, BranchInst *PBI,
30543054
// predecessor branch is predictable, we may not want to merge them.
30553055
uint64_t PTWeight, PFWeight;
30563056
BranchProbability PBITrueProb, Likely;
3057-
if (TTI && PBI->extractProfMetadata(PTWeight, PFWeight) &&
3057+
if (TTI && !PBI->getMetadata(LLVMContext::MD_unpredictable) &&
3058+
PBI->extractProfMetadata(PTWeight, PFWeight) &&
30583059
(PTWeight + PFWeight) != 0) {
30593060
PBITrueProb =
30603061
BranchProbability::getBranchProbability(PTWeight, PTWeight + PFWeight);

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

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -733,10 +733,9 @@ define void @or_icmps_probably_not_harmful(i32 %x, i32 %y, i8* %p) {
733733
; CHECK-LABEL: @or_icmps_probably_not_harmful(
734734
; CHECK-NEXT: entry:
735735
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
736-
; CHECK-NEXT: br i1 [[EXPECTED_TRUE]], label [[EXIT:%.*]], label [[RARE:%.*]], !prof [[PROF19]], !unpredictable !21
737-
; CHECK: rare:
738736
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
739-
; CHECK-NEXT: br i1 [[EXPENSIVE]], label [[EXIT]], label [[FALSE:%.*]]
737+
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
738+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF21:![0-9]+]], !unpredictable !22
740739
; CHECK: false:
741740
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
742741
; CHECK-NEXT: br label [[EXIT]]
@@ -768,7 +767,7 @@ define void @or_icmps_not_that_harmful(i32 %x, i32 %y, i8* %p) {
768767
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
769768
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
770769
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
771-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF22:![0-9]+]]
770+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23:![0-9]+]]
772771
; CHECK: false:
773772
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
774773
; CHECK-NEXT: br label [[EXIT]]
@@ -800,7 +799,7 @@ define void @or_icmps_not_that_harmful_inverted(i32 %x, i32 %y, i8* %p) {
800799
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
801800
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
802801
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
803-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23:![0-9]+]]
802+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24:![0-9]+]]
804803
; CHECK: false:
805804
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
806805
; CHECK-NEXT: br label [[EXIT]]
@@ -831,7 +830,7 @@ define void @or_icmps_useful(i32 %x, i32 %y, i8* %p) {
831830
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
832831
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
833832
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
834-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24:![0-9]+]]
833+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF25:![0-9]+]]
835834
; CHECK: false:
836835
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
837836
; CHECK-NEXT: br label [[EXIT]]
@@ -862,7 +861,7 @@ define void @or_icmps_useful_inverted(i32 %x, i32 %y, i8* %p) {
862861
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
863862
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
864863
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 true, i1 [[EXPENSIVE]]
865-
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24]]
864+
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF25]]
866865
; CHECK: false:
867866
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
868867
; CHECK-NEXT: br label [[EXIT]]
@@ -991,7 +990,7 @@ define void @and_icmps_not_that_harmful(i32 %x, i32 %y, i8* %p) {
991990
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
992991
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
993992
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
994-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25:![0-9]+]]
993+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26:![0-9]+]]
995994
; CHECK: false:
996995
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
997996
; CHECK-NEXT: br label [[EXIT]]
@@ -1023,7 +1022,7 @@ define void @and_icmps_not_that_harmful_inverted(i32 %x, i32 %y, i8* %p) {
10231022
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
10241023
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
10251024
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
1026-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25]]
1025+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26]]
10271026
; CHECK: false:
10281027
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
10291028
; CHECK-NEXT: br label [[EXIT]]
@@ -1054,7 +1053,7 @@ define void @and_icmps_useful(i32 %x, i32 %y, i8* %p) {
10541053
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
10551054
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
10561055
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
1057-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26:![0-9]+]]
1056+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF27:![0-9]+]]
10581057
; CHECK: false:
10591058
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
10601059
; CHECK-NEXT: br label [[EXIT]]
@@ -1085,7 +1084,7 @@ define void @and_icmps_useful_inverted(i32 %x, i32 %y, i8* %p) {
10851084
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sle i32 [[X:%.*]], -1
10861085
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
10871086
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
1088-
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26]]
1087+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF27]]
10891088
; CHECK: false:
10901089
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
10911090
; CHECK-NEXT: br label [[EXIT]]
@@ -1157,10 +1156,11 @@ exit:
11571156
; CHECK: [[PROF18]] = !{!"branch_weights", i32 8, i32 2}
11581157
; CHECK: [[PROF19]] = !{!"branch_weights", i32 99, i32 1}
11591158
; CHECK: [[PROF20]] = !{!"branch_weights", i32 1, i32 99}
1160-
; CHECK: [[META21:![0-9]+]] = !{}
1161-
; CHECK: [[PROF22]] = !{!"branch_weights", i32 197, i32 1}
1162-
; CHECK: [[PROF23]] = !{!"branch_weights", i32 100, i32 98}
1163-
; CHECK: [[PROF24]] = !{!"branch_weights", i32 101, i32 99}
1164-
; CHECK: [[PROF25]] = !{!"branch_weights", i32 1, i32 197}
1165-
; CHECK: [[PROF26]] = !{!"branch_weights", i32 99, i32 101}
1159+
; CHECK: [[PROF21]] = !{!"branch_weights", i32 199, i32 1}
1160+
; CHECK: [[META22:![0-9]+]] = !{}
1161+
; CHECK: [[PROF23]] = !{!"branch_weights", i32 197, i32 1}
1162+
; CHECK: [[PROF24]] = !{!"branch_weights", i32 100, i32 98}
1163+
; CHECK: [[PROF25]] = !{!"branch_weights", i32 101, i32 99}
1164+
; CHECK: [[PROF26]] = !{!"branch_weights", i32 1, i32 197}
1165+
; CHECK: [[PROF27]] = !{!"branch_weights", i32 99, i32 101}
11661166
;.

0 commit comments

Comments
 (0)