[llvm] f4db142 - [SCCP] Move logic for removing ssa.copy into Solver (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 19 08:28:49 PDT 2025
Author: Nikita Popov
Date: 2025-06-19T17:28:39+02:00
New Revision: f4db14229cd975822c41376afda9d56a29f9396c
URL: https://github.com/llvm/llvm-project/commit/f4db14229cd975822c41376afda9d56a29f9396c
DIFF: https://github.com/llvm/llvm-project/commit/f4db14229cd975822c41376afda9d56a29f9396c.diff
LOG: [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.
Added:
Modified:
llvm/include/llvm/Transforms/Utils/SCCPSolver.h
llvm/lib/Transforms/IPO/SCCP.cpp
llvm/lib/Transforms/Utils/SCCPSolver.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/Utils/SCCPSolver.h b/llvm/include/llvm/Transforms/Utils/SCCPSolver.h
index c8fe4301b2b48..5aac7c2ac5d3e 100644
--- a/llvm/include/llvm/Transforms/Utils/SCCPSolver.h
+++ b/llvm/include/llvm/Transforms/Utils/SCCPSolver.h
@@ -77,6 +77,8 @@ class SCCPSolver {
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 43c5df3575003..d50de34dfa482 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<IntrinsicInst>(&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 f4b378b82daec..cc0bb4735c231 100644
--- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp
+++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
@@ -764,6 +764,26 @@ class SCCPInstVisitor : public InstVisitor<SCCPInstVisitor> {
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);
}
More information about the llvm-commits
mailing list