28#define DEBUG_TYPE "instcombine" 
   32           cl::desc(
"Maximum number phis to handle in intptr/ptrint folding"));
 
   35          "Number of phi-of-insertvalue turned into insertvalue-of-phis");
 
   37          "Number of phi-of-extractvalue turned into extractvalue-of-phi");
 
   38STATISTIC(NumPHICSEs, 
"Number of PHI's that got CSE'd");
 
   64  while (!Stack.empty()) {
 
   65    PHINode *Phi = Stack.pop_back_val();
 
   66    for (
User *
Use : Phi->users()) {
 
   68        if (!Visited.
insert(PhiUse).second)
 
   71        if (Visited.
size() >= 16)
 
   73        Stack.push_back(PhiUse);
 
 
  150        Ptr = LoadI->getPointerOperand();
 
  152        Ptr = 
SI->getPointerOperand();
 
  154        Ptr = GI->getPointerOperand();
 
  163  if (!HasPointerUse(IntToPtr))
 
  166  if (
DL.getPointerSizeInBits(IntToPtr->getAddressSpace()) !=
 
  167      DL.getTypeSizeInBits(IntToPtr->getOperand(0)->getType()))
 
  186    Value *ArgIntToPtr = 
nullptr;
 
  213    if (!LoadI->hasOneUse())
 
  225         "Not enough available ptr typed incoming values");
 
  226  PHINode *MatchingPtrPHI = 
nullptr;
 
  227  unsigned NumPhis = 0;
 
  228  for (
PHINode &PtrPHI : BB->phis()) {
 
  232    if (&PtrPHI == &PN || PtrPHI.
getType() != IntToPtr->getType())
 
  235               [&](
const auto &BlockAndValue) {
 
  236                 BasicBlock *BB = std::get<0>(BlockAndValue);
 
  237                 Value *V = std::get<1>(BlockAndValue);
 
  238                 return PtrPHI.getIncomingValueForBlock(BB) != V;
 
  241    MatchingPtrPHI = &PtrPHI;
 
  245  if (MatchingPtrPHI) {
 
  247           "Phi's Type does not match with IntToPtr");
 
  267        if (V->getType() == IntToPtr->getType())
 
  272        if (Inst->isTerminator())
 
  274        auto *BB = Inst->getParent();
 
  275        if (
isa<PHINode>(Inst) && BB->getFirstInsertionPt() == BB->end())
 
  287    auto *IncomingBB = std::get<0>(
Incoming);
 
  288    auto *IncomingVal = std::get<1>(
Incoming);
 
  290    if (IncomingVal->getType() == IntToPtr->getType()) {
 
  298            IncomingVal->getType()->isPointerTy() ||
 
  300           "Can not replace LoadInst with multiple uses");
 
  313                                            IncomingVal->getName() + 
".ptr");
 
  320        assert(InsertPos != BB->
end() && 
"should have checked above");
 
  323        auto *InsertBB = &IncomingBB->getParent()->getEntryBlock();
 
 
  348  bool OperandWithRoundTripCast = 
false;
 
  353      OperandWithRoundTripCast = 
true;
 
  356  if (!OperandWithRoundTripCast)
 
 
  371    if (!
I || !
I->hasOneUser() || 
I->getIndices() != FirstIVI->getIndices())
 
  376  std::array<PHINode *, 2> NewOperands;
 
  377  for (
int OpIdx : {0, 1}) {
 
  378    auto *&NewOperand = NewOperands[
OpIdx];
 
  383        FirstIVI->getOperand(
OpIdx)->getName() + 
".pn");
 
  386      NewOperand->addIncoming(
 
  394                                         FirstIVI->getIndices(), PN.
getName());
 
  397  ++NumPHIsOfInsertValues;
 
 
  411    if (!
I || !
I->hasOneUser() || 
I->getIndices() != FirstEVI->getIndices() ||
 
  412        I->getAggregateOperand()->getType() !=
 
  413            FirstEVI->getAggregateOperand()->getType())
 
  421      FirstEVI->getAggregateOperand()->getName() + 
".pn");
 
  424    NewAggregateOperand->addIncoming(
 
  431                                          FirstEVI->getIndices(), PN.
getName());
 
  434  ++NumPHIsOfExtractValues;
 
 
  453    if (!
I || 
I->getOpcode() != 
Opc || !
I->hasOneUser() ||
 
  456        I->getOperand(0)->getType() != LHSType ||
 
  457        I->getOperand(1)->getType() != RHSType)
 
  462      if (CI->getPredicate() != 
cast<CmpInst>(FirstInst)->getPredicate())
 
  466    if (
I->getOperand(0) != LHSVal) LHSVal = 
nullptr;
 
  467    if (
I->getOperand(1) != RHSVal) RHSVal = 
nullptr;
 
  474  if (!LHSVal && !RHSVal)
 
  481  PHINode *NewLHS = 
nullptr, *NewRHS = 
nullptr;
 
  499  if (NewLHS || NewRHS) {
 
  510        NewRHS->addIncoming(NewInRHS, InBB);
 
 
  542  bool AllBasePointersAreAllocas = 
true;
 
  547  bool NeededPhi = 
false;
 
  555    if (!
GEP || !
GEP->hasOneUser() ||
 
  560    NW &= 
GEP->getNoWrapFlags();
 
  563    if (AllBasePointersAreAllocas &&
 
  565         !
GEP->hasAllConstantIndices()))
 
  566      AllBasePointersAreAllocas = 
false;
 
  583          GEP->getOperand(
Op)->getType())
 
  593      FixedOperands[
Op] = 
nullptr; 
 
  604  if (AllBasePointersAreAllocas)
 
  611  bool HasAnyPHIs = 
false;
 
  612  for (
unsigned I = 0, E = FixedOperands.
size(); 
I != E; ++
I) {
 
  613    if (FixedOperands[
I])
 
  621    OperandPhis[
I] = NewPN;
 
  622    FixedOperands[
I] = NewPN;
 
  633      for (
unsigned Op = 0, E = OperandPhis.
size(); 
Op != E; ++
Op)
 
  642                                ArrayRef(FixedOperands).slice(1), NW);
 
 
  657  for (++BBI; BBI != 
E; ++BBI)
 
  658    if (BBI->mayWriteToMemory()) {
 
  662        if (CB->onlyAccessesInaccessibleMemory())
 
  670    bool IsAddressTaken = 
false;
 
  675        if (
SI->getOperand(1) == AI) 
continue;
 
  677      IsAddressTaken = 
true;
 
  681    if (!IsAddressTaken && AI->isStaticAlloca())
 
  692      if (AI->isStaticAlloca() && 
GEP->hasAllConstantIndices())
 
 
  726      FirstLI->
getParent()->getTerminator()->getNumSuccessors() != 1)
 
  750    LoadAlignment = std::min(LoadAlignment, LI->
getAlign());
 
  755    if (IsVolatile && LI->
getParent()->getTerminator()->getNumSuccessors() != 1)
 
  768      new LoadInst(FirstLI->
getType(), NewPN, 
"", IsVolatile, LoadAlignment);
 
  778    if (NewInVal != InVal)
 
 
  809  if (
Instruction *TI = Phi.getParent()->getTerminator())
 
  816  unsigned NumIncomingValues = Phi.getNumIncomingValues();
 
  817  if (NumIncomingValues < 3)
 
  821  Type *NarrowType = 
nullptr;
 
  822  for (
Value *V : Phi.incoming_values()) {
 
  824      NarrowType = Zext->getSrcTy();
 
  834  unsigned NumZexts = 0;
 
  835  unsigned NumConsts = 0;
 
  836  for (
Value *V : Phi.incoming_values()) {
 
  839      if (Zext->getSrcTy() != NarrowType || !Zext->hasOneUser())
 
  841      NewIncoming.
push_back(Zext->getOperand(0));
 
  862  if (NumConsts == 0 || NumZexts < 2)
 
  869                                    Phi.getName() + 
".shrunk");
 
  870  for (
unsigned I = 0; 
I != NumIncomingValues; ++
I)
 
  871    NewPhi->
addIncoming(NewIncoming[
I], Phi.getIncomingBlock(
I));
 
 
  910  Type *CastSrcTy = 
nullptr;
 
  918      if (!shouldChangeType(PN.
getType(), CastSrcTy))
 
  934    if (!
I || !
I->hasOneUser() || !
I->isSameOperationAs(FirstInst))
 
  937      if (
I->getOperand(0)->getType() != CastSrcTy)
 
  939    } 
else if (
I->getOperand(1) != ConstantOp) {
 
  958    if (NewInVal != InVal)
 
  987      BinOp->andIRFlags(V);
 
 
 1006  if (!ValueEqualPHIs.
insert(PN).second)
 
 1010  if (ValueEqualPHIs.
size() == 16)
 
 1022    } 
else if (
Op != NonPhiInVal)
 
 
 1035      if (!ConstVA->isZero())
 
 
 1041struct PHIUsageRecord {
 
 1046  PHIUsageRecord(
unsigned Pn, 
unsigned Sh, Instruction *User)
 
 1047      : PHIId(Pn), Shift(Sh), Inst(
User) {}
 
 1050    if (PHIId < 
RHS.PHIId) 
return true;
 
 1051    if (PHIId > 
RHS.PHIId) 
return false;
 
 1052    if (Shift < 
RHS.Shift) 
return true;
 
 1053    if (Shift > 
RHS.Shift) 
return false;
 
 1059struct LoweredPHIRecord {
 
 1064  LoweredPHIRecord(PHINode *Phi, 
unsigned Sh, 
Type *Ty)
 
 1065      : PN(
Phi), Shift(Sh), Width(Ty->getPrimitiveSizeInBits()) {}
 
 1068  LoweredPHIRecord(PHINode *Phi, 
unsigned Sh) : PN(
Phi), Shift(Sh), Width(0) {}
 
 1074    return LoweredPHIRecord(
nullptr, 0);
 
 
 1077    return LoweredPHIRecord(
nullptr, 1);
 
 
 1084                      const LoweredPHIRecord &RHS) {
 
 1085    return LHS.PN == RHS.PN && LHS.Shift == RHS.Shift && LHS.Width == RHS.Width;
 
 
 
 1110  PHIsInspected.
insert(&FirstPhi);
 
 1112  for (
unsigned PHIId = 0; PHIId != PHIsToSlice.
size(); ++PHIId) {
 
 1113    PHINode *PN = PHIsToSlice[PHIId];
 
 1125      if (
II->getParent() != BB)
 
 1137    for (
auto *Pred : PN->
blocks())
 
 1138      if (Pred->getFirstInsertionPt() == Pred->end())
 
 1146        if (PHIsInspected.
insert(UserPN).second)
 
 1153        PHIUsers.
push_back(PHIUsageRecord(PHIId, 0, UserI));
 
 1158      if (UserI->
getOpcode() != Instruction::LShr ||
 
 1174  if (PHIUsers.
empty())
 
 1182             for (
unsigned I = 1; 
I != PHIsToSlice.
size(); ++
I) 
dbgs()
 
 1183             << 
"AND USER PHI #" << 
I << 
": " << *PHIsToSlice[
I] << 
'\n');
 
 1193  for (
unsigned UserI = 0, UserE = PHIUsers.
size(); UserI != UserE; ++UserI) {
 
 1194    unsigned PHIId = PHIUsers[UserI].PHIId;
 
 1195    PHINode *PN = PHIsToSlice[PHIId];
 
 1196    unsigned Offset = PHIUsers[UserI].Shift;
 
 1197    Type *Ty = PHIUsers[UserI].Inst->getType();
 
 1203    if ((EltPHI = ExtractedVals[LoweredPHIRecord(PN, 
Offset, Ty)]) == 
nullptr) {
 
 1210             "Truncate didn't shrink phi?");
 
 1215        Value *&PredVal = PredValues[Pred];
 
 1233          if (
Value *Res = ExtractedVals[LoweredPHIRecord(InPHI, 
Offset, Ty)]) {
 
 1241        Builder.SetInsertPoint(Pred->getTerminator());
 
 1245              Res, ConstantInt::get(InVal->
getType(), 
Offset), 
"extract");
 
 1246        Res = 
Builder.CreateTrunc(Res, Ty, 
"extract.t");
 
 1255          if (PHIsInspected.
count(OldInVal)) {
 
 1257                find(PHIsToSlice, OldInVal) - PHIsToSlice.
begin();
 
 1266                        << *EltPHI << 
'\n');
 
 1267      ExtractedVals[LoweredPHIRecord(PN, 
Offset, Ty)] = EltPHI;
 
 
 1312    SuccForValue[
C] = Succ;
 
 1316    if (BI->isUnconditional())
 
 1319    Cond = BI->getCondition();
 
 1323    Cond = 
SI->getCondition();
 
 1324    ++SuccCount[
SI->getDefaultDest()];
 
 1325    for (
auto Case : 
SI->cases())
 
 1326      AddSucc(Case.getCaseValue(), Case.getCaseSuccessor());
 
 1336  std::optional<bool> Invert;
 
 1345      return It != SuccForValue.
end() && SuccCount[It->second] == 1 &&
 
 1352    if (IsCorrectInput(
Input))
 
 1353      NeedsInvert = 
false;
 
 1360    if (Invert && *Invert != NeedsInvert)
 
 1363    Invert = NeedsInvert;
 
 1373  if (InsertPt != BB->
end()) {
 
 
 1393  auto MatchOuterIV = [&](
Value *V1, 
Value *V2) {
 
 1408  Value *Iv2Start, *Iv2Step;
 
 1417  if (Iv2Start != Identity)
 
 1423    return Builder.CreateGEP(
GEP->getSourceElementType(), Start, Iv2, 
"",
 
 1427  assert(BO->isCommutative() && 
"Must be commutative");
 
 1428  Value *Res = Builder.CreateBinOp(BO->getOpcode(), Iv2, Start);
 
 
 1449  if (Inst0 && Inst1 && Inst0->getOpcode() == Inst1->getOpcode() &&
 
 1450      Inst0->hasOneUser())
 
 1464    if (IV0 != IV0Stripped &&
 
 1466          return !CheckedIVs.insert(IV).second ||
 
 1467                 IV0Stripped == IV->stripPointerCasts();
 
 1511      auto *CmpInst = dyn_cast<ICmpInst>(U);
 
 1515        if (U->hasOneUse() && match(U, m_c_Or(m_Specific(&PN), m_Value()))) {
 
 1516          DropPoisonFlags.push_back(cast<Instruction>(U));
 
 1517          CmpInst = dyn_cast<ICmpInst>(U->user_back());
 
 1527    if (AllUsesOfPhiEndsInCmp) {
 
 1529      bool MadeChange = 
false;
 
 1536          if (NonZeroConst != VA) {
 
 1540              I->dropPoisonGeneratingFlags();
 
 1559    unsigned InValNo = 0, NumIncomingVals = PN.getNumIncomingValues();
 
 1561    while (InValNo != NumIncomingVals &&
 
 1565    Value *NonPhiInVal =
 
 1566        InValNo != NumIncomingVals ? PN.getIncomingValue(InValNo) : 
nullptr;
 
 1571      for (++InValNo; InValNo != NumIncomingVals; ++InValNo) {
 
 1572        Value *OpVal = PN.getIncomingValue(InValNo);
 
 1580    if (InValNo == NumIncomingVals) {
 
 1583        return replaceInstUsesWith(PN, NonPhiInVal);
 
 1591  auto Res = PredOrder.try_emplace(PN.getParent());
 
 1593    const auto &Preds = Res.first->second;
 
 1594    for (
unsigned I = 0, 
E = PN.getNumIncomingValues(); 
I != 
E; ++
I) {
 
 1598        Value *VA = PN.getIncomingValue(
I);
 
 1599        unsigned J = PN.getBasicBlockIndex(BBB);
 
 1600        Value *VB = PN.getIncomingValue(J);
 
 1601        PN.setIncomingBlock(
I, BBB);
 
 1602        PN.setIncomingValue(
I, VB);
 
 1603        PN.setIncomingBlock(J, BBA);
 
 1604        PN.setIncomingValue(J, VA);
 
 1619    if (&IdenticalPN == &PN)
 
 1624    if (!PN.isIdenticalToWhenDefined(&IdenticalPN))
 
 1628    return replaceInstUsesWith(PN, &IdenticalPN);
 
 1635  if (PN.getType()->isIntegerTy() &&
 
 1636      !
DL.isLegalInteger(PN.getType()->getPrimitiveSizeInBits()))
 
 1637    if (
Instruction *Res = SliceUpIllegalIntegerPHI(PN))
 
 1642    return replaceInstUsesWith(PN, V);
 
 1645    return replaceInstUsesWith(PN, Res);
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
static const Function * getParent(const Value *V)
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
This file provides internal interfaces used to implement the InstCombine.
 
static ConstantInt * getAnyNonZeroConstInt(PHINode &PN)
Return an existing non-zero constant if this phi node has one, otherwise return constant 1.
 
static Value * foldDependentIVs(PHINode &PN, IRBuilderBase &Builder)
 
static bool isSafeAndProfitableToSinkLoad(LoadInst *L)
Return true if we know that it is safe to sink the load out of the block that defines it.
 
static Value * simplifyUsingControlFlow(InstCombiner &Self, PHINode &PN, const DominatorTree &DT)
 
static bool PHIsEqualValue(PHINode *PN, Value *&NonPhiInVal, SmallPtrSetImpl< PHINode * > &ValueEqualPHIs)
Return true if this phi node is always equal to NonPhiInVal.
 
static cl::opt< unsigned > MaxNumPhis("instcombine-max-num-phis", cl::init(512), cl::desc("Maximum number phis to handle in intptr/ptrint folding"))
 
This file provides the interface for the instcombine pass implementation.
 
MachineInstr unsigned OpIdx
 
uint64_t IntrinsicInst * II
 
const SmallVectorImpl< MachineOperand > & Cond
 
This file defines the SmallPtrSet class.
 
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
 
#define STATISTIC(VARNAME, DESC)
 
static const uint32_t IV[8]
 
an instruction to allocate memory on the stack
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
LLVM Basic Block Representation.
 
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
 
const Function * getParent() const
Return the enclosing method, or null if none.
 
InstListType::iterator iterator
Instruction iterators...
 
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
 
BinaryOps getOpcode() const
 
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
 
This is the base class for all instructions that perform data casts.
 
static LLVM_ABI CastInst * CreatePointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
 
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
 
static LLVM_ABI CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
 
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
 
This class is the base class for the comparison instructions.
 
static LLVM_ABI bool isEquality(Predicate pred)
Determine if this is an equals/not equals predicate.
 
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
 
Predicate getPredicate() const
Return the predicate for this instruction.
 
OtherOps getOpcode() const
Get the opcode casted to the right type.
 
static LLVM_ABI Constant * getNot(Constant *C)
 
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
 
This is the shared class of boolean and integer constants.
 
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
 
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
 
This is an important base class in LLVM.
 
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
 
static DebugLoc getDropped()
 
iterator find(const_arg_type_t< KeyT > Val)
 
DomTreeNodeBase * getIDom() const
 
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
 
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
 
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
 
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
 
Represents flags for the getelementptr instruction/expression.
 
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
 
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
 
Type * getSourceElementType() const
 
LLVM_ABI GEPNoWrapFlags getNoWrapFlags() const
Get the nowrap flags for the GEP instruction.
 
Common base class shared among various IRBuilders.
 
Value * CreateNot(Value *V, const Twine &Name="")
 
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
 
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
 
Instruction * foldPHIArgInsertValueInstructionIntoPHI(PHINode &PN)
If we have something like phi [insertvalue(a,b,0), insertvalue(c,d,0)], turn this into a phi[a,...
 
Instruction * foldPHIArgBinOpIntoPHI(PHINode &PN)
If we have something like phi [add (a,b), add(a,c)] and if a/b/c and the adds all have a single user,...
 
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
 
Instruction * visitPHINode(PHINode &PN)
 
Instruction * foldPHIArgOpIntoPHI(PHINode &PN)
Try to rotate an operation below a PHI node, using PHI nodes for its operands.
 
Instruction * foldPHIArgZextsIntoPHI(PHINode &PN)
TODO: This function could handle other cast types, but then it might require special-casing a cast fr...
 
Instruction * foldPHIArgLoadIntoPHI(PHINode &PN)
 
bool foldIntegerTypedPHI(PHINode &PN)
If an integer typed PHI has only one use which is an IntToPtr operation, replace the PHI with an exis...
 
bool foldDeadPhiWeb(PHINode &PN)
If the phi is within a phi web, which is formed by the def-use chain of phis and all the phis in the ...
 
Instruction * foldPHIArgIntToPtrToPHI(PHINode &PN)
 
Instruction * SliceUpIllegalIntegerPHI(PHINode &PN)
This is an integer PHI and we know that it has an illegal type: see if it is only used by trunc or tr...
 
Instruction * foldPHIArgGEPIntoPHI(PHINode &PN)
 
void PHIArgMergedDebugLoc(Instruction *Inst, PHINode &PN)
Helper function for FoldPHIArgXIntoPHI() to set debug location for the folded operation.
 
Instruction * foldPHIArgExtractValueInstructionIntoPHI(PHINode &PN)
If we have something like phi [extractvalue(a,0), extractvalue(b,0)], turn this into a phi[a,...
 
The core instruction combiner logic.
 
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
 
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
 
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
 
const SimplifyQuery & getSimplifyQuery() const
 
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
 
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
 
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
 
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
 
Instruction * user_back()
Specialize the methods defined in Value, as we know that an instruction can only be used by other ins...
 
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
 
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
 
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
 
LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)
Merge 2 debug locations and apply it to the Instruction.
 
This is an important class for using LLVM in a threaded context.
 
An instruction for reading from memory.
 
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
 
bool isVolatile() const
Return true if this is a load from a volatile memory location.
 
Align getAlign() const
Return the alignment of the access that is being performed.
 
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
 
iterator_range< const_block_iterator > blocks() const
 
op_range incoming_values()
 
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
 
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
 
unsigned getNumIncomingValues() const
Return the number of incoming edges.
 
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
 
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
 
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
 
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
 
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
 
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
 
reference emplace_back(ArgTypes &&... Args)
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
An instruction for storing to memory.
 
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
 
The instances of the Type class are immutable: once they are created, they are never changed.
 
bool isPointerTy() const
True if this is an instance of PointerType.
 
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
 
LLVM_ABI 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.
 
void setOperand(unsigned i, Value *Val)
 
Value * getOperand(unsigned i) const
 
unsigned getNumOperands() const
 
LLVM Value Representation.
 
Type * getType() const
All values are typed, get the type of this value.
 
LLVM_ABI bool hasOneUser() const
Return true if there is exactly one user of this value.
 
bool hasOneUse() const
Return true if there is exactly one use of this value.
 
iterator_range< user_iterator > users()
 
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
 
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
 
LLVM_ABI bool isSwiftError() const
Return true if this value is a swifterror value.
 
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
 
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
 
const ParentTy * getParent() const
 
self_iterator getIterator()
 
@ C
The default llvm calling convention, compatible with C.
 
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
 
bool match(Val *V, const Pattern &P)
 
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
 
auto m_GEP(const OperandTypes &...Ops)
Matches GetElementPtrInst.
 
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
 
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
 
initializer< Ty > init(const Ty &Val)
 
@ User
could "use" a pointer
 
NodeAddr< PhiNode * > Phi
 
friend class Instruction
Iterator for Instructions in a `BasicBlock.
 
This is an optimization pass for GlobalISel generic memory operations.
 
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
 
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
 
bool operator<(int64_t V1, const APSInt &V2)
 
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
 
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
 
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
 
LLVM_ABI bool matchSimpleRecurrence(const PHINode *P, BinaryOperator *&BO, Value *&Start, Value *&Step)
Attempt to match a simple first order recurrence cycle of the form: iv = phi Ty [Start,...
 
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
 
LLVM_ABI Constant * getLosslessUnsignedTrunc(Constant *C, Type *DestTy, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
 
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
 
LLVM_ABI void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
 
DWARFExpression::Operation Op
 
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
 
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
 
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
 
This struct is a compact representation of a valid (non-zero power of two) alignment.
 
static bool isEqual(const LoweredPHIRecord &LHS, const LoweredPHIRecord &RHS)
 
static unsigned getHashValue(const LoweredPHIRecord &Val)
 
static LoweredPHIRecord getEmptyKey()
 
static LoweredPHIRecord getTombstoneKey()
 
An information struct used to provide DenseMap with the various necessary components for a given valu...
 
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...