summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2017-03-22 18:22:59 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2017-03-22 18:22:59 +0000
commitf7691d8b410dc4ccb4eacb4bf9151f3ee91fd7fe (patch)
treedc407941b6c9b1227aa5c03741f871bcf6ed7d01 /llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
parentbdc8bc047d48b7f2e9bfc7eb057df99056e95391 (diff)
downloadbcm5719-llvm-f7691d8b410dc4ccb4eacb4bf9151f3ee91fd7fe.tar.gz
bcm5719-llvm-f7691d8b410dc4ccb4eacb4bf9151f3ee91fd7fe.zip
IPO: Const correctness for summaries passed into passes.
Pass const qualified summaries into importers and unqualified summaries into exporters. This lets us const-qualify the summary argument to thinBackend. Differential Revision: https://reviews.llvm.org/D31230 llvm-svn: 298534
Diffstat (limited to 'llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp60
1 files changed, 36 insertions, 24 deletions
diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
index 68d7bd56813..2579528f54d 100644
--- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
+++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
@@ -373,8 +373,8 @@ struct DevirtModule {
Module &M;
function_ref<AAResults &(Function &)> AARGetter;
- PassSummaryAction Action;
- ModuleSummaryIndex *Summary;
+ ModuleSummaryIndex *ExportSummary;
+ const ModuleSummaryIndex *ImportSummary;
IntegerType *Int8Ty;
PointerType *Int8PtrTy;
@@ -397,14 +397,17 @@ struct DevirtModule {
std::map<CallInst *, unsigned> NumUnsafeUsesForTypeTest;
DevirtModule(Module &M, function_ref<AAResults &(Function &)> AARGetter,
- PassSummaryAction Action, ModuleSummaryIndex *Summary)
- : M(M), AARGetter(AARGetter), Action(Action), Summary(Summary),
- Int8Ty(Type::getInt8Ty(M.getContext())),
+ ModuleSummaryIndex *ExportSummary,
+ const ModuleSummaryIndex *ImportSummary)
+ : M(M), AARGetter(AARGetter), ExportSummary(ExportSummary),
+ ImportSummary(ImportSummary), Int8Ty(Type::getInt8Ty(M.getContext())),
Int8PtrTy(Type::getInt8PtrTy(M.getContext())),
Int32Ty(Type::getInt32Ty(M.getContext())),
Int64Ty(Type::getInt64Ty(M.getContext())),
IntPtrTy(M.getDataLayout().getIntPtrType(M.getContext(), 0)),
- RemarksEnabled(areRemarksEnabled()) {}
+ RemarksEnabled(areRemarksEnabled()) {
+ assert(!(ExportSummary && ImportSummary));
+ }
bool areRemarksEnabled();
@@ -488,15 +491,17 @@ struct WholeProgramDevirt : public ModulePass {
bool UseCommandLine = false;
- PassSummaryAction Action;
- ModuleSummaryIndex *Summary;
+ ModuleSummaryIndex *ExportSummary;
+ const ModuleSummaryIndex *ImportSummary;
WholeProgramDevirt() : ModulePass(ID), UseCommandLine(true) {
initializeWholeProgramDevirtPass(*PassRegistry::getPassRegistry());
}
- WholeProgramDevirt(PassSummaryAction Action, ModuleSummaryIndex *Summary)
- : ModulePass(ID), Action(Action), Summary(Summary) {
+ WholeProgramDevirt(ModuleSummaryIndex *ExportSummary,
+ const ModuleSummaryIndex *ImportSummary)
+ : ModulePass(ID), ExportSummary(ExportSummary),
+ ImportSummary(ImportSummary) {
initializeWholeProgramDevirtPass(*PassRegistry::getPassRegistry());
}
@@ -505,7 +510,8 @@ struct WholeProgramDevirt : public ModulePass {
return false;
if (UseCommandLine)
return DevirtModule::runForTesting(M, LegacyAARGetter(*this));
- return DevirtModule(M, LegacyAARGetter(*this), Action, Summary).run();
+ return DevirtModule(M, LegacyAARGetter(*this), ExportSummary, ImportSummary)
+ .run();
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -524,9 +530,10 @@ INITIALIZE_PASS_END(WholeProgramDevirt, "wholeprogramdevirt",
"Whole program devirtualization", false, false)
char WholeProgramDevirt::ID = 0;
-ModulePass *llvm::createWholeProgramDevirtPass(PassSummaryAction Action,
- ModuleSummaryIndex *Summary) {
- return new WholeProgramDevirt(Action, Summary);
+ModulePass *
+llvm::createWholeProgramDevirtPass(ModuleSummaryIndex *ExportSummary,
+ const ModuleSummaryIndex *ImportSummary) {
+ return new WholeProgramDevirt(ExportSummary, ImportSummary);
}
PreservedAnalyses WholeProgramDevirtPass::run(Module &M,
@@ -535,7 +542,7 @@ PreservedAnalyses WholeProgramDevirtPass::run(Module &M,
auto AARGetter = [&](Function &F) -> AAResults & {
return FAM.getResult<AAManager>(F);
};
- if (!DevirtModule(M, AARGetter, PassSummaryAction::None, nullptr).run())
+ if (!DevirtModule(M, AARGetter, nullptr, nullptr).run())
return PreservedAnalyses::all();
return PreservedAnalyses::none();
}
@@ -557,7 +564,12 @@ bool DevirtModule::runForTesting(
ExitOnErr(errorCodeToError(In.error()));
}
- bool Changed = DevirtModule(M, AARGetter, ClSummaryAction, &Summary).run();
+ bool Changed =
+ DevirtModule(
+ M, AARGetter,
+ ClSummaryAction == PassSummaryAction::Export ? &Summary : nullptr,
+ ClSummaryAction == PassSummaryAction::Import ? &Summary : nullptr)
+ .run();
if (!ClWriteSummary.empty()) {
ExitOnError ExitOnErr(
@@ -1197,7 +1209,7 @@ void DevirtModule::scanTypeCheckedLoadUsers(Function *TypeCheckedLoadFunc) {
void DevirtModule::importResolution(VTableSlot Slot, VTableSlotInfo &SlotInfo) {
const TypeIdSummary *TidSummary =
- Summary->getTypeIdSummary(cast<MDString>(Slot.TypeID)->getString());
+ ImportSummary->getTypeIdSummary(cast<MDString>(Slot.TypeID)->getString());
if (!TidSummary)
return;
auto ResI = TidSummary->WPDRes.find(Slot.ByteOffset);
@@ -1270,7 +1282,7 @@ bool DevirtModule::run() {
// Normally if there are no users of the devirtualization intrinsics in the
// module, this pass has nothing to do. But if we are exporting, we also need
// to handle any users that appear only in the function summaries.
- if (Action != PassSummaryAction::Export &&
+ if (!ExportSummary &&
(!TypeTestFunc || TypeTestFunc->use_empty() || !AssumeFunc ||
AssumeFunc->use_empty()) &&
(!TypeCheckedLoadFunc || TypeCheckedLoadFunc->use_empty()))
@@ -1282,7 +1294,7 @@ bool DevirtModule::run() {
if (TypeCheckedLoadFunc)
scanTypeCheckedLoadUsers(TypeCheckedLoadFunc);
- if (Action == PassSummaryAction::Import) {
+ if (ImportSummary) {
for (auto &S : CallSlots)
importResolution(S.first, S.second);
@@ -1301,7 +1313,7 @@ bool DevirtModule::run() {
return true;
// Collect information from summary about which calls to try to devirtualize.
- if (Action == PassSummaryAction::Export) {
+ if (ExportSummary) {
DenseMap<GlobalValue::GUID, TinyPtrVector<Metadata *>> MetadataByGUID;
for (auto &P : TypeIdMap) {
if (auto *TypeId = dyn_cast<MDString>(P.first))
@@ -1309,7 +1321,7 @@ bool DevirtModule::run() {
TypeId);
}
- for (auto &P : *Summary) {
+ for (auto &P : *ExportSummary) {
for (auto &S : P.second) {
auto *FS = dyn_cast<FunctionSummary>(S.get());
if (!FS)
@@ -1358,8 +1370,8 @@ bool DevirtModule::run() {
if (tryFindVirtualCallTargets(TargetsForSlot, TypeIdMap[S.first.TypeID],
S.first.ByteOffset)) {
WholeProgramDevirtResolution *Res = nullptr;
- if (Action == PassSummaryAction::Export && isa<MDString>(S.first.TypeID))
- Res = &Summary
+ if (ExportSummary && isa<MDString>(S.first.TypeID))
+ Res = &ExportSummary
->getOrInsertTypeIdSummary(
cast<MDString>(S.first.TypeID)->getString())
.WPDRes[S.first.ByteOffset];
@@ -1379,7 +1391,7 @@ bool DevirtModule::run() {
// intrinsics were *not* devirtualized, we need to add the resulting
// llvm.type.test intrinsics to the function summaries so that the
// LowerTypeTests pass will export them.
- if (Action == PassSummaryAction::Export && isa<MDString>(S.first.TypeID)) {
+ if (ExportSummary && isa<MDString>(S.first.TypeID)) {
auto GUID =
GlobalValue::getGUID(cast<MDString>(S.first.TypeID)->getString());
for (auto FS : S.second.CSInfo.SummaryTypeCheckedLoadUsers)
OpenPOWER on IntegriCloud