48#define DEBUG_TYPE "correlated-value-propagation"
51STATISTIC(NumPhiCommon,
"Number of phis deleted via common incoming value");
52STATISTIC(NumSelects,
"Number of selects propagated");
53STATISTIC(NumCmps,
"Number of comparisons propagated");
54STATISTIC(NumReturns,
"Number of return values propagated");
55STATISTIC(NumDeadCases,
"Number of switch cases removed");
57 "Number of sdivs/srems whose width was decreased");
58STATISTIC(NumSDivs,
"Number of sdiv converted to udiv");
60 "Number of udivs/urems whose width was decreased");
61STATISTIC(NumAShrsConverted,
"Number of ashr converted to lshr");
62STATISTIC(NumAShrsRemoved,
"Number of ashr removed");
63STATISTIC(NumSRems,
"Number of srem converted to urem");
64STATISTIC(NumSExt,
"Number of sext converted to zext");
65STATISTIC(NumSICmps,
"Number of signed icmp preds simplified to unsigned");
68STATISTIC(NumNSW,
"Number of no-signed-wrap deductions");
69STATISTIC(NumNUW,
"Number of no-unsigned-wrap deductions");
70STATISTIC(NumAddNW,
"Number of no-wrap deductions for add");
71STATISTIC(NumAddNSW,
"Number of no-signed-wrap deductions for add");
72STATISTIC(NumAddNUW,
"Number of no-unsigned-wrap deductions for add");
73STATISTIC(NumSubNW,
"Number of no-wrap deductions for sub");
74STATISTIC(NumSubNSW,
"Number of no-signed-wrap deductions for sub");
75STATISTIC(NumSubNUW,
"Number of no-unsigned-wrap deductions for sub");
76STATISTIC(NumMulNW,
"Number of no-wrap deductions for mul");
77STATISTIC(NumMulNSW,
"Number of no-signed-wrap deductions for mul");
78STATISTIC(NumMulNUW,
"Number of no-unsigned-wrap deductions for mul");
79STATISTIC(NumShlNW,
"Number of no-wrap deductions for shl");
80STATISTIC(NumShlNSW,
"Number of no-signed-wrap deductions for shl");
81STATISTIC(NumShlNUW,
"Number of no-unsigned-wrap deductions for shl");
82STATISTIC(NumAbs,
"Number of llvm.abs intrinsics removed");
83STATISTIC(NumOverflows,
"Number of overflow checks removed");
85 "Number of saturating arithmetics converted to normal arithmetics");
86STATISTIC(NumNonNull,
"Number of function pointer arguments marked non-null");
87STATISTIC(NumMinMax,
"Number of llvm.[us]{min,max} intrinsics removed");
89 "Number of llvm.s{min,max} intrinsics simplified to unsigned");
91 "Number of bound udiv's/urem's expanded");
92STATISTIC(NumZExt,
"Number of non-negative deductions");
100 auto *
C = dyn_cast<CmpInst>(V);
104 Value *Op0 =
C->getOperand(0);
105 Constant *Op1 = dyn_cast<Constant>(
C->getOperand(1));
110 C->getPredicate(), Op0, Op1, At,
false);
123 bool Changed =
false;
125 auto *
I = cast<Instruction>(U.getUser());
127 if (
auto *PN = dyn_cast<PHINode>(
I))
133 auto *CI = dyn_cast_or_null<ConstantInt>(
C);
163 Value *CommonValue =
nullptr;
164 for (
unsigned i = 0, e =
P->getNumIncomingValues(); i != e; ++i) {
166 if (
auto *IncomingConstant = dyn_cast<Constant>(
Incoming)) {
167 IncomingConstants.
push_back(std::make_pair(IncomingConstant, i));
168 }
else if (!CommonValue) {
171 }
else if (
Incoming != CommonValue) {
177 if (!CommonValue || IncomingConstants.
empty())
182 if (
auto *CommonInst = dyn_cast<Instruction>(CommonValue))
189 for (
auto &IncomingConstant : IncomingConstants) {
191 BasicBlock *IncomingBB =
P->getIncomingBlock(IncomingConstant.second);
204 P->replaceAllUsesWith(CommonValue);
205 P->eraseFromParent();
220 auto *SI = dyn_cast<SelectInst>(
Incoming);
226 Value *Condition = SI->getCondition();
230 return SI->getTrueValue();
231 if (
C->isZeroValue())
232 return SI->getFalseValue();
242 if (
auto *
C = dyn_cast<Constant>(SI->getFalseValue()))
245 return SI->getTrueValue();
249 if (
auto *
C = dyn_cast<Constant>(SI->getTrueValue()))
252 return SI->getFalseValue();
259 bool Changed =
false;
262 for (
unsigned i = 0, e =
P->getNumIncomingValues(); i < e; ++i) {
264 if (isa<Constant>(
Incoming))
continue;
268 P->setIncomingValue(i, V);
274 P->replaceAllUsesWith(V);
275 P->eraseFromParent();
290 if (Cmp->getType()->isVectorTy() ||
291 !Cmp->getOperand(0)->getType()->isIntegerTy())
294 if (!Cmp->isSigned())
305 if (UnsignedPred == ICmpInst::Predicate::BAD_ICMP_PREDICATE)
309 Cmp->setPredicate(UnsignedPred);
319 Value *Op0 = Cmp->getOperand(0);
320 Value *Op1 = Cmp->getOperand(1);
330 Cmp->replaceAllUsesWith(TorF);
331 Cmp->eraseFromParent();
339 if (
auto *ICmp = dyn_cast<ICmpInst>(Cmp))
360 bool Changed =
false;
363 SuccessorsCount[Succ]++;
369 for (
auto CI = SI->case_begin(), CE = SI->case_end(); CI != CE;) {
379 CI = SI.removeCase(CI);
384 Cond = SI->getCondition();
388 if (--SuccessorsCount[Succ] == 0)
396 SI->setCondition(Case);
397 NumDeadCases += SI->getNumCases();
427 bool NewNSW,
bool NewNUW) {
430 case Instruction::Add:
435 case Instruction::Sub:
440 case Instruction::Mul:
445 case Instruction::Shl:
454 auto *Inst = dyn_cast<Instruction>(V);
461 Inst->setHasNoSignedWrap();
469 Inst->setHasNoUnsignedWrap();
480 Type *Ty =
X->getType();
484 bool IsIntMinPoison = cast<ConstantInt>(II->
getArgOperand(1))->isOne();
498 if (Range.getSignedMax().isNonPositive()) {
507 if (
auto *BO = dyn_cast<BinaryOperator>(NegX))
515 if (!IsIntMinPoison && !Range.contains(IntMin)) {
532 if (LHS_CR.
icmp(Pred, RHS_CR)) {
538 if (RHS_CR.
icmp(Pred, LHS_CR)) {
582 if (
auto *BO = dyn_cast<BinaryOperator>(NewOp))
590 bool NSW = SI->isSigned();
591 bool NUW = !SI->isSigned();
593 Opcode, SI->getLHS(), SI->getRHS(), SI->getName(), SI->getIterator());
597 SI->replaceAllUsesWith(BinOp);
598 SI->eraseFromParent();
602 if (
auto *BO = dyn_cast<BinaryOperator>(BinOp))
615 if (
auto *MM = dyn_cast<MinMaxIntrinsic>(&CB)) {
619 if (
auto *WO = dyn_cast<WithOverflowInst>(&CB)) {
620 if (WO->getLHS()->getType()->isIntegerTy() &&
willNotOverflow(WO, LVI)) {
625 if (
auto *SI = dyn_cast<SaturatingInst>(&CB)) {
631 bool Changed =
false;
641 for (
const Use &ConstU : DeoptBundle->Inputs) {
642 Use &U =
const_cast<Use&
>(ConstU);
644 if (V->getType()->isVectorTy())
continue;
645 if (isa<Constant>(V))
continue;
671 assert(ArgNo == CB.
arg_size() &&
"Call arguments not processed correctly.");
676 NumNonNull += ArgNos.
size();
700 assert(Instr->getOpcode() == Instruction::SDiv ||
701 Instr->getOpcode() == Instruction::SRem);
702 assert(!Instr->getType()->isVectorTy());
706 unsigned OrigWidth = Instr->getType()->getIntegerBitWidth();
710 unsigned MinSignedBits =
720 unsigned NewWidth = std::max<unsigned>(
PowerOf2Ceil(MinSignedBits), 8);
724 if (NewWidth >= OrigWidth)
727 ++NumSDivSRemsNarrowed;
730 auto *
LHS =
B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
731 Instr->getName() +
".lhs.trunc");
732 auto *
RHS =
B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
733 Instr->getName() +
".rhs.trunc");
734 auto *BO =
B.CreateBinOp(Instr->getOpcode(),
LHS,
RHS, Instr->getName());
735 auto *Sext =
B.CreateSExt(BO, Instr->getType(), Instr->getName() +
".sext");
736 if (
auto *BinOp = dyn_cast<BinaryOperator>(BO))
737 if (BinOp->getOpcode() == Instruction::SDiv)
738 BinOp->setIsExact(Instr->isExact());
740 Instr->replaceAllUsesWith(Sext);
741 Instr->eraseFromParent();
747 Type *Ty = Instr->getType();
748 assert(Instr->getOpcode() == Instruction::UDiv ||
749 Instr->getOpcode() == Instruction::URem);
751 bool IsRem = Instr->getOpcode() == Instruction::URem;
753 Value *
X = Instr->getOperand(0);
754 Value *
Y = Instr->getOperand(1);
758 if (XCR.
icmp(ICmpInst::ICMP_ULT, YCR)) {
760 Instr->eraseFromParent();
761 ++NumUDivURemsNarrowedExpanded;
789 if (!XCR.
icmp(ICmpInst::ICMP_ULT,
796 if (XCR.
icmp(ICmpInst::ICMP_UGE, YCR)) {
799 ExpandedOp =
B.CreateNUWSub(
X,
Y);
801 ExpandedOp = ConstantInt::get(Instr->getType(), 1);
807 FrozenX =
B.CreateFreeze(
X,
X->getName() +
".frozen");
810 FrozenY =
B.CreateFreeze(
Y,
Y->getName() +
".frozen");
811 auto *AdjX =
B.CreateNUWSub(FrozenX, FrozenY, Instr->getName() +
".urem");
812 auto *Cmp =
B.CreateICmp(ICmpInst::ICMP_ULT, FrozenX, FrozenY,
813 Instr->getName() +
".cmp");
814 ExpandedOp =
B.CreateSelect(Cmp, FrozenX, AdjX);
817 B.CreateICmp(ICmpInst::ICMP_UGE,
X,
Y, Instr->getName() +
".cmp");
818 ExpandedOp =
B.CreateZExt(Cmp, Ty, Instr->getName() +
".udiv");
821 Instr->replaceAllUsesWith(ExpandedOp);
822 Instr->eraseFromParent();
823 ++NumUDivURemsNarrowedExpanded;
831 assert(Instr->getOpcode() == Instruction::UDiv ||
832 Instr->getOpcode() == Instruction::URem);
833 assert(!Instr->getType()->isVectorTy());
842 unsigned NewWidth = std::max<unsigned>(
PowerOf2Ceil(MaxActiveBits), 8);
846 if (NewWidth >= Instr->getType()->getIntegerBitWidth())
849 ++NumUDivURemsNarrowed;
852 auto *
LHS =
B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
853 Instr->getName() +
".lhs.trunc");
854 auto *
RHS =
B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
855 Instr->getName() +
".rhs.trunc");
856 auto *BO =
B.CreateBinOp(Instr->getOpcode(),
LHS,
RHS, Instr->getName());
857 auto *Zext =
B.CreateZExt(BO, Instr->getType(), Instr->getName() +
".zext");
858 if (
auto *BinOp = dyn_cast<BinaryOperator>(BO))
859 if (BinOp->getOpcode() == Instruction::UDiv)
860 BinOp->setIsExact(Instr->isExact());
862 Instr->replaceAllUsesWith(Zext);
863 Instr->eraseFromParent();
868 assert(Instr->getOpcode() == Instruction::UDiv ||
869 Instr->getOpcode() == Instruction::URem);
870 if (Instr->getType()->isVectorTy())
908 for (Operand &
Op : Ops) {
917 auto *URem = BinaryOperator::CreateURem(Ops[0].V, Ops[1].V, SDI->
getName(),
970 for (Operand &
Op : Ops) {
979 auto *UDiv = BinaryOperator::CreateUDiv(Ops[0].V, Ops[1].V, SDI->
getName(),
982 UDiv->setIsExact(SDI->
isExact());
987 if (Ops[0].
D != Ops[1].
D) {
1003 assert(Instr->getOpcode() == Instruction::SDiv ||
1004 Instr->getOpcode() == Instruction::SRem);
1005 if (Instr->getType()->isVectorTy())
1013 if (Instr->getOpcode() == Instruction::SDiv)
1017 if (Instr->getOpcode() == Instruction::SRem) {
1034 if (NegOneOrZero.
contains(LRange)) {
1045 ++NumAShrsConverted;
1050 BO->setIsExact(SDI->
isExact());
1069 ZExt->takeName(SDI);
1116 bool Changed =
false;
1117 bool NewNUW =
false, NewNSW =
false;
1120 Opcode, RRange, OBO::NoUnsignedWrap);
1121 NewNUW = NUWRange.
contains(LRange);
1126 Opcode, RRange, OBO::NoSignedWrap);
1127 NewNSW = NSWRange.
contains(LRange);
1144 if (!
RHS || !
RHS->getValue().isMask())
1162 bool FnChanged =
false;
1169 bool BBChanged =
false;
1171 switch (II.getOpcode()) {
1172 case Instruction::Select:
1175 case Instruction::PHI:
1176 BBChanged |=
processPHI(cast<PHINode>(&II), LVI, DT, SQ);
1178 case Instruction::ICmp:
1179 case Instruction::FCmp:
1180 BBChanged |=
processCmp(cast<CmpInst>(&II), LVI);
1182 case Instruction::Call:
1183 case Instruction::Invoke:
1186 case Instruction::SRem:
1187 case Instruction::SDiv:
1190 case Instruction::UDiv:
1191 case Instruction::URem:
1194 case Instruction::AShr:
1195 BBChanged |=
processAShr(cast<BinaryOperator>(&II), LVI);
1197 case Instruction::SExt:
1198 BBChanged |=
processSExt(cast<SExtInst>(&II), LVI);
1200 case Instruction::ZExt:
1201 BBChanged |=
processZExt(cast<ZExtInst>(&II), LVI);
1203 case Instruction::Add:
1204 case Instruction::Sub:
1205 case Instruction::Mul:
1206 case Instruction::Shl:
1207 BBChanged |=
processBinOp(cast<BinaryOperator>(&II), LVI);
1209 case Instruction::And:
1210 BBChanged |=
processAnd(cast<BinaryOperator>(&II), LVI);
1216 switch (Term->getOpcode()) {
1217 case Instruction::Switch:
1218 BBChanged |=
processSwitch(cast<SwitchInst>(Term), LVI, DT);
1220 case Instruction::Ret: {
1221 auto *RI = cast<ReturnInst>(Term);
1225 auto *RetVal = RI->getReturnValue();
1227 if (isa<Constant>(RetVal))
break;
1230 RI->replaceUsesOfWith(RetVal,
C);
1236 FnChanged |= BBChanged;
This file contains the simple types necessary to represent the attributes associated with functions a...
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static bool runImpl(Function &F, const TargetLowering &TLI)
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
This header defines various interfaces for pass management in LLVM.
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
APInt sext(unsigned width) const
Sign extend to a new width.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AttributeList addParamAttribute(LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const
Add an argument attribute to the list.
static Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
LLVM Basic Block Representation.
void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
This class represents an intrinsic that is based on a binary operation.
unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
bool isSigned() const
Whether the intrinsic is signed or unsigned.
Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name, BasicBlock::iterator InsertBefore)
Construct a binary instruction, given the opcode and the two operands.
BinaryOps getOpcode() const
static BinaryOperator * CreateNeg(Value *Op, const Twine &Name, BasicBlock::iterator InsertBefore)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
void setAttributes(AttributeList A)
Set the parameter attributes for this call.
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the parameter attributes for this call.
static CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name, BasicBlock::iterator InsertBefore)
Create a ZExt or BitCast cast instruction.
This class is the base class for the comparison instructions.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
This is the shared class of boolean and integer constants.
static ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getFalse(LLVMContext &Context)
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
unsigned getActiveBits() const
Compute the maximal number of active bits needed to represent every value in this range.
ConstantRange umul_sat(const ConstantRange &Other) const
Perform an unsigned saturating multiplication of two constant ranges.
static CmpInst::Predicate getEquivalentPredWithFlippedSignedness(CmpInst::Predicate Pred, const ConstantRange &CR1, const ConstantRange &CR2)
If the comparison between constant ranges this and Other is insensitive to the signedness of the comp...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
bool isAllNegative() const
Return true if all values in this range are negative.
bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other? NOTE: false does not mean that inverse pr...
ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
bool isAllNonNegative() const
Return true if all values in this range are non-negative.
ConstantRange sdiv(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed division of a value in th...
bool contains(const APInt &Val) const
Return true if the specified value is in the set.
APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
static bool areInsensitiveToSignednessOfICmpPredicate(const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 slt CR2.
static ConstantRange makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind)
Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow)...
unsigned getMinSignedBits() const
Compute the maximal number of bits needed to represent every value in this signed range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
static Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
This class represents an Operation in the Expression.
void applyUpdatesPermissive(ArrayRef< DominatorTree::UpdateType > Updates)
Submit updates to all available trees.
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This instruction compares its operands according to the predicate given to the constructor.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
Analysis to compute lazy value information.
This pass computes, caches, and vends lazy value constraint information.
ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
ConstantRange getConstantRange(Value *V, Instruction *CxtI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
Tristate
This is used to return true/false/dunno results.
Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
Tristate getPredicateOnEdge(unsigned Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
Tristate getPredicateAt(unsigned Pred, Value *V, Constant *C, Instruction *CxtI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
Constant * getConstant(Value *V, Instruction *CxtI)
Determine whether the specified value is known to be a constant at the specified instruction.
This class represents min/max intrinsics.
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
void abandon()
Mark an analysis as abandoned.
void preserve()
Mark an analysis as preserved.
This class represents a sign extension of integer types.
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
const Value * getFalseValue() const
const Value * getCondition() const
const Value * getTrueValue() const
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Class to represent struct types.
A wrapper class to simplify modification of SwitchInst cases along with their prof branch_weights met...
The instances of the Type class are immutable: once they are created, they are never changed.
unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
A Use represents the edge between a Value definition and its users.
const Use & getOperandUse(unsigned i) const
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< use_iterator > uses()
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
Represents an op.with.overflow intrinsic.
This class represents zero extension of integer types.
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions=false, const TargetLibraryInfo *TLI=nullptr, DomTreeUpdater *DTU=nullptr)
If a terminator instruction is predicated on a constant value, convert it into an unconditional branc...
auto successors(const MachineBasicBlock *BB)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
uint64_t PowerOf2Ceil(uint64_t A)
Returns the power of two which is greater than or equal to the given value.
Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
iterator_range< df_iterator< T > > depth_first(const T &G)
bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
const SimplifyQuery getBestSimplifyQuery(Pass &, Function &)
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...