[llvm] [PGO][SampledInstr] Correct off by 1s and allow 100% sampling (PR #113350)
Michael O'Farrell via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 22 10:46:15 PDT 2024
https://github.com/mofarrell created https://github.com/llvm/llvm-project/pull/113350
This corrects a couple off by ones related to the sampling of **instrumented** counters, and enables setting 100% rates for burst sampling (burst duration = period).
Off by ones:
Prior to this change it was impossible to set a period of 65535 because this was converted to fast sampling which rollsover at USHRT_MAX + 1 (65536). Similarly the burst durations would collect burst duration + 1 counts as they used an ULE comparison.
100% sampling:
Although this is not useful for a productionized use case, it does allow for more deterministic testing with the sampling checks in place. After all the off by ones are fixed, allowing for 100% sampling is a matter of letting burst duration = period.
>From dc3434b4ba0c3323e9139263f6af807fb57cf6f2 Mon Sep 17 00:00:00 2001
From: Michael O'Farrell <micpof at gmail.com>
Date: Tue, 15 Oct 2024 12:55:26 -0700
Subject: [PATCH] [PGO][SampledInstr] Correct off by 1s and allow 100% sampling
This corrects a couple off by ones related to the sampling of instrumented
counters, and enables setting 100% rates for burst sampling (burst
duration = period).
Off by ones:
Prior to this change it was impossible to set a period of 65535 because
this was converted to fast sampling which rollsover at USHRT_MAX + 1
(65536). Similarly the burst durations would collect burst duration + 1
counts as they used an ULE comparison.
100% sampling:
Although this is not useful for a productionized use case, it does allow
for more deterministic testing with the sampling checks in place. After
all the off by ones are fixed, allowing for 100% sampling is a matter of
letting burst duration = period.
---
.../Instrumentation/InstrProfiling.cpp | 88 +++++++++++--------
.../PGOProfile/counter_promo_sampling.ll | 2 +-
.../Transforms/PGOProfile/cspgo_sample.ll | 4 +-
.../instrprof_burst_sampling_fast.ll | 7 +-
.../instrprof_burst_sampling_full.ll | 12 ++-
.../instrprof_burst_sampling_full_intsize.ll | 6 +-
.../PGOProfile/instrprof_simple_sampling.ll | 12 +--
7 files changed, 77 insertions(+), 54 deletions(-)
diff --git a/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp b/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
index d7d809dfdd5f65..08e6543208b68a 100644
--- a/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
+++ b/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
@@ -184,21 +184,48 @@ static cl::opt<unsigned> SampledInstrPeriod(
cl::desc("Set the profile instrumentation sample period. For each sample "
"period, a fixed number of consecutive samples will be recorded. "
"The number is controlled by 'sampled-instr-burst-duration' flag. "
- "The default sample period of 65535 is optimized for generating "
+ "The default sample period of 65536 is optimized for generating "
"efficient code that leverages unsigned integer wrapping in "
"overflow."),
- cl::init(65535));
+ cl::init(USHRT_MAX + 1));
static cl::opt<unsigned> SampledInstrBurstDuration(
"sampled-instr-burst-duration",
cl::desc("Set the profile instrumentation burst duration, which can range "
- "from 0 to one less than the value of 'sampled-instr-period'. "
- "This number of samples will be recorded for each "
- "'sampled-instr-period' count update. Setting to 1 enables "
- "simple sampling, in which case it is recommended to set "
- "'sampled-instr-period' to a prime number."),
+ "from 1 to the value of 'sampled-instr-period'. This number of "
+ "samples will be recorded for each 'sampled-instr-period' count "
+ "update. Setting to 1 enables simple sampling, in which case it "
+ "is recommended to set 'sampled-instr-period' to a prime "
+ "number."),
cl::init(200));
+struct SampledInstrumentationConfig {
+ unsigned BurstDuration;
+ unsigned Period;
+ bool UseShort;
+ bool IsSimpleSampling;
+ bool IsFastSampling;
+};
+
+static SampledInstrumentationConfig getSampledInstrumentationConfig() {
+ SampledInstrumentationConfig config;
+ config.BurstDuration = SampledInstrBurstDuration.getValue();
+ config.Period = SampledInstrPeriod.getValue();
+ if (config.BurstDuration > config.Period)
+ report_fatal_error(
+ "SampledBurstDuration must be less than or equal to SampledPeriod");
+ if (config.Period == 0 || config.BurstDuration == 0)
+ report_fatal_error(
+ "SampledPeriod and SampledBurstDuration must be greater than 0");
+ config.IsSimpleSampling = (config.BurstDuration == 1);
+ // If (BurstDuration == 1 && Period == 65536), generate the simple sampling
+ // style code.
+ config.IsFastSampling =
+ (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
+ config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
+ return config;
+}
+
using LoadStorePair = std::pair<Instruction *, Instruction *>;
static uint64_t getIntModuleFlagOrZero(const Module &M, StringRef Flag) {
@@ -665,7 +692,7 @@ PreservedAnalyses InstrProfilingLoweringPass::run(Module &M,
// (1) Full burst sampling: We transform:
// Increment_Instruction;
// to:
-// if (__llvm_profile_sampling__ < SampledInstrBurstDuration) {
+// if (__llvm_profile_sampling__ <= SampledInstrBurstDuration - 1) {
// Increment_Instruction;
// }
// __llvm_profile_sampling__ += 1;
@@ -680,14 +707,14 @@ PreservedAnalyses InstrProfilingLoweringPass::run(Module &M,
// "__llvm_profile_sampling__" variable is an unsigned type, meaning it will
// wrap around to zero when overflows. In this case, the second check is
// unnecessary, so we won't generate check2 when the SampledInstrPeriod is
-// set to 65535 (64K - 1). The code after:
-// if (__llvm_profile_sampling__ < SampledInstrBurstDuration) {
+// set to 65536 (64K). The code after:
+// if (__llvm_profile_sampling__ <= SampledInstrBurstDuration - 1) {
// Increment_Instruction;
// }
// __llvm_profile_sampling__ += 1;
//
// (3) Simple sampling:
-// When SampledInstrBurstDuration sets to 1, we do a simple sampling:
+// When SampledInstrBurstDuration is set to 1, we do a simple sampling:
// __llvm_profile_sampling__ += 1;
// if (__llvm_profile_sampling__ >= SampledInstrPeriod) {
// __llvm_profile_sampling__ = 0;
@@ -706,27 +733,16 @@ void InstrLowerer::doSampling(Instruction *I) {
if (!isSamplingEnabled())
return;
- unsigned SampledBurstDuration = SampledInstrBurstDuration.getValue();
- unsigned SampledPeriod = SampledInstrPeriod.getValue();
- if (SampledBurstDuration >= SampledPeriod) {
- report_fatal_error(
- "SampledPeriod needs to be greater than SampledBurstDuration");
- }
- bool UseShort = (SampledPeriod <= USHRT_MAX);
- bool IsSimpleSampling = (SampledBurstDuration == 1);
- // If (SampledBurstDuration == 1 && SampledPeriod == 65535), generate
- // the simple sampling style code.
- bool IsFastSampling = (!IsSimpleSampling && SampledPeriod == 65535);
-
- auto GetConstant = [UseShort](IRBuilder<> &Builder, uint32_t C) {
- if (UseShort)
+ SampledInstrumentationConfig config = getSampledInstrumentationConfig();
+ auto GetConstant = [&config](IRBuilder<> &Builder, uint32_t C) {
+ if (config.UseShort)
return Builder.getInt16(C);
else
return Builder.getInt32(C);
};
IntegerType *SamplingVarTy;
- if (UseShort)
+ if (config.UseShort)
SamplingVarTy = Type::getInt16Ty(M.getContext());
else
SamplingVarTy = Type::getInt32Ty(M.getContext());
@@ -741,18 +757,18 @@ void InstrLowerer::doSampling(Instruction *I) {
MDNode *BranchWeight;
IRBuilder<> CondBuilder(I);
auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
- if (IsSimpleSampling) {
+ if (config.IsSimpleSampling) {
// For the simple sampling, just create the load and increments.
IRBuilder<> IncBuilder(I);
NewSamplingVarVal =
IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
} else {
- // For the bust-sampling, create the conditonal update.
+ // For the burst-sampling, create the conditional update.
auto *DurationCond = CondBuilder.CreateICmpULE(
- LoadSamplingVar, GetConstant(CondBuilder, SampledBurstDuration));
+ LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
BranchWeight = MDB.createBranchWeights(
- SampledBurstDuration, SampledPeriod + 1 - SampledBurstDuration);
+ config.BurstDuration, config.Period - config.BurstDuration);
Instruction *ThenTerm = SplitBlockAndInsertIfThen(
DurationCond, I, /* Unreachable */ false, BranchWeight);
IRBuilder<> IncBuilder(I);
@@ -762,20 +778,20 @@ void InstrLowerer::doSampling(Instruction *I) {
I->moveBefore(ThenTerm);
}
- if (IsFastSampling)
+ if (config.IsFastSampling)
return;
- // Create the condtion for checking the period.
+ // Create the condition for checking the period.
Instruction *ThenTerm, *ElseTerm;
IRBuilder<> PeriodCondBuilder(SamplingVarIncr);
auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
- NewSamplingVarVal, GetConstant(PeriodCondBuilder, SampledPeriod));
- BranchWeight = MDB.createBranchWeights(1, SampledPeriod);
+ NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
+ BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
SplitBlockAndInsertIfThenElse(PeriodCond, SamplingVarIncr, &ThenTerm,
&ElseTerm, BranchWeight);
// For the simple sampling, the counter update happens in sampling var reset.
- if (IsSimpleSampling)
+ if (config.IsSimpleSampling)
I->moveBefore(ThenTerm);
IRBuilder<> ResetBuilder(ThenTerm);
@@ -2138,7 +2154,7 @@ void createProfileSamplingVar(Module &M) {
const StringRef VarName(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SAMPLING_VAR));
IntegerType *SamplingVarTy;
Constant *ValueZero;
- if (SampledInstrPeriod.getValue() <= USHRT_MAX) {
+ if (getSampledInstrumentationConfig().UseShort) {
SamplingVarTy = Type::getInt16Ty(M.getContext());
ValueZero = Constant::getIntegerValue(SamplingVarTy, APInt(16, 0));
} else {
diff --git a/llvm/test/Transforms/PGOProfile/counter_promo_sampling.ll b/llvm/test/Transforms/PGOProfile/counter_promo_sampling.ll
index 9d083fe04015e6..43377f695be675 100644
--- a/llvm/test/Transforms/PGOProfile/counter_promo_sampling.ll
+++ b/llvm/test/Transforms/PGOProfile/counter_promo_sampling.ll
@@ -6,7 +6,7 @@
define void @foo(i32 %n, i32 %N) {
; SAMPLING-LABEL: @foo
; SAMPLING: %[[VV0:[0-9]+]] = load i16, ptr @__llvm_profile_sampling, align 2
-; SAMPLING: %[[VV1:[0-9]+]] = icmp ule i16 %[[VV0]], 200
+; SAMPLING: %[[VV1:[0-9]+]] = icmp ule i16 %[[VV0]], 199
; SAMPLING: br i1 %[[VV1]], label {{.*}}, label {{.*}}, !prof !0
; SAMPLING: {{.*}} = load {{.*}} @__profc_foo{{.*}} 3)
; SAMPLING-NEXT: add
diff --git a/llvm/test/Transforms/PGOProfile/cspgo_sample.ll b/llvm/test/Transforms/PGOProfile/cspgo_sample.ll
index 97ad4d00c9d9c0..07f1e2d8a09ee6 100644
--- a/llvm/test/Transforms/PGOProfile/cspgo_sample.ll
+++ b/llvm/test/Transforms/PGOProfile/cspgo_sample.ll
@@ -53,7 +53,7 @@ for.end:
; CSGEN-LABEL: @foo
; CSGEN: [[TMP0:%.*]] = load i16, ptr @__llvm_profile_sampling, align 2
-; CSGEN-NEXT: [[TMP1:%.*]] = icmp ult i16 [[TMP0]], 201
+; CSGEN-NEXT: [[TMP1:%.*]] = icmp ult i16 [[TMP0]], 200
; CSGEN-NEXT: br i1 [[TMP1]], label %{{.*}}, label %{{.*}}, !prof [[PROF:![0-9]+]]
; CSGEN: [[TMP2:%.*]] = add i16 {{.*}}, 1
; CSGEN-NEXT: store i16 [[TMP2]], ptr @__llvm_profile_sampling, align 2
@@ -67,7 +67,7 @@ entry:
}
; CSGEN-LABEL: @main
; CSGEN: [[TMP0:%.*]] = load i16, ptr @__llvm_profile_sampling, align 2
-; CSGEN-NEXT: [[TMP1:%.*]] = icmp ult i16 [[TMP0]], 201
+; CSGEN-NEXT: [[TMP1:%.*]] = icmp ult i16 [[TMP0]], 200
; CSGEN-NEXT: br i1 [[TMP1]], label %{{.*}}, label %{{.*}}, !prof [[PROF:![0-9]+]]
; CSGEN: [[TMP2:%.*]] = add i16 {{.*}}, 1
; CSGEN-NEXT: store i16 [[TMP2]], ptr @__llvm_profile_sampling, align 2
diff --git a/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_fast.ll b/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_fast.ll
index dcc1e805ba6f64..56d8364d8f5431 100644
--- a/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_fast.ll
+++ b/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_fast.ll
@@ -1,5 +1,6 @@
; RUN: opt < %s --passes=instrprof --sampled-instrumentation -S | FileCheck %s --check-prefixes=SAMPLE-VAR,SAMPLE-CODE,SAMPLE-DURATION,SAMPLE-WEIGHT
; RUN: opt < %s --passes=instrprof --sampled-instrumentation --sampled-instr-burst-duration=100 -S | FileCheck %s --check-prefixes=SAMPLE-VAR,SAMPLE-CODE,SAMPLE-DURATION100,SAMPLE-WEIGHT100
+; RUN: opt < %s --passes=instrprof --sampled-instrumentation --sampled-instr-burst-duration=65536 -S | FileCheck %s --check-prefixes=SAMPLE-VAR,SAMPLE-CODE,UNSAMPLED-DURATION,UNSAMPLED-WEIGHT
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -23,8 +24,9 @@ define void @f() {
; SAMPLE-CODE-LABEL: @f(
; SAMPLE-CODE: entry:
; SAMPLE-CODE-NEXT: [[TMP0:%.*]] = load i16, ptr @__llvm_profile_sampling, align 2
-; SAMPLE-DURATION: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 200
-; SAMPLE-DURATION100: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 100
+; SAMPLE-DURATION: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 199
+; SAMPLE-DURATION100: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 99
+; UNSAMPLED-DURATION: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], -1
; SAMPLE-CODE: br i1 [[TMP1]], label %[[TMP2:.*]], label %[[TMP4:.*]], !prof !0
; SAMPLE-CODE: [[TMP2]]:
; SAMPLE-CODE-NEXT: [[PGOCOUNT:%.*]] = load i64, ptr @__profc_f
@@ -43,5 +45,6 @@ entry:
; SAMPLE-WEIGHT: !0 = !{!"branch_weights", i32 200, i32 65336}
; SAMPLE-WEIGHT100: !0 = !{!"branch_weights", i32 100, i32 65436}
+; UNSAMPLED-WEIGHT: !0 = !{!"branch_weights", i32 65536, i32 0}
declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
diff --git a/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full.ll b/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full.ll
index 57d1a0cd33fbe8..726df2886ca840 100644
--- a/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full.ll
+++ b/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt < %s --passes=instrprof -sampled-instrumentation --sampled-instr-period=1009 --sampled-instr-burst-duration=32 -S | FileCheck %s
+; RUN: opt < %s --passes=instrprof -sampled-instrumentation --sampled-instr-period=1009 --sampled-instr-burst-duration=32 -S | FileCheck %s --check-prefixes=CHECK,CHECK-32
+; RUN: opt < %s --passes=instrprof -sampled-instrumentation --sampled-instr-period=1009 --sampled-instr-burst-duration=1009 -S | FileCheck %s --check-prefixes=CHECK,CHECK-UNSAMPLED
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -13,7 +14,8 @@ define void @f() {
; CHECK-LABEL: define void @f() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @__llvm_profile_sampling, align 2
-; CHECK-NEXT: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 32
+; CHECK-32-NEXT: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 31
+; CHECK-UNSAMPLED-NEXT: [[TMP1:%.*]] = icmp ule i16 [[TMP0]], 1008
; CHECK-NEXT: br i1 [[TMP1]], label %[[BB2:.*]], label %[[BB4:.*]], !prof [[PROF0:![0-9]+]]
; CHECK: [[BB2]]:
; CHECK-NEXT: [[PGOCOUNT:%.*]] = load i64, ptr @__profc_f, align 8
@@ -40,6 +42,8 @@ entry:
declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
;.
-; CHECK: [[PROF0]] = !{!"branch_weights", i32 32, i32 978}
-; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1009}
+; CHECK-32: [[PROF0]] = !{!"branch_weights", i32 32, i32 977}
+; CHECK-32: [[PROF1]] = !{!"branch_weights", i32 1, i32 1008}
+; CHECK-UNSAMPLED: [[PROF0]] = !{!"branch_weights", i32 1009, i32 0}
+; CHECK-UNSAMPLED: [[PROF1]] = !{!"branch_weights", i32 1, i32 1008}
;.
diff --git a/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full_intsize.ll b/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full_intsize.ll
index 1ad889524bc6a8..2d6323c1034715 100644
--- a/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full_intsize.ll
+++ b/llvm/test/Transforms/PGOProfile/instrprof_burst_sampling_full_intsize.ll
@@ -13,7 +13,7 @@ define void @f() {
; CHECK-LABEL: define void @f() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @__llvm_profile_sampling, align 4
-; CHECK-NEXT: [[TMP1:%.*]] = icmp ule i32 [[TMP0]], 3000
+; CHECK-NEXT: [[TMP1:%.*]] = icmp ule i32 [[TMP0]], 2999
; CHECK-NEXT: br i1 [[TMP1]], label %[[BB2:.*]], label %[[BB4:.*]], !prof [[PROF0:![0-9]+]]
; CHECK: [[BB2]]:
; CHECK-NEXT: [[PGOCOUNT:%.*]] = load i64, ptr @__profc_f, align 8
@@ -40,6 +40,6 @@ entry:
declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
;.
-; CHECK: [[PROF0]] = !{!"branch_weights", i32 3000, i32 997020}
-; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1000019}
+; CHECK: [[PROF0]] = !{!"branch_weights", i32 3000, i32 997019}
+; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1000018}
;.
diff --git a/llvm/test/Transforms/PGOProfile/instrprof_simple_sampling.ll b/llvm/test/Transforms/PGOProfile/instrprof_simple_sampling.ll
index 8e846bbf1d9821..5ef93af881c4b3 100644
--- a/llvm/test/Transforms/PGOProfile/instrprof_simple_sampling.ll
+++ b/llvm/test/Transforms/PGOProfile/instrprof_simple_sampling.ll
@@ -31,18 +31,18 @@ define void @f() {
;
; DEFAULTPERIOD-LABEL: define void @f() {
; DEFAULTPERIOD-NEXT: [[ENTRY:.*:]]
-; DEFAULTPERIOD-NEXT: [[TMP0:%.*]] = load i16, ptr @__llvm_profile_sampling, align 2
-; DEFAULTPERIOD-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], 1
-; DEFAULTPERIOD-NEXT: [[TMP2:%.*]] = icmp uge i16 [[TMP1]], -1
+; DEFAULTPERIOD-NEXT: [[TMP0:%.*]] = load i32, ptr @__llvm_profile_sampling, align 4
+; DEFAULTPERIOD-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], 1
+; DEFAULTPERIOD-NEXT: [[TMP2:%.*]] = icmp uge i32 [[TMP1]], 65536
; DEFAULTPERIOD-NEXT: br i1 [[TMP2]], label %[[BB3:.*]], label %[[BB5:.*]], !prof [[PROF0:![0-9]+]]
; DEFAULTPERIOD: [[BB3]]:
; DEFAULTPERIOD-NEXT: [[PGOCOUNT:%.*]] = load i64, ptr @__profc_f, align 8
; DEFAULTPERIOD-NEXT: [[TMP4:%.*]] = add i64 [[PGOCOUNT]], 1
; DEFAULTPERIOD-NEXT: store i64 [[TMP4]], ptr @__profc_f, align 8
-; DEFAULTPERIOD-NEXT: store i16 0, ptr @__llvm_profile_sampling, align 2
+; DEFAULTPERIOD-NEXT: store i32 0, ptr @__llvm_profile_sampling, align 4
; DEFAULTPERIOD-NEXT: br label %[[BB6:.*]]
; DEFAULTPERIOD: [[BB5]]:
-; DEFAULTPERIOD-NEXT: store i16 [[TMP1]], ptr @__llvm_profile_sampling, align 2
+; DEFAULTPERIOD-NEXT: store i32 [[TMP1]], ptr @__llvm_profile_sampling, align 4
; DEFAULTPERIOD-NEXT: br label %[[BB6]]
; DEFAULTPERIOD: [[BB6]]:
; DEFAULTPERIOD-NEXT: ret void
@@ -54,7 +54,7 @@ entry:
declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
;.
-; PERIOD1009: [[PROF0]] = !{!"branch_weights", i32 1, i32 1009}
+; PERIOD1009: [[PROF0]] = !{!"branch_weights", i32 1, i32 1008}
;.
; DEFAULTPERIOD: [[PROF0]] = !{!"branch_weights", i32 1, i32 65535}
;.
More information about the llvm-commits
mailing list