From c5595c0ce31045189a2829e2ac109833f167b6e6 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Wed, 14 Aug 2019 21:25:08 +0000 Subject: [PATCH] [Attributor] Do not update or manifest dead attributes Summary: If the associated context instruction is assumed dead we do not need to update or manifest the state. Reviewers: sstefan1, uenoku Subscribers: hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66116 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368921 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/IPO/Attributor.h | 6 ++++++ lib/Transforms/IPO/Attributor.cpp | 26 +++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/include/llvm/Transforms/IPO/Attributor.h b/include/llvm/Transforms/IPO/Attributor.h index 34b3ea9a6bd..cd5f64c265c 100644 --- a/include/llvm/Transforms/IPO/Attributor.h +++ b/include/llvm/Transforms/IPO/Attributor.h @@ -104,6 +104,7 @@ namespace llvm { struct AbstractAttribute; struct InformationCache; +struct AAIsDead; class Function; @@ -652,6 +653,11 @@ struct Attributor { void identifyDefaultAbstractAttributes( Function &F, DenseSet *Whitelist = nullptr); + /// Return true if \p AA (or its context instruction) is assumed dead. + /// + /// If \p LivenessAA is not provided it is queried. + bool isAssumedDead(const AbstractAttribute &AA, const AAIsDead *LivenessAA); + /// Check \p Pred on all function call sites. /// /// This method will evaluate \p Pred on call sites and return diff --git a/lib/Transforms/IPO/Attributor.cpp b/lib/Transforms/IPO/Attributor.cpp index 33a49a5f954..2f062bfac5e 100644 --- a/lib/Transforms/IPO/Attributor.cpp +++ b/lib/Transforms/IPO/Attributor.cpp @@ -1076,7 +1076,6 @@ AANonNullImpl::generatePredicate(Attributor &A) { std::function &)> Pred = [&](Value &RV, const SmallPtrSetImpl &RetInsts) -> bool { - if (isKnownNonZero(&RV, A.getDataLayout())) return true; @@ -2143,6 +2142,23 @@ struct AANoReturnFunction final : AANoReturnImpl { /// Attributor /// ---------------------------------------------------------------------------- +bool Attributor::isAssumedDead(const AbstractAttribute &AA, + const AAIsDead *LivenessAA) { + const Instruction *CtxI = AA.getIRPosition().getCtxI(); + if (!CtxI) + return false; + + if (!LivenessAA) + LivenessAA = + getAAFor(AA, IRPosition::function(*CtxI->getFunction())); + if (!LivenessAA || !LivenessAA->isAssumedDead(CtxI)) + return false; + + // TODO: Do not track dependences automatically but add it here as only a + // "is-assumed-dead" result causes a dependence. + return true; +} + bool Attributor::checkForAllCallSites(const function_ref &Pred, const AbstractAttribute &QueryingAA, bool RequireAllCallSites) { @@ -2354,8 +2370,9 @@ ChangeStatus Attributor::run() { // Update all abstract attribute in the work list and record the ones that // changed. for (AbstractAttribute *AA : Worklist) - if (AA->update(*this) == ChangeStatus::CHANGED) - ChangedAAs.push_back(AA); + if (!isAssumedDead(*AA, nullptr)) + if (AA->update(*this) == ChangeStatus::CHANGED) + ChangedAAs.push_back(AA); // Reset the work list and repopulate with the changed abstract attributes. // Note that dependent ones are added above. @@ -2415,6 +2432,9 @@ ChangeStatus Attributor::run() { if (!State.isValidState()) continue; + // Skip dead code. + if (isAssumedDead(*AA, nullptr)) + continue; // Manifest the state and record if we changed the IR. ChangeStatus LocalChange = AA->manifest(*this); if (LocalChange == ChangeStatus::CHANGED && AreStatisticsEnabled()) -- 2.50.1