diff options
author | Tyker <tyker1@outlook.com> | 2020-05-10 18:20:34 +0200 |
---|---|---|
committer | Tyker <tyker1@outlook.com> | 2020-05-10 19:23:59 +0200 |
commit | 821a0f23d83921bf32a0a290b5f267f3514d09df (patch) | |
tree | 3286dd32e3cd271ef433f8777f4dd718f05ff5fc /llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp | |
parent | 7f22ceeaae74911d97773644a1058659f329887e (diff) | |
download | llvm-821a0f23d83921bf32a0a290b5f267f3514d09df.zip llvm-821a0f23d83921bf32a0a290b5f267f3514d09df.tar.gz llvm-821a0f23d83921bf32a0a290b5f267f3514d09df.tar.bz2 |
[AssumeBundles] Prevent generation of some redundant assumes
Summary: with this patch the assume salvageKnowledge will not generate assume if all knowledge is already available in an assume with valid context. assume bulider can also in some cases update an existing assume with better information.
Reviewers: jdoerfert
Reviewed By: jdoerfert
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D78014
Diffstat (limited to 'llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp index ab82950..55b9ce7 100644 --- a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp +++ b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp @@ -9,7 +9,8 @@ #include "llvm/Transforms/Utils/AssumeBundleBuilder.h" #include "llvm/Analysis/AssumeBundleQueries.h" #include "llvm/Analysis/AssumptionCache.h" -#include "llvm/ADT/DenseSet.h" +#include "llvm/Analysis/ValueTracking.h" +#include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/IntrinsicInst.h" @@ -74,10 +75,45 @@ struct AssumeBuilderState { using MapKey = std::pair<Value *, Attribute::AttrKind>; SmallDenseMap<MapKey, unsigned, 8> AssumedKnowledgeMap; Instruction *InsertBeforeInstruction = nullptr; + AssumptionCache* AC = nullptr; + DominatorTree* DT = nullptr; - AssumeBuilderState(Module *M) : M(M) {} + AssumeBuilderState(Module *M, Instruction *I = nullptr, + AssumptionCache *AC = nullptr, DominatorTree *DT = nullptr) + : M(M), InsertBeforeInstruction(I), AC(AC), DT(DT) {} + + bool tryToPreserveWithoutAddingAssume(RetainedKnowledge RK) { + if (!InsertBeforeInstruction || !AC || !RK.WasOn) + return false; + bool HasBeenPreserved = false; + Use* ToUpdate = nullptr; + getKnowledgeForValue( + RK.WasOn, {RK.AttrKind}, AC, + [&](RetainedKnowledge RKOther, Instruction *Assume, + const CallInst::BundleOpInfo *Bundle) { + if (!isValidAssumeForContext(Assume, InsertBeforeInstruction, DT)) + return false; + if (RKOther.ArgValue >= RK.ArgValue) { + HasBeenPreserved = true; + return true; + } else if (isValidAssumeForContext(InsertBeforeInstruction, Assume, + DT)) { + HasBeenPreserved = true; + IntrinsicInst *Intr = cast<IntrinsicInst>(Assume); + ToUpdate = &Intr->op_begin()[Bundle->Begin + ABA_Argument]; + return true; + } + return false; + }); + if (ToUpdate) + ToUpdate->set( + ConstantInt::get(Type::getInt64Ty(M->getContext()), RK.ArgValue)); + return HasBeenPreserved; + } void addKnowledge(RetainedKnowledge RK) { + if (tryToPreserveWithoutAddingAssume(RK)) + return; MapKey Key{RK.WasOn, RK.AttrKind}; auto Lookup = AssumedKnowledgeMap.find(Key); if (Lookup == AssumedKnowledgeMap.end()) { @@ -185,11 +221,10 @@ IntrinsicInst *llvm::buildAssumeFromInst(Instruction *I) { return Builder.build(); } -void llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC) { +void llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC, DominatorTree* DT) { if (!EnableKnowledgeRetention) return; - AssumeBuilderState Builder(I->getModule()); - Builder.InsertBeforeInstruction = I; + AssumeBuilderState Builder(I->getModule(), I, AC, DT); Builder.addInstruction(I); if (IntrinsicInst *Intr = Builder.build()) { Intr->insertBefore(I); @@ -200,8 +235,9 @@ void llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC) { PreservedAnalyses AssumeBuilderPass::run(Function &F, FunctionAnalysisManager &AM) { + AssumptionCache* AC = AM.getCachedResult<AssumptionAnalysis>(F); + DominatorTree* DT = AM.getCachedResult<DominatorTreeAnalysis>(F); for (Instruction &I : instructions(F)) - if (Instruction *Assume = buildAssumeFromInst(&I)) - Assume->insertBefore(&I); + salvageKnowledge(&I, AC, DT); return PreservedAnalyses::all(); } |