Skip to content

Commit ea56ca2

Browse files
[CHR] Make Selects Created in MergedCondition have Unknown Profdata (#167534)
These selects are dependent on values live into the CHRScope that we cannot infer anything about, so mark the branch weights unknown. These selects usually also just get folded down into a icmps, so the profile information ends up being kind of redundant.
1 parent ccb5145 commit ea56ca2

File tree

3 files changed

+47
-27
lines changed

3 files changed

+47
-27
lines changed

llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,8 @@ void CHR::addToMergedCondition(bool IsTrueBiased, Value *Cond,
19921992

19931993
// Use logical and to avoid propagating poison from later conditions.
19941994
MergedCondition = IRB.CreateLogicalAnd(MergedCondition, Cond);
1995+
setExplicitlyUnknownBranchWeightsIfProfiled(
1996+
*cast<Instruction>(MergedCondition), DEBUG_TYPE);
19951997
}
19961998

19971999
void CHR::transformScopes(SmallVectorImpl<CHRScope *> &CHRScopes) {

llvm/test/Transforms/PGOProfile/chr-lifetimes.ll

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
22
; RUN: opt < %s -passes='require<profile-summary>,chr' -S | FileCheck %s
33

44
declare void @foo()
@@ -14,21 +14,21 @@ define void @test_chr_with_lifetimes(ptr %i) !prof !14 {
1414
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I:%.*]], align 4
1515
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
1616
; CHECK-NEXT: [[TMP9:%.*]] = freeze i1 [[TMP1]]
17-
; CHECK-NEXT: [[TMP10:%.*]] = select i1 true, i1 [[TMP9]], i1 false
17+
; CHECK-NEXT: [[TMP8:%.*]] = select i1 true, i1 [[TMP9]], i1 false, !prof [[PROF15:![0-9]+]]
1818
; CHECK-NEXT: [[TMP11:%.*]] = freeze i1 [[TMP1]]
19-
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP10]], i1 [[TMP11]], i1 false
20-
; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15:![0-9]+]]
19+
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP8]], i1 [[TMP11]], i1 false, !prof [[PROF15]]
20+
; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF16:![0-9]+]]
2121
; CHECK: entry.split:
22-
; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF16:![0-9]+]]
22+
; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF17:![0-9]+]]
2323
; CHECK-NEXT: call void @baz(i64 [[TMP6]])
24-
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF17:![0-9]+]]
24+
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF18:![0-9]+]]
2525
; CHECK: bb0:
2626
; CHECK-NEXT: call void @foo()
2727
; CHECK-NEXT: br label [[BB1]]
2828
; CHECK: entry.split.nonchr:
29-
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF16]]
29+
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF17]]
3030
; CHECK-NEXT: call void @baz(i64 [[TMP7]])
31-
; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]]
31+
; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF17]]
3232
; CHECK: bb0.nonchr:
3333
; CHECK-NEXT: call void @foo()
3434
; CHECK-NEXT: br label [[BB1]]
@@ -83,24 +83,24 @@ define void @test_chr_dynamic_alloca(ptr %i) !prof !14 {
8383
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4
8484
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
8585
; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
86-
; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false
86+
; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false, !prof [[PROF15]]
8787
; CHECK-NEXT: [[TMP4:%.*]] = freeze i1 [[TMP1]]
88-
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false
89-
; CHECK-NEXT: br i1 [[TMP5]], label [[BB4_SPLIT:%.*]], label [[BB4_SPLIT_NONCHR:%.*]], !prof [[PROF15]]
88+
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false, !prof [[PROF15]]
89+
; CHECK-NEXT: br i1 [[TMP5]], label [[BB4_SPLIT:%.*]], label [[BB4_SPLIT_NONCHR:%.*]], !prof [[PROF16]]
9090
; CHECK: bb4.split:
91-
; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF16]]
91+
; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF17]]
9292
; CHECK-NEXT: [[TEST:%.*]] = alloca i32, align 8
9393
; CHECK-NEXT: call void @baz(i64 [[TMP6]])
94-
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF17]]
94+
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF18]]
9595
; CHECK: bb0:
9696
; CHECK-NEXT: call void @foo()
9797
; CHECK-NEXT: store ptr [[TEST]], ptr [[I]], align 8
9898
; CHECK-NEXT: br label [[BB1]]
9999
; CHECK: bb4.split.nonchr:
100-
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF16]]
100+
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF17]]
101101
; CHECK-NEXT: [[TEST_NONCHR:%.*]] = alloca i32, align 8
102102
; CHECK-NEXT: call void @baz(i64 [[TMP7]])
103-
; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]]
103+
; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF17]]
104104
; CHECK: bb0.nonchr:
105105
; CHECK-NEXT: call void @foo()
106106
; CHECK-NEXT: store ptr [[TEST_NONCHR]], ptr [[I]], align 8
@@ -167,21 +167,21 @@ define void @test_no_move_allocas(ptr %i) !prof !14 {
167167
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I:%.*]], align 4
168168
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
169169
; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
170-
; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false
170+
; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false, !prof [[PROF15]]
171171
; CHECK-NEXT: [[TMP4:%.*]] = freeze i1 [[TMP1]]
172-
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false
173-
; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15]]
172+
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false, !prof [[PROF15]]
173+
; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF16]]
174174
; CHECK: entry.split:
175-
; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF16]]
175+
; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF17]]
176176
; CHECK-NEXT: call void @baz(i64 [[TMP6]])
177-
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF17]]
177+
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF18]]
178178
; CHECK: bb0:
179179
; CHECK-NEXT: call void @foo()
180180
; CHECK-NEXT: br label [[BB1]]
181181
; CHECK: entry.split.nonchr:
182-
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF16]]
182+
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF17]]
183183
; CHECK-NEXT: call void @baz(i64 [[TMP7]])
184-
; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]]
184+
; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF17]]
185185
; CHECK: bb0.nonchr:
186186
; CHECK-NEXT: call void @foo()
187187
; CHECK-NEXT: br label [[BB1]]
@@ -242,4 +242,26 @@ bb3:
242242

243243
!14 = !{!"function_entry_count", i64 100}
244244
!15 = !{!"branch_weights", i32 0, i32 1}
245-
; CHECK: !15 = !{!"branch_weights", i32 1000, i32 0}
245+
;.
246+
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
247+
;.
248+
; CHECK: [[META0:![0-9]+]] = !{i32 1, !"ProfileSummary", [[META1:![0-9]+]]}
249+
; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META3:![0-9]+]], [[META4:![0-9]+]], [[META5:![0-9]+]], [[META6:![0-9]+]], [[META7:![0-9]+]], [[META8:![0-9]+]], [[META9:![0-9]+]]}
250+
; CHECK: [[META2]] = !{!"ProfileFormat", !"InstrProf"}
251+
; CHECK: [[META3]] = !{!"TotalCount", i64 10000}
252+
; CHECK: [[META4]] = !{!"MaxCount", i64 10}
253+
; CHECK: [[META5]] = !{!"MaxInternalCount", i64 1}
254+
; CHECK: [[META6]] = !{!"MaxFunctionCount", i64 1000}
255+
; CHECK: [[META7]] = !{!"NumCounts", i64 3}
256+
; CHECK: [[META8]] = !{!"NumFunctions", i64 3}
257+
; CHECK: [[META9]] = !{!"DetailedSummary", [[META10:![0-9]+]]}
258+
; CHECK: [[META10]] = !{[[META11:![0-9]+]], [[META12:![0-9]+]], [[META13:![0-9]+]]}
259+
; CHECK: [[META11]] = !{i32 10000, i64 100, i32 1}
260+
; CHECK: [[META12]] = !{i32 999000, i64 100, i32 1}
261+
; CHECK: [[META13]] = !{i32 999999, i64 1, i32 2}
262+
; CHECK: [[META14:![0-9]+]] = !{!"function_entry_count", i64 100}
263+
; CHECK: [[PROF15]] = !{!"unknown", !"chr"}
264+
; CHECK: [[PROF16]] = !{!"branch_weights", i32 1000, i32 0}
265+
; CHECK: [[PROF17]] = !{!"branch_weights", i32 1, i32 0}
266+
; CHECK: [[PROF18]] = !{!"branch_weights", i32 0, i32 1}
267+
;.

llvm/utils/profcheck-xfail.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -608,10 +608,6 @@ Transforms/OpenMP/spmdization.ll
608608
Transforms/OpenMP/spmdization_no_guarding_two_reaching_kernels.ll
609609
Transforms/OpenMP/spmdization_remarks.ll
610610
Transforms/PartiallyInlineLibCalls/X86/good-prototype.ll
611-
Transforms/PGOProfile/chr-dead-pred.ll
612-
Transforms/PGOProfile/chr-dup-threshold.ll
613-
Transforms/PGOProfile/chr-lifetimes.ll
614-
Transforms/PGOProfile/chr-poison.ll
615611
Transforms/PGOProfile/comdat.ll
616612
Transforms/PGOProfile/memop_profile_funclet_wasm.ll
617613
Transforms/PGOProfile/X86/macho.ll

0 commit comments

Comments
 (0)