Skip to content

Commit cfc2260

Browse files
authored
InstrProf: Mark BiasLI as invariant. (#95588)
Bias doesn't change after startup. The test is enhanced for optimized sequences and atomic ops.
1 parent 52c08d7 commit cfc2260

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,9 @@ Value *InstrLowerer::getCounterAddress(InstrProfCntrInstBase *I) {
945945
IRBuilder<> EntryBuilder(&Fn->getEntryBlock().front());
946946
auto *Bias = getOrCreateBiasVar(getInstrProfCounterBiasVarName());
947947
BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias, "profc_bias");
948+
// Bias doesn't change after startup.
949+
BiasLI->setMetadata(LLVMContext::MD_invariant_load,
950+
MDNode::get(M.getContext(), std::nullopt));
948951
}
949952
auto *Add = Builder.CreateAdd(Builder.CreatePtrToInt(Addr, Int64Ty), BiasLI);
950953
return Builder.CreateIntToPtr(Add, Addr->getType());

llvm/test/Instrumentation/InstrProfiling/runtime-counter-relocation.ll

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
; RUN: opt < %s -S -passes=instrprof | FileCheck %s
22
; RUN: opt < %s -S -passes=instrprof -runtime-counter-relocation | FileCheck -check-prefixes=RELOC %s
3+
; RUN: opt < %s -S -passes=instrprof,inline,gvn -runtime-counter-relocation | FileCheck -check-prefixes=RELOC,RELOCOPT %s
4+
; RUN: opt < %s -S -passes=instrprof -runtime-counter-relocation -instrprof-atomic-counter-update-all | FileCheck -check-prefixes=ATOMIC %s
5+
; RUN: opt < %s -S -passes=instrprof,inline,gvn -runtime-counter-relocation -instrprof-atomic-counter-update-all | FileCheck -check-prefixes=ATOMIC,ATOMICOPT %s
36

47
target triple = "x86_64-unknown-linux-gnu"
58

69
@__profn_foo = private constant [3 x i8] c"foo"
10+
@__profn_bar = private constant [3 x i8] c"bar"
711
; RELOC: $__llvm_profile_counter_bias = comdat any
812
; RELOC: @__llvm_profile_counter_bias = linkonce_odr hidden global i64 0, comdat
913

@@ -12,14 +16,34 @@ target triple = "x86_64-unknown-linux-gnu"
1216
; CHECK-NEXT: %[[PGOCOUNTINC:.+]] = add i64 %[[PGOCOUNT]], 1
1317
; CHECK-NEXT: store i64 %[[PGOCOUNTINC]], ptr @__profc_foo
1418
; RELOC-LABEL: define void @foo
15-
; RELOC-NEXT: %[[BIAS:.+]] = load i64, ptr @__llvm_profile_counter_bias
19+
; RELOC-NEXT: %[[BIAS:.+]] = load i64, ptr @__llvm_profile_counter_bias, align 8, !invariant.load !0
1620
; RELOC-NEXT: %[[PROFC_BIAS:.+]] = add i64 ptrtoint (ptr @__profc_foo to i64), %[[BIAS]]
1721
; RELOC-NEXT: %[[PROFC_ADDR:.+]] = inttoptr i64 %[[PROFC_BIAS]] to ptr
1822
; RELOC-NEXT: %[[PGOCOUNT:.+]] = load i64, ptr %[[PROFC_ADDR]]
1923
; RELOC-NEXT: %[[PGOCOUNTINC:.+]] = add i64 %[[PGOCOUNT]], 1
2024
; RELOC-NEXT: store i64 %[[PGOCOUNTINC]], ptr %[[PROFC_ADDR]]
25+
; RELOCOPT-NEXT: %[[PROFC_BIAS1:.+]] = add i64 ptrtoint (ptr @__profc_bar to i64), %[[BIAS]]
26+
; RELOCOPT-NEXT: %[[PROFC_ADDR1:.+]] = inttoptr i64 %[[PROFC_BIAS1]] to ptr
27+
; RELOCOPT-NEXT: %[[PGOCOUNT1:.+]] = load i64, ptr %[[PROFC_ADDR1]]
28+
; RELOCOPT-NEXT: %[[PGOCOUNTINC1:.+]] = add i64 %[[PGOCOUNT1]], 1
29+
; RELOCOPT-NEXT: store i64 %[[PGOCOUNTINC1]], ptr %[[PROFC_ADDR1]]
30+
; ATOMIC-LABEL: define void @foo
31+
; ATOMIC-NEXT: %[[BIAS:.+]] = load i64, ptr @__llvm_profile_counter_bias, align 8, !invariant.load !0
32+
; ATOMIC-NEXT: %[[PROFC_BIAS:.+]] = add i64 ptrtoint (ptr @__profc_foo to i64), %[[BIAS]]
33+
; ATOMIC-NEXT: %[[PROFC_ADDR:.+]] = inttoptr i64 %[[PROFC_BIAS]] to ptr
34+
; ATOMIC-NEXT: %[[PGOCOUNTINC:.+]] = atomicrmw add ptr %[[PROFC_ADDR]], i64 1 monotonic
35+
; ATOMICOPT-NEXT: %[[PROFC_BIAS1:.+]] = add i64 ptrtoint (ptr @__profc_bar to i64), %[[BIAS]]
36+
; ATOMICOPT-NEXT: %[[PROFC_ADDR1:.+]] = inttoptr i64 %[[PROFC_BIAS1]] to ptr
37+
; ATOMICOPT-NEXT: %[[PGOCOUNTINC1:.+]] = atomicrmw add ptr %[[PROFC_ADDR1]], i64 1 monotonic
38+
39+
define void @bar() {
40+
call void @llvm.instrprof.increment(ptr @__profn_bar, i64 0, i32 1, i32 0)
41+
ret void
42+
}
43+
2144
define void @foo() {
2245
call void @llvm.instrprof.increment(ptr @__profn_foo, i64 0, i32 1, i32 0)
46+
call void @bar()
2347
ret void
2448
}
2549

0 commit comments

Comments
 (0)