mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[PGO] Remove the old memop value profiling buckets.
Following up D81682 and D83903, remove the code for the old value profiling buckets, which have been replaced with the new, extended buckets and disabled by default. Also syncing InstrProfData.inc between compiler-rt and llvm. Differential Revision: https://reviews.llvm.org/D88838
This commit is contained in:
parent
9be1dfc8dc
commit
7e9ad11889
@ -74,13 +74,6 @@ inline StringRef getInstrProfValueProfFuncName() {
|
||||
return INSTR_PROF_VALUE_PROF_FUNC_STR;
|
||||
}
|
||||
|
||||
/// Return the name profile runtime entry point to do value range profiling.
|
||||
// FIXME: This is to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
inline StringRef getInstrProfValueRangeProfFuncName() {
|
||||
return INSTR_PROF_VALUE_RANGE_PROF_FUNC_STR;
|
||||
}
|
||||
|
||||
/// Return the name profile runtime entry point to do memop size value
|
||||
/// profiling.
|
||||
inline StringRef getInstrProfValueProfMemOpFuncName() {
|
||||
|
@ -154,19 +154,7 @@ INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
|
||||
VALUE_PROF_FUNC_PARAM(uint64_t, TargetValue, Type::getInt64Ty(Ctx)) \
|
||||
INSTR_PROF_COMMA
|
||||
VALUE_PROF_FUNC_PARAM(void *, Data, Type::getInt8PtrTy(Ctx)) INSTR_PROF_COMMA
|
||||
#ifndef VALUE_RANGE_PROF
|
||||
VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx))
|
||||
#else /* VALUE_RANGE_PROF */
|
||||
/* FIXME: This is to be removed after switching to the new memop value
|
||||
* profiling. */
|
||||
VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx)) \
|
||||
INSTR_PROF_COMMA
|
||||
VALUE_PROF_FUNC_PARAM(uint64_t, PreciseRangeStart, Type::getInt64Ty(Ctx)) \
|
||||
INSTR_PROF_COMMA
|
||||
VALUE_PROF_FUNC_PARAM(uint64_t, PreciseRangeLast, Type::getInt64Ty(Ctx)) \
|
||||
INSTR_PROF_COMMA
|
||||
VALUE_PROF_FUNC_PARAM(uint64_t, LargeValue, Type::getInt64Ty(Ctx))
|
||||
#endif /*VALUE_RANGE_PROF */
|
||||
#undef VALUE_PROF_FUNC_PARAM
|
||||
#undef INSTR_PROF_COMMA
|
||||
/* VALUE_PROF_FUNC_PARAM end */
|
||||
@ -756,11 +744,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure,
|
||||
#define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target
|
||||
#define INSTR_PROF_VALUE_PROF_FUNC_STR \
|
||||
INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)
|
||||
/* FIXME: This is to be removed after switching to the new memop value
|
||||
* profiling. */
|
||||
#define INSTR_PROF_VALUE_RANGE_PROF_FUNC __llvm_profile_instrument_range
|
||||
#define INSTR_PROF_VALUE_RANGE_PROF_FUNC_STR \
|
||||
INSTR_PROF_QUOTE(INSTR_PROF_VALUE_RANGE_PROF_FUNC)
|
||||
#define INSTR_PROF_VALUE_PROF_MEMOP_FUNC __llvm_profile_instrument_memop
|
||||
#define INSTR_PROF_VALUE_PROF_MEMOP_FUNC_STR \
|
||||
INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_MEMOP_FUNC)
|
||||
|
@ -68,13 +68,6 @@ private:
|
||||
// vector of counter load/store pairs to be register promoted.
|
||||
std::vector<LoadStorePair> PromotionCandidates;
|
||||
|
||||
// FIXME: These are to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
// The start value of precise value profile range for memory intrinsic sizes.
|
||||
int64_t MemOPSizeRangeStart;
|
||||
// The end value of precise value profile range for memory intrinsic sizes.
|
||||
int64_t MemOPSizeRangeLast;
|
||||
|
||||
int64_t TotalCountersPromoted = 0;
|
||||
|
||||
/// Lower instrumentation intrinsics in the function. Returns true if there
|
||||
|
@ -1112,29 +1112,6 @@ bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// FIXME: This is to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
// Parse the value profile options.
|
||||
void getMemOPSizeRangeFromOption(StringRef MemOPSizeRange, int64_t &RangeStart,
|
||||
int64_t &RangeLast) {
|
||||
static const int64_t DefaultMemOPSizeRangeStart = 0;
|
||||
static const int64_t DefaultMemOPSizeRangeLast = 8;
|
||||
RangeStart = DefaultMemOPSizeRangeStart;
|
||||
RangeLast = DefaultMemOPSizeRangeLast;
|
||||
|
||||
if (!MemOPSizeRange.empty()) {
|
||||
auto Pos = MemOPSizeRange.find(':');
|
||||
if (Pos != std::string::npos) {
|
||||
if (Pos > 0)
|
||||
MemOPSizeRange.substr(0, Pos).getAsInteger(10, RangeStart);
|
||||
if (Pos < MemOPSizeRange.size() - 1)
|
||||
MemOPSizeRange.substr(Pos + 1).getAsInteger(10, RangeLast);
|
||||
} else
|
||||
MemOPSizeRange.getAsInteger(10, RangeLast);
|
||||
}
|
||||
assert(RangeLast >= RangeStart);
|
||||
}
|
||||
|
||||
// Create a COMDAT variable INSTR_PROF_RAW_VERSION_VAR to make the runtime
|
||||
// aware this is an ir_level profile so it can set the version flag.
|
||||
void createIRLevelProfileFlagVar(Module &M, bool IsCS,
|
||||
|
@ -57,29 +57,6 @@ using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "instrprof"
|
||||
|
||||
// FIXME: These are to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
// The start and end values of precise value profile range for memory
|
||||
// intrinsic sizes
|
||||
cl::opt<std::string> MemOPSizeRange(
|
||||
"memop-size-range",
|
||||
cl::desc("Set the range of size in memory intrinsic calls to be profiled "
|
||||
"precisely, in a format of <start_val>:<end_val>"),
|
||||
cl::init(""));
|
||||
|
||||
// The value that considered to be large value in memory intrinsic.
|
||||
cl::opt<unsigned> MemOPSizeLarge(
|
||||
"memop-size-large",
|
||||
cl::desc("Set large value thresthold in memory intrinsic size profiling. "
|
||||
"Value of 0 disables the large value profiling."),
|
||||
cl::init(8192));
|
||||
|
||||
cl::opt<bool> UseOldMemOpValueProf(
|
||||
"use-old-memop-value-prof",
|
||||
cl::desc("Use the old memop value profiling buckets. This is "
|
||||
"transitional and to be removed after switching. "),
|
||||
cl::init(false));
|
||||
|
||||
namespace {
|
||||
|
||||
cl::opt<bool> DoHashBasedCounterSplit(
|
||||
@ -424,11 +401,7 @@ enum class ValueProfilingCallType {
|
||||
// profiling.
|
||||
Default,
|
||||
|
||||
// The old memop size value profiling. FIXME: To be removed after switching to
|
||||
// the new one.
|
||||
OldMemOp,
|
||||
|
||||
// MemOp: the (new) memop size value profiling with extended buckets.
|
||||
// MemOp: the memop size value profiling.
|
||||
MemOp
|
||||
};
|
||||
|
||||
@ -566,8 +539,6 @@ bool InstrProfiling::run(
|
||||
NamesSize = 0;
|
||||
ProfileDataMap.clear();
|
||||
UsedVars.clear();
|
||||
getMemOPSizeRangeFromOption(MemOPSizeRange, MemOPSizeRangeStart,
|
||||
MemOPSizeRangeLast);
|
||||
TT = Triple(M.getTargetTriple());
|
||||
|
||||
// Emit the runtime hook even if no counters are present.
|
||||
@ -626,33 +597,19 @@ static FunctionCallee getOrInsertValueProfilingCall(
|
||||
if (auto AK = TLI.getExtAttrForI32Param(false))
|
||||
AL = AL.addParamAttribute(M.getContext(), 2, AK);
|
||||
|
||||
if (CallType == ValueProfilingCallType::Default ||
|
||||
CallType == ValueProfilingCallType::MemOp) {
|
||||
Type *ParamTypes[] = {
|
||||
assert((CallType == ValueProfilingCallType::Default ||
|
||||
CallType == ValueProfilingCallType::MemOp) &&
|
||||
"Must be Default or MemOp");
|
||||
Type *ParamTypes[] = {
|
||||
#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
|
||||
#include "llvm/ProfileData/InstrProfData.inc"
|
||||
};
|
||||
auto *ValueProfilingCallTy =
|
||||
FunctionType::get(ReturnTy, makeArrayRef(ParamTypes), false);
|
||||
StringRef FuncName = CallType == ValueProfilingCallType::Default
|
||||
? getInstrProfValueProfFuncName()
|
||||
: getInstrProfValueProfMemOpFuncName();
|
||||
return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
|
||||
} else {
|
||||
// FIXME: This code is to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
assert(CallType == ValueProfilingCallType::OldMemOp);
|
||||
Type *RangeParamTypes[] = {
|
||||
#define VALUE_RANGE_PROF 1
|
||||
#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
|
||||
#include "llvm/ProfileData/InstrProfData.inc"
|
||||
#undef VALUE_RANGE_PROF
|
||||
};
|
||||
auto *ValueRangeProfilingCallTy =
|
||||
FunctionType::get(ReturnTy, makeArrayRef(RangeParamTypes), false);
|
||||
return M.getOrInsertFunction(getInstrProfValueRangeProfFuncName(),
|
||||
ValueRangeProfilingCallTy, AL);
|
||||
}
|
||||
};
|
||||
auto *ValueProfilingCallTy =
|
||||
FunctionType::get(ReturnTy, makeArrayRef(ParamTypes), false);
|
||||
StringRef FuncName = CallType == ValueProfilingCallType::Default
|
||||
? getInstrProfValueProfFuncName()
|
||||
: getInstrProfValueProfMemOpFuncName();
|
||||
return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
|
||||
}
|
||||
|
||||
void InstrProfiling::computeNumValueSiteCounts(InstrProfValueProfileInst *Ind) {
|
||||
@ -698,24 +655,13 @@ void InstrProfiling::lowerValueProfileInst(InstrProfValueProfileInst *Ind) {
|
||||
Builder.getInt32(Index)};
|
||||
Call = Builder.CreateCall(getOrInsertValueProfilingCall(*M, *TLI), Args,
|
||||
OpBundles);
|
||||
} else if (!UseOldMemOpValueProf) {
|
||||
} else {
|
||||
Value *Args[3] = {Ind->getTargetValue(),
|
||||
Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()),
|
||||
Builder.getInt32(Index)};
|
||||
Call = Builder.CreateCall(
|
||||
getOrInsertValueProfilingCall(*M, *TLI, ValueProfilingCallType::MemOp),
|
||||
Args, OpBundles);
|
||||
} else {
|
||||
Value *Args[6] = {
|
||||
Ind->getTargetValue(),
|
||||
Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()),
|
||||
Builder.getInt32(Index),
|
||||
Builder.getInt64(MemOPSizeRangeStart),
|
||||
Builder.getInt64(MemOPSizeRangeLast),
|
||||
Builder.getInt64(MemOPSizeLarge == 0 ? INT64_MIN : MemOPSizeLarge)};
|
||||
Call = Builder.CreateCall(getOrInsertValueProfilingCall(
|
||||
*M, *TLI, ValueProfilingCallType::OldMemOp),
|
||||
Args, OpBundles);
|
||||
}
|
||||
if (auto AK = TLI->getExtAttrForI32Param(false))
|
||||
Call->addParamAttr(2, AK);
|
||||
|
@ -91,16 +91,6 @@ static cl::opt<bool>
|
||||
cl::desc("Scale the memop size counts using the basic "
|
||||
" block count value"));
|
||||
|
||||
// FIXME: These are to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
// This option sets the rangge of precise profile memop sizes.
|
||||
extern cl::opt<std::string> MemOPSizeRange;
|
||||
|
||||
// This option sets the value that groups large memop sizes
|
||||
extern cl::opt<unsigned> MemOPSizeLarge;
|
||||
|
||||
extern cl::opt<bool> UseOldMemOpValueProf;
|
||||
|
||||
cl::opt<bool>
|
||||
MemOPOptMemcmpBcmp("pgo-memop-optimize-memcmp-bcmp", cl::init(true),
|
||||
cl::Hidden,
|
||||
@ -234,9 +224,6 @@ public:
|
||||
: Func(Func), BFI(BFI), ORE(ORE), DT(DT), TLI(TLI), Changed(false) {
|
||||
ValueDataArray =
|
||||
std::make_unique<InstrProfValueData[]>(MemOPMaxVersion + 2);
|
||||
// Get the MemOPSize range information from option MemOPSizeRange,
|
||||
getMemOPSizeRangeFromOption(MemOPSizeRange, PreciseRangeStart,
|
||||
PreciseRangeLast);
|
||||
}
|
||||
bool isChanged() const { return Changed; }
|
||||
void perform() {
|
||||
@ -279,30 +266,9 @@ private:
|
||||
TargetLibraryInfo &TLI;
|
||||
bool Changed;
|
||||
std::vector<MemOp> WorkList;
|
||||
// FIXME: These are to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
// Start of the previse range.
|
||||
int64_t PreciseRangeStart;
|
||||
// Last value of the previse range.
|
||||
int64_t PreciseRangeLast;
|
||||
// The space to read the profile annotation.
|
||||
std::unique_ptr<InstrProfValueData[]> ValueDataArray;
|
||||
bool perform(MemOp MO);
|
||||
|
||||
// FIXME: This is to be removed after switching to the new memop value
|
||||
// profiling.
|
||||
// This kind shows which group the value falls in. For PreciseValue, we have
|
||||
// the profile count for that value. LargeGroup groups the values that are in
|
||||
// range [LargeValue, +inf). NonLargeGroup groups the rest of values.
|
||||
enum MemOPSizeKind { PreciseValue, NonLargeGroup, LargeGroup };
|
||||
|
||||
MemOPSizeKind getMemOPSizeKind(int64_t Value) const {
|
||||
if (Value == MemOPSizeLarge && MemOPSizeLarge != 0)
|
||||
return LargeGroup;
|
||||
if (Value == PreciseRangeLast + 1)
|
||||
return NonLargeGroup;
|
||||
return PreciseValue;
|
||||
}
|
||||
};
|
||||
|
||||
static bool isProfitable(uint64_t Count, uint64_t TotalCount) {
|
||||
@ -379,11 +345,7 @@ bool MemOPSizeOpt::perform(MemOp MO) {
|
||||
if (MemOPScaleCount)
|
||||
C = getScaledCount(C, ActualCount, SavedTotalCount);
|
||||
|
||||
if (UseOldMemOpValueProf) {
|
||||
// Only care precise value here.
|
||||
if (getMemOPSizeKind(V) != PreciseValue)
|
||||
continue;
|
||||
} else if (!InstrProfIsSingleValRange(V) || V > MemOpMaxOptSize)
|
||||
if (!InstrProfIsSingleValRange(V) || V > MemOpMaxOptSize)
|
||||
continue;
|
||||
|
||||
// ValueCounts are sorted on the count. Break at the first un-profitable
|
||||
|
@ -1,7 +1,5 @@
|
||||
; RUN: opt < %s -pgo-instr-gen -instrprof -use-old-memop-value-prof=true -S | FileCheck %s --check-prefix=OLDMEMOPVP
|
||||
; RUN: opt < %s -pgo-instr-gen -instrprof -use-old-memop-value-prof=false -S | FileCheck %s --check-prefix=NEWMEMOPVP
|
||||
; RUN: opt <%s -passes=pgo-instr-gen,instrprof -use-old-memop-value-prof=true -S | FileCheck %s --check-prefix=OLDMEMOPVP
|
||||
; RUN: opt <%s -passes=pgo-instr-gen,instrprof -use-old-memop-value-prof=false -S | FileCheck %s --check-prefix=NEWMEMOPVP
|
||||
; RUN: opt < %s -pgo-instr-gen -instrprof -S | FileCheck %s
|
||||
; RUN: opt <%s -passes=pgo-instr-gen,instrprof -S | FileCheck %s
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
@ -25,8 +23,7 @@ for.cond1:
|
||||
|
||||
for.body3:
|
||||
%conv = sext i32 %add to i64
|
||||
; OLDMEMOPVP: call void @__llvm_profile_instrument_range(i64 %conv, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*), i32 0, i64 0, i64 8, i64 8192)
|
||||
; NEWMEMOPVP: call void @__llvm_profile_instrument_memop(i64 %conv, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*), i32 0)
|
||||
; CHECK: call void @__llvm_profile_instrument_memop(i64 %conv, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*), i32 0)
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst, i8* %src, i64 %conv, i1 false)
|
||||
%inc = add nsw i32 %j.0, 1
|
||||
br label %for.cond1
|
||||
|
@ -1,10 +1,8 @@
|
||||
; RUN: opt < %s -pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
|
||||
; RUN: opt < %s -pgo-instr-gen -instrprof -use-old-memop-value-prof=true -S | FileCheck %s --check-prefixes=LOWER,LOWEROLDMEMOPVP
|
||||
; RUN: opt < %s -pgo-instr-gen -instrprof -use-old-memop-value-prof=false -S | FileCheck %s --check-prefixes=LOWER,LOWERNEWMEMOPVP
|
||||
; RUN: opt < %s -pgo-instr-gen -instrprof -S | FileCheck %s --check-prefixes=LOWER
|
||||
|
||||
; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
|
||||
; RUN: opt < %s -passes=pgo-instr-gen,instrprof -use-old-memop-value-prof=true -S | FileCheck %s --check-prefixes=LOWER,LOWEROLDMEMOPVP
|
||||
; RUN: opt < %s -passes=pgo-instr-gen,instrprof -use-old-memop-value-prof=false -S | FileCheck %s --check-prefixes=LOWER,LOWERNEWMEMOPVP
|
||||
; RUN: opt < %s -passes=pgo-instr-gen,instrprof -S | FileCheck %s --check-prefixes=LOWER
|
||||
|
||||
; This test is to verify that PGO runtime library calls get created with the
|
||||
; appropriate operand bundle funclet information when a memory intrinsic
|
||||
@ -65,8 +63,7 @@ try.cont: ; preds = %entry
|
||||
; GEN-SAME: [ "funclet"(token %tmp1) ]
|
||||
|
||||
; LOWER: catch:
|
||||
; LOWEROLDMEMOPVP: call void @__llvm_profile_instrument_range(
|
||||
; LOWERNEWMEMOPVP: call void @__llvm_profile_instrument_memop(
|
||||
; LOWER: call void @__llvm_profile_instrument_memop(
|
||||
; LOWER-SAME: [ "funclet"(token %tmp1) ]
|
||||
|
||||
declare dso_local void @"?may_throw@@YAXH@Z"(i32)
|
||||
|
Loading…
Reference in New Issue
Block a user