summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/Attributor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/IPO/Attributor.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/Attributor.cpp174
1 files changed, 0 insertions, 174 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index f4e2ed4df98..fa5dbc23014 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -16,7 +16,6 @@
#include "llvm/Transforms/IPO/Attributor.h"
#include "llvm/ADT/DepthFirstIterator.h"
-#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
@@ -32,9 +31,6 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Transforms/Utils/BasicBlockUtils.h"
-#include "llvm/Transforms/Utils/Local.h"
-
#include <cassert>
using namespace llvm;
@@ -1415,173 +1411,6 @@ ChangeStatus AANoAliasReturned::updateImpl(Attributor &A) {
return ChangeStatus::UNCHANGED;
}
-/// -------------------AAIsDead Function Attribute-----------------------
-
-struct AAIsDeadFunction : AAIsDead, BooleanState {
-
- AAIsDeadFunction(Function &F, InformationCache &InfoCache)
- : AAIsDead(F, InfoCache) {}
-
- /// See AbstractAttribute::getState()
- /// {
- AbstractState &getState() override { return *this; }
- const AbstractState &getState() const override { return *this; }
- /// }
-
- /// See AbstractAttribute::getManifestPosition().
- ManifestPosition getManifestPosition() const override { return MP_FUNCTION; }
-
- void initialize(Attributor &A) override {
- Function &F = getAnchorScope();
-
- ToBeExploredPaths.insert(&(F.getEntryBlock().front()));
- AssumedLiveBlocks.insert(&(F.getEntryBlock()));
- for (size_t i = 0; i < ToBeExploredPaths.size(); ++i)
- explorePath(A, ToBeExploredPaths[i]);
- }
-
- /// Explores new instructions starting from \p I. If instruction is dead, stop
- /// and return true if it discovered a new instruction.
- bool explorePath(Attributor &A, Instruction *I);
-
- const std::string getAsStr() const override {
- return "LiveBBs(" + std::to_string(AssumedLiveBlocks.size()) + "/" +
- std::to_string(getAnchorScope().size()) + ")";
- }
-
- /// See AbstractAttribute::manifest(...).
- ChangeStatus manifest(Attributor &A) override {
- assert(getState().isValidState() &&
- "Attempted to manifest an invalid state!");
-
- ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
-
- for (Instruction *I : NoReturnCalls) {
- BasicBlock *BB = I->getParent();
-
- /// Invoke is replaced with a call and unreachable is placed after it.
- if (auto *II = dyn_cast<InvokeInst>(I)) {
- changeToCall(II);
- changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false);
- LLVM_DEBUG(dbgs() << "[AAIsDead] Replaced invoke with call inst\n");
- continue;
- }
-
- SplitBlock(BB, I->getNextNode());
- changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false);
- HasChanged = ChangeStatus::CHANGED;
- }
-
- return HasChanged;
- }
-
- /// See AbstractAttribute::updateImpl(...).
- ChangeStatus updateImpl(Attributor &A) override;
-
- /// See AAIsDead::isAssumedDead().
- bool isAssumedDead(BasicBlock *BB) const override {
- if (!getAssumed())
- return false;
- return !AssumedLiveBlocks.count(BB);
- }
-
- /// See AAIsDead::isKnownDead().
- bool isKnownDead(BasicBlock *BB) const override {
- if (!getKnown())
- return false;
- return !AssumedLiveBlocks.count(BB);
- }
-
- /// Collection of to be explored paths.
- SmallSetVector<Instruction *, 8> ToBeExploredPaths;
-
- /// Collection of all assumed live BasicBlocks.
- DenseSet<BasicBlock *> AssumedLiveBlocks;
-
- /// Collection of calls with noreturn attribute, assumed or knwon.
- SmallSetVector<Instruction *, 4> NoReturnCalls;
-};
-
-bool AAIsDeadFunction::explorePath(Attributor &A, Instruction *I) {
- BasicBlock *BB = I->getParent();
-
- while (I) {
- ImmutableCallSite ICS(I);
-
- if (ICS) {
- auto *NoReturnAA = A.getAAFor<AANoReturn>(*this, *I);
-
- if (NoReturnAA && NoReturnAA->isAssumedNoReturn()) {
- if (!NoReturnCalls.insert(I))
- // If I is already in the NoReturnCalls set, then it stayed noreturn
- // and we didn't discover any new instructions.
- return false;
-
- // Discovered new noreturn call, return true to indicate that I is not
- // noreturn anymore and should be deleted from NoReturnCalls.
- return true;
- }
-
- if (ICS.hasFnAttr(Attribute::NoReturn)) {
- if(!NoReturnCalls.insert(I))
- return false;
-
- return true;
- }
- }
-
- I = I->getNextNode();
- }
-
- // get new paths (reachable blocks).
- for (BasicBlock *SuccBB : successors(BB)) {
- Instruction *Inst = &(SuccBB->front());
- AssumedLiveBlocks.insert(SuccBB);
- ToBeExploredPaths.insert(Inst);
- }
-
- return true;
-}
-
-ChangeStatus AAIsDeadFunction::updateImpl(Attributor &A) {
- Function &F = getAnchorScope();
-
- // Temporary collection to iterate over existing noreturn instructions. This
- // will alow easier modification of NoReturnCalls collection
- SmallVector<Instruction *, 8> NoReturnChanged;
- ChangeStatus Status = ChangeStatus::UNCHANGED;
-
- for (Instruction *I : NoReturnCalls)
- NoReturnChanged.push_back(I);
-
- for (Instruction *I : NoReturnChanged) {
- size_t Size = ToBeExploredPaths.size();
-
- // Still noreturn.
- if (!explorePath(A, I))
- continue;
-
- NoReturnCalls.remove(I);
-
- // No new paths.
- if (Size == ToBeExploredPaths.size())
- continue;
-
- // At least one new path.
- Status = ChangeStatus::CHANGED;
-
- // explore new paths.
- while (Size != ToBeExploredPaths.size())
- explorePath(A, ToBeExploredPaths[Size++]);
- }
-
- LLVM_DEBUG(dbgs() << "[AAIsDead] AssumedLiveBlocks: "
- << AssumedLiveBlocks.size()
- << "Total number of blocks: " << F.size() << "\n");
-
- return Status;
-}
-
/// ----------------------------------------------------------------------------
/// Attributor
/// ----------------------------------------------------------------------------
@@ -1798,9 +1627,6 @@ void Attributor::identifyDefaultAbstractAttributes(
// Every function might be "will-return".
registerAA(*new AAWillReturnFunction(F, InfoCache));
- // Check for dead BasicBlocks in every function.
- registerAA(*new AAIsDeadFunction(F, InfoCache));
-
// Walk all instructions to find more attribute opportunities and also
// interesting instructions that might be queried by abstract attributes
// during their initialization or update.
OpenPOWER on IntegriCloud