aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SCCPSolver.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2025-06-19 17:26:54 +0200
committerNikita Popov <npopov@redhat.com>2025-06-19 17:28:39 +0200
commitf4db14229cd975822c41376afda9d56a29f9396c (patch)
tree3ab0b5a0d466b07a4b28fb1beacd818195de5d03 /llvm/lib/Transforms/Utils/SCCPSolver.cpp
parent36af7345dfb8e84a1f2971db34089b63321e8467 (diff)
downloadllvm-f4db14229cd975822c41376afda9d56a29f9396c.zip
llvm-f4db14229cd975822c41376afda9d56a29f9396c.tar.gz
llvm-f4db14229cd975822c41376afda9d56a29f9396c.tar.bz2
[SCCP] Move logic for removing ssa.copy into Solver (NFC)
So it can be reused between IPSCCP and SCCP. Make the implementation a bit more efficient by only lookup the PredicateInfo once.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SCCPSolver.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SCCPSolver.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
index f4b378b..cc0bb47 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<PredicateInfo>(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<IntrinsicInst>(&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);
}