[ThinLTO] Attempt to recommit r365040 after caching fix
It's possible that some function can load and store the same variable using the same constant expression: store %Derived* @foo, %Derived** bitcast (%Base** @bar to %Derived**) %42 = load %Derived*, %Derived** bitcast (%Base** @bar to %Derived**) The bitcast expression was mistakenly cached while processing loads, and never examined later when processing store. This caused @bar to be mistakenly treated as read-only variable. See load-store-caching.ll. llvm-svn: 365188
This commit is contained in:
@@ -984,7 +984,8 @@ static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags,
|
||||
|
||||
// Decode the flags for GlobalVariable in the summary
|
||||
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags) {
|
||||
return GlobalVarSummary::GVarFlags((RawFlags & 0x1) ? true : false);
|
||||
return GlobalVarSummary::GVarFlags((RawFlags & 0x1) ? true : false,
|
||||
(RawFlags & 0x2) ? true : false);
|
||||
}
|
||||
|
||||
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val) {
|
||||
@@ -5681,10 +5682,16 @@ void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
|
||||
parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
|
||||
}
|
||||
|
||||
static void setImmutableRefs(std::vector<ValueInfo> &Refs, unsigned Count) {
|
||||
// Read-only refs are in the end of the refs list.
|
||||
for (unsigned RefNo = Refs.size() - Count; RefNo < Refs.size(); ++RefNo)
|
||||
static void setSpecialRefs(std::vector<ValueInfo> &Refs, unsigned ROCnt,
|
||||
unsigned WOCnt) {
|
||||
// Readonly and writeonly refs are in the end of the refs list.
|
||||
assert(ROCnt + WOCnt <= Refs.size());
|
||||
unsigned FirstWORef = Refs.size() - WOCnt;
|
||||
unsigned RefNo = FirstWORef - ROCnt;
|
||||
for (; RefNo < FirstWORef; ++RefNo)
|
||||
Refs[RefNo].setReadOnly();
|
||||
for (; RefNo < Refs.size(); ++RefNo)
|
||||
Refs[RefNo].setWriteOnly();
|
||||
}
|
||||
|
||||
// Eagerly parse the entire summary block. This populates the GlobalValueSummary
|
||||
@@ -5711,9 +5718,9 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
}
|
||||
const uint64_t Version = Record[0];
|
||||
const bool IsOldProfileFormat = Version == 1;
|
||||
if (Version < 1 || Version > 6)
|
||||
if (Version < 1 || Version > 7)
|
||||
return error("Invalid summary version " + Twine(Version) +
|
||||
". Version should be in the range [1-6].");
|
||||
". Version should be in the range [1-7].");
|
||||
Record.clear();
|
||||
|
||||
// Keep around the last seen summary to be used when we see an optional
|
||||
@@ -5812,15 +5819,19 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
unsigned InstCount = Record[2];
|
||||
uint64_t RawFunFlags = 0;
|
||||
unsigned NumRefs = Record[3];
|
||||
unsigned NumImmutableRefs = 0;
|
||||
unsigned NumRORefs = 0, NumWORefs = 0;
|
||||
int RefListStartIndex = 4;
|
||||
if (Version >= 4) {
|
||||
RawFunFlags = Record[3];
|
||||
NumRefs = Record[4];
|
||||
RefListStartIndex = 5;
|
||||
if (Version >= 5) {
|
||||
NumImmutableRefs = Record[5];
|
||||
NumRORefs = Record[5];
|
||||
RefListStartIndex = 6;
|
||||
if (Version >= 7) {
|
||||
NumWORefs = Record[6];
|
||||
RefListStartIndex = 7;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5840,7 +5851,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
std::vector<FunctionSummary::EdgeTy> Calls = makeCallList(
|
||||
ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
|
||||
IsOldProfileFormat, HasProfile, HasRelBF);
|
||||
setImmutableRefs(Refs, NumImmutableRefs);
|
||||
setSpecialRefs(Refs, NumRORefs, NumWORefs);
|
||||
auto FS = llvm::make_unique<FunctionSummary>(
|
||||
Flags, InstCount, getDecodedFFlags(RawFunFlags), /*EntryCount=*/0,
|
||||
std::move(Refs), std::move(Calls), std::move(PendingTypeTests),
|
||||
@@ -5891,7 +5902,8 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
unsigned ValueID = Record[0];
|
||||
uint64_t RawFlags = Record[1];
|
||||
unsigned RefArrayStart = 2;
|
||||
GlobalVarSummary::GVarFlags GVF;
|
||||
GlobalVarSummary::GVarFlags GVF(/* ReadOnly */ false,
|
||||
/* WriteOnly */ false);
|
||||
auto Flags = getDecodedGVSummaryFlags(RawFlags, Version);
|
||||
if (Version >= 5) {
|
||||
GVF = getDecodedGVarFlags(Record[2]);
|
||||
@@ -5948,7 +5960,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
uint64_t RawFunFlags = 0;
|
||||
uint64_t EntryCount = 0;
|
||||
unsigned NumRefs = Record[4];
|
||||
unsigned NumImmutableRefs = 0;
|
||||
unsigned NumRORefs = 0, NumWORefs = 0;
|
||||
int RefListStartIndex = 5;
|
||||
|
||||
if (Version >= 4) {
|
||||
@@ -5956,13 +5968,19 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
RefListStartIndex = 6;
|
||||
size_t NumRefsIndex = 5;
|
||||
if (Version >= 5) {
|
||||
unsigned NumRORefsOffset = 1;
|
||||
RefListStartIndex = 7;
|
||||
if (Version >= 6) {
|
||||
NumRefsIndex = 6;
|
||||
EntryCount = Record[5];
|
||||
RefListStartIndex = 8;
|
||||
if (Version >= 7) {
|
||||
RefListStartIndex = 9;
|
||||
NumWORefs = Record[8];
|
||||
NumRORefsOffset = 2;
|
||||
}
|
||||
}
|
||||
NumImmutableRefs = Record[RefListStartIndex - 1];
|
||||
NumRORefs = Record[RefListStartIndex - NumRORefsOffset];
|
||||
}
|
||||
NumRefs = Record[NumRefsIndex];
|
||||
}
|
||||
@@ -5978,7 +5996,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
|
||||
IsOldProfileFormat, HasProfile, false);
|
||||
ValueInfo VI = getValueInfoFromValueId(ValueID).first;
|
||||
setImmutableRefs(Refs, NumImmutableRefs);
|
||||
setSpecialRefs(Refs, NumRORefs, NumWORefs);
|
||||
auto FS = llvm::make_unique<FunctionSummary>(
|
||||
Flags, InstCount, getDecodedFFlags(RawFunFlags), EntryCount,
|
||||
std::move(Refs), std::move(Edges), std::move(PendingTypeTests),
|
||||
@@ -6025,7 +6043,8 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
|
||||
uint64_t ModuleId = Record[1];
|
||||
uint64_t RawFlags = Record[2];
|
||||
unsigned RefArrayStart = 3;
|
||||
GlobalVarSummary::GVarFlags GVF;
|
||||
GlobalVarSummary::GVarFlags GVF(/* ReadOnly */ false,
|
||||
/* WriteOnly */ false);
|
||||
auto Flags = getDecodedGVSummaryFlags(RawFlags, Version);
|
||||
if (Version >= 5) {
|
||||
GVF = getDecodedGVarFlags(Record[3]);
|
||||
|
||||
@@ -1017,7 +1017,7 @@ static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) {
|
||||
}
|
||||
|
||||
static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags) {
|
||||
uint64_t RawFlags = Flags.ReadOnly;
|
||||
uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1);
|
||||
return RawFlags;
|
||||
}
|
||||
|
||||
@@ -3629,11 +3629,13 @@ void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
|
||||
FunctionSummary *FS = cast<FunctionSummary>(Summary);
|
||||
writeFunctionTypeMetadataRecords(Stream, FS);
|
||||
|
||||
auto SpecialRefCnts = FS->specialRefCounts();
|
||||
NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));
|
||||
NameVals.push_back(FS->instCount());
|
||||
NameVals.push_back(getEncodedFFlags(FS->fflags()));
|
||||
NameVals.push_back(FS->refs().size());
|
||||
NameVals.push_back(FS->immutableRefCount());
|
||||
NameVals.push_back(SpecialRefCnts.first); // rorefcnt
|
||||
NameVals.push_back(SpecialRefCnts.second); // worefcnt
|
||||
|
||||
for (auto &RI : FS->refs())
|
||||
NameVals.push_back(VE.getValueID(RI.getValue()));
|
||||
@@ -3707,7 +3709,7 @@ void ModuleBitcodeWriterBase::writeModuleLevelReferences(
|
||||
// Current version for the summary.
|
||||
// This is bumped whenever we introduce changes in the way some record are
|
||||
// interpreted, like flags for instance.
|
||||
static const uint64_t INDEX_VERSION = 6;
|
||||
static const uint64_t INDEX_VERSION = 7;
|
||||
|
||||
/// Emit the per-module summary section alongside the rest of
|
||||
/// the module's bitcode.
|
||||
@@ -3749,7 +3751,8 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // immutablerefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
|
||||
// numrefs x valueid, n x (valueid, hotness)
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
|
||||
@@ -3766,7 +3769,8 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // immutablerefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
|
||||
// numrefs x valueid, n x (valueid [, rel_block_freq])
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
|
||||
@@ -3898,7 +3902,8 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // entrycount
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // immutablerefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
|
||||
// numrefs x valueid, n x (valueid)
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
|
||||
@@ -3914,7 +3919,8 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // entrycount
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // immutablerefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
|
||||
// numrefs x valueid, n x (valueid, hotness)
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
|
||||
@@ -4016,20 +4022,24 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
|
||||
|
||||
// Fill in below
|
||||
NameVals.push_back(0); // numrefs
|
||||
NameVals.push_back(0); // immutablerefcnt
|
||||
NameVals.push_back(0); // rorefcnt
|
||||
NameVals.push_back(0); // worefcnt
|
||||
|
||||
unsigned Count = 0, ImmutableRefCnt = 0;
|
||||
unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
|
||||
for (auto &RI : FS->refs()) {
|
||||
auto RefValueId = getValueId(RI.getGUID());
|
||||
if (!RefValueId)
|
||||
continue;
|
||||
NameVals.push_back(*RefValueId);
|
||||
if (RI.isReadOnly())
|
||||
ImmutableRefCnt++;
|
||||
RORefCnt++;
|
||||
else if (RI.isWriteOnly())
|
||||
WORefCnt++;
|
||||
Count++;
|
||||
}
|
||||
NameVals[6] = Count;
|
||||
NameVals[7] = ImmutableRefCnt;
|
||||
NameVals[7] = RORefCnt;
|
||||
NameVals[8] = WORefCnt;
|
||||
|
||||
bool HasProfileData = false;
|
||||
for (auto &EI : FS->calls()) {
|
||||
|
||||
Reference in New Issue
Block a user