From 22e1f66f26b867ec2bb53c8d9ace489e0a54b1a0 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Sat, 3 Sep 2022 10:12:13 -0400 Subject: [PATCH] [SCCP] add helper function for replacing signed operations; NFC Preliminary refactoring for planned enhancement in D133198. --- llvm/lib/Transforms/Scalar/SCCP.cpp | 55 +++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 45e3edf..cccf1ab 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 &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(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 &InsertedValues, Statistic &InstRemovedStat, @@ -168,23 +203,9 @@ static bool simplifyInstsInBlock(SCCPSolver &Solver, BasicBlock &BB, MadeChanges = true; ++InstRemovedStat; - } else if (isa(&Inst)) { - Value *ExtOp = Inst.getOperand(0); - if (isa(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; -- 2.7.4