[llvm] 22e1f66 - [SCCP] add helper function for replacing signed operations; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 3 07:30:19 PDT 2022
Author: Sanjay Patel
Date: 2022-09-03T10:30:10-04:00
New Revision: 22e1f66f26b867ec2bb53c8d9ace489e0a54b1a0
URL: https://github.com/llvm/llvm-project/commit/22e1f66f26b867ec2bb53c8d9ace489e0a54b1a0
DIFF: https://github.com/llvm/llvm-project/commit/22e1f66f26b867ec2bb53c8d9ace489e0a54b1a0.diff
LOG: [SCCP] add helper function for replacing signed operations; NFC
Preliminary refactoring for planned enhancement in D133198.
Added:
Modified:
llvm/lib/Transforms/Scalar/SCCP.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp
index 45e3edf8b52f4..cccf1abf0a9ac 100644
--- a/llvm/lib/Transforms/Scalar/SCCP.cpp
+++ b/llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -154,6 +154,41 @@ static bool tryToReplaceWithConstant(SCCPSolver &Solver, Value *V) {
return true;
}
+/// Try to replace signed instructions with their unsigned equivalent.
+static bool replaceSignedInst(SCCPSolver &Solver,
+ SmallPtrSetImpl<Value *> &InsertedValues,
+ Instruction &Inst) {
+ // Determine if a signed value is known to be >= 0.
+ auto isNonNegative = [&Solver](Value *V) {
+ const ValueLatticeElement &IV = Solver.getLatticeValueFor(V);
+ return IV.isConstantRange(/*UndefAllowed=*/false) &&
+ IV.getConstantRange().isAllNonNegative();
+ };
+
+ Instruction *NewInst = nullptr;
+ switch (Inst.getOpcode()) {
+ case Instruction::SExt: {
+ // If the source value is not negative, this is a zext.
+ Value *Op0 = Inst.getOperand(0);
+ if (isa<Constant>(Op0) || InsertedValues.count(Op0) || !isNonNegative(Op0))
+ return false;
+ NewInst = new ZExtInst(Op0, Inst.getType(), "", &Inst);
+ break;
+ }
+ default:
+ return false;
+ }
+
+ // Wire up the new instruction and update state.
+ assert(NewInst && "Expected replacement instruction");
+ NewInst->takeName(&Inst);
+ InsertedValues.insert(NewInst);
+ Inst.replaceAllUsesWith(NewInst);
+ Solver.removeLatticeValueFor(&Inst);
+ Inst.eraseFromParent();
+ return true;
+}
+
static bool simplifyInstsInBlock(SCCPSolver &Solver, BasicBlock &BB,
SmallPtrSetImpl<Value *> &InsertedValues,
Statistic &InstRemovedStat,
@@ -168,23 +203,9 @@ static bool simplifyInstsInBlock(SCCPSolver &Solver, BasicBlock &BB,
MadeChanges = true;
++InstRemovedStat;
- } else if (isa<SExtInst>(&Inst)) {
- Value *ExtOp = Inst.getOperand(0);
- if (isa<Constant>(ExtOp) || InsertedValues.count(ExtOp))
- continue;
- const ValueLatticeElement &IV = Solver.getLatticeValueFor(ExtOp);
- if (!IV.isConstantRange(/*UndefAllowed=*/false))
- continue;
- if (IV.getConstantRange().isAllNonNegative()) {
- auto *ZExt = new ZExtInst(ExtOp, Inst.getType(), "", &Inst);
- ZExt->takeName(&Inst);
- InsertedValues.insert(ZExt);
- Inst.replaceAllUsesWith(ZExt);
- Solver.removeLatticeValueFor(&Inst);
- Inst.eraseFromParent();
- InstReplacedStat++;
- MadeChanges = true;
- }
+ } else if (replaceSignedInst(Solver, InsertedValues, Inst)) {
+ MadeChanges = true;
+ ++InstReplacedStat;
}
}
return MadeChanges;
More information about the llvm-commits
mailing list