diff --git a/llvm/include/llvm/Transforms/Utils/SCCPSolver.h b/llvm/include/llvm/Transforms/Utils/SCCPSolver.h index c8fe4301b2b4..5aac7c2ac5d3 100644 --- a/llvm/include/llvm/Transforms/Utils/SCCPSolver.h +++ b/llvm/include/llvm/Transforms/Utils/SCCPSolver.h @@ -77,6 +77,8 @@ public: LLVM_ABI void addPredicateInfo(Function &F, DominatorTree &DT, AssumptionCache &AC); + LLVM_ABI void removeSSACopies(Function &F); + /// markBlockExecutable - This method can be used by clients to mark all of /// the blocks that are known to be intrinsically live in the processed unit. /// This returns true if the block was not considered live before. diff --git a/llvm/lib/Transforms/IPO/SCCP.cpp b/llvm/lib/Transforms/IPO/SCCP.cpp index 43c5df357500..d50de34dfa48 100644 --- a/llvm/lib/Transforms/IPO/SCCP.cpp +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -250,19 +250,7 @@ static bool runIPSCCP( if (!DeadBB->hasAddressTaken()) DTU.deleteBB(DeadBB); - for (BasicBlock &BB : F) { - for (Instruction &Inst : llvm::make_early_inc_range(BB)) { - if (Solver.getPredicateInfoFor(&Inst)) { - if (auto *II = dyn_cast(&Inst)) { - if (II->getIntrinsicID() == Intrinsic::ssa_copy) { - Value *Op = II->getOperand(0); - Inst.replaceAllUsesWith(Op); - Inst.eraseFromParent(); - } - } - } - } - } + Solver.removeSSACopies(F); } // If we inferred constant or undef return values for a function, we replaced diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp index f4b378b82dae..cc0bb4735c23 100644 --- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp +++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp @@ -764,6 +764,26 @@ public: FnPredicateInfo.insert({&F, std::make_unique(F, DT, AC)}); } + void removeSSACopies(Function &F) { + auto It = FnPredicateInfo.find(&F); + if (It == FnPredicateInfo.end()) + return; + + for (BasicBlock &BB : F) { + for (Instruction &Inst : llvm::make_early_inc_range(BB)) { + if (It->second->getPredicateInfoFor(&Inst)) { + if (auto *II = dyn_cast(&Inst)) { + if (II->getIntrinsicID() == Intrinsic::ssa_copy) { + Value *Op = II->getOperand(0); + Inst.replaceAllUsesWith(Op); + Inst.eraseFromParent(); + } + } + } + } + } + } + void visitCallInst(CallInst &I) { visitCallBase(I); } bool markBlockExecutable(BasicBlock *BB); @@ -2168,6 +2188,10 @@ void SCCPSolver::addPredicateInfo(Function &F, DominatorTree &DT, Visitor->addPredicateInfo(F, DT, AC); } +void SCCPSolver::removeSSACopies(Function &F) { + Visitor->removeSSACopies(F); +} + bool SCCPSolver::markBlockExecutable(BasicBlock *BB) { return Visitor->markBlockExecutable(BB); }