diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp | 54 |
1 files changed, 15 insertions, 39 deletions
diff --git a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp index e6e5272..3daff3b 100644 --- a/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp +++ b/llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +#define DEBUG_TYPE "assume-builder" + #include "llvm/Transforms/Utils/AssumeBundleBuilder.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/MapVector.h" @@ -35,8 +37,6 @@ cl::opt<bool> EnableKnowledgeRetention( cl::desc( "enable preservation of attributes throughout code transformation")); -#define DEBUG_TYPE "assume-builder" - STATISTIC(NumAssumeBuilt, "Number of assume built by the assume builder"); STATISTIC(NumBundlesInAssumes, "Total number of Bundles in the assume built"); STATISTIC(NumAssumesMerged, @@ -65,7 +65,7 @@ bool isUsefullToPreserve(Attribute::AttrKind Kind) { /// This function will try to transform the given knowledge into a more /// canonical one. the canonical knowledge maybe the given one. -RetainedKnowledge canonicalizedKnowledge(RetainedKnowledge RK, DataLayout DL) { +RetainedKnowledge canonicalizedKnowledge(RetainedKnowledge RK, Module *M) { switch (RK.AttrKind) { default: return RK; @@ -76,7 +76,8 @@ RetainedKnowledge canonicalizedKnowledge(RetainedKnowledge RK, DataLayout DL) { Value *V = RK.WasOn->stripInBoundsOffsets([&](const Value *Strip) { if (auto *GEP = dyn_cast<GEPOperator>(Strip)) RK.ArgValue = - MinAlign(RK.ArgValue, GEP->getMaxPreservedAlignment(DL).value()); + MinAlign(RK.ArgValue, + GEP->getMaxPreservedAlignment(M->getDataLayout()).value()); }); RK.WasOn = V; return RK; @@ -84,8 +85,8 @@ RetainedKnowledge canonicalizedKnowledge(RetainedKnowledge RK, DataLayout DL) { case Attribute::Dereferenceable: case Attribute::DereferenceableOrNull: { int64_t Offset = 0; - Value *V = GetPointerBaseWithConstantOffset(RK.WasOn, Offset, DL, - /*AllowNonInBounds*/ false); + Value *V = GetPointerBaseWithConstantOffset( + RK.WasOn, Offset, M->getDataLayout(), /*AllowNonInBounds*/ false); if (Offset < 0) return RK; RK.ArgValue = RK.ArgValue + Offset; @@ -102,16 +103,16 @@ struct AssumeBuilderState { using MapKey = std::pair<Value *, Attribute::AttrKind>; SmallMapVector<MapKey, unsigned, 8> AssumedKnowledgeMap; - Instruction *InstBeingModified = nullptr; + Instruction *InstBeingRemoved = nullptr; AssumptionCache* AC = nullptr; DominatorTree* DT = nullptr; AssumeBuilderState(Module *M, Instruction *I = nullptr, AssumptionCache *AC = nullptr, DominatorTree *DT = nullptr) - : M(M), InstBeingModified(I), AC(AC), DT(DT) {} + : M(M), InstBeingRemoved(I), AC(AC), DT(DT) {} bool tryToPreserveWithoutAddingAssume(RetainedKnowledge RK) { - if (!InstBeingModified || !RK.WasOn) + if (!InstBeingRemoved || !RK.WasOn) return false; bool HasBeenPreserved = false; Use* ToUpdate = nullptr; @@ -119,12 +120,13 @@ struct AssumeBuilderState { RK.WasOn, {RK.AttrKind}, AC, [&](RetainedKnowledge RKOther, Instruction *Assume, const CallInst::BundleOpInfo *Bundle) { - if (!isValidAssumeForContext(Assume, InstBeingModified, DT)) + if (!isValidAssumeForContext(Assume, InstBeingRemoved, DT)) return false; if (RKOther.ArgValue >= RK.ArgValue) { HasBeenPreserved = true; return true; - } else if (isValidAssumeForContext(InstBeingModified, Assume, DT)) { + } else if (isValidAssumeForContext(InstBeingRemoved, Assume, + DT)) { HasBeenPreserved = true; IntrinsicInst *Intr = cast<IntrinsicInst>(Assume); ToUpdate = &Intr->op_begin()[Bundle->Begin + ABA_Argument]; @@ -160,14 +162,14 @@ struct AssumeBuilderState { if (RK.WasOn->use_empty()) return false; Use *SingleUse = RK.WasOn->getSingleUndroppableUse(); - if (SingleUse && SingleUse->getUser() == InstBeingModified) + if (SingleUse && SingleUse->getUser() == InstBeingRemoved) return false; } return true; } void addKnowledge(RetainedKnowledge RK) { - RK = canonicalizedKnowledge(RK, M->getDataLayout()); + RK = canonicalizedKnowledge(RK, M); if (!isKnowledgeWorthPreserving(RK)) return; @@ -297,32 +299,6 @@ void llvm::salvageKnowledge(Instruction *I, AssumptionCache *AC, } } -IntrinsicInst * -llvm::buildAssumeFromKnowledge(ArrayRef<RetainedKnowledge> Knowledge, - Instruction *CtxI, AssumptionCache *AC, - DominatorTree *DT) { - AssumeBuilderState Builder(CtxI->getModule(), CtxI, AC, DT); - for (const RetainedKnowledge &RK : Knowledge) - Builder.addKnowledge(RK); - return Builder.build(); -} - -RetainedKnowledge llvm::simplifyRetainedKnowledge(CallBase *Assume, - RetainedKnowledge RK, - AssumptionCache *AC, - DominatorTree *DT) { - assert(Assume->getIntrinsicID() == Intrinsic::assume); - AssumeBuilderState Builder(Assume->getModule(), Assume, AC, DT); - RK = canonicalizedKnowledge(RK, Assume->getModule()->getDataLayout()); - - if (!Builder.isKnowledgeWorthPreserving(RK)) - return RetainedKnowledge::none(); - - if (Builder.tryToPreserveWithoutAddingAssume(RK)) - return RetainedKnowledge::none(); - return RK; -} - namespace { struct AssumeSimplify { |