37using namespace PatternMatch;
39#define DEBUG_TYPE "aggressive-instcombine"
41STATISTIC(NumAnyOrAllBitsSet,
"Number of any/all-bits-set patterns folded");
43 "Number of guarded rotates transformed into funnel shifts");
45 "Number of guarded funnel shifts transformed into funnel shifts");
46STATISTIC(NumPopCountRecognized,
"Number of popcount idioms recognized");
50 cl::desc(
"Max number of instructions to scan for aggressive instcombine."));
54 cl::desc(
"The maximum length of a constant string for a builtin string cmp "
55 "call eligible for inlining. The default value is 3."));
59 cl::desc(
"The maximum length of a constant string to "
60 "inline a memchr call."));
66 if (
I.getOpcode() != Instruction::PHI ||
I.getNumOperands() != 2)
80 unsigned Width = V->getType()->getScalarSizeInBits();
88 return Intrinsic::fshl;
97 return Intrinsic::fshr;
109 unsigned FunnelOp = 0, GuardOp = 1;
110 Value *P0 = Phi.getOperand(0), *P1 = Phi.getOperand(1);
111 Value *ShVal0, *ShVal1, *ShAmt;
114 (IID == Intrinsic::fshl && ShVal0 != P1) ||
115 (IID == Intrinsic::fshr && ShVal1 != P1)) {
118 (IID == Intrinsic::fshl && ShVal0 != P0) ||
119 (IID == Intrinsic::fshr && ShVal1 != P0))
121 assert((IID == Intrinsic::fshl || IID == Intrinsic::fshr) &&
122 "Pattern must match funnel shift left or right");
130 BasicBlock *GuardBB = Phi.getIncomingBlock(GuardOp);
131 BasicBlock *FunnelBB = Phi.getIncomingBlock(FunnelOp);
146 if (ShVal0 == ShVal1)
149 ++NumGuardedFunnelShifts;
153 bool IsFshl = IID == Intrinsic::fshl;
154 if (ShVal0 != ShVal1) {
175 Phi.replaceAllUsesWith(
222 const APInt *BitIndex =
nullptr;
228 MOps.
Root = Candidate;
236 return MOps.
Root == Candidate;
250 bool MatchAllBitsSet;
252 MatchAllBitsSet =
true;
254 MatchAllBitsSet =
false;
258 MaskOps MOps(
I.getType()->getScalarSizeInBits(), MatchAllBitsSet);
259 if (MatchAllBitsSet) {
275 I.replaceAllUsesWith(Zext);
276 ++NumAnyOrAllBitsSet;
292 if (
I.getOpcode() != Instruction::LShr)
295 Type *Ty =
I.getType();
301 if (!(Len <= 128 && Len > 8 && Len % 8 == 0))
310 Value *Op0 =
I.getOperand(0);
311 Value *Op1 =
I.getOperand(1);
327 Value *Root, *SubOp1;
334 I.replaceAllUsesWith(
336 ++NumPopCountRecognized;
357 const APInt *MinC, *MaxC;
367 if (!(*MinC + 1).isPowerOf2() || -*MaxC != *MinC + 1)
370 Type *IntTy =
I.getType();
371 Type *FpTy = In->getType();
374 if (
auto *VecTy = dyn_cast<VectorType>(IntTy))
375 SatTy = VectorType::get(SatTy, VecTy->getElementCount());
396 if (SatCost >= MinMaxCost)
402 I.replaceAllUsesWith(Builder.
CreateSExt(Sat, IntTy));
418 Type *Ty = Call->getType();
419 Value *Arg = Call->getArgOperand(0);
421 (Call->hasNoNaNs() ||
424 SimplifyQuery(Call->getDataLayout(), &TLI, &DT, &AC, Call)))) {
431 Call->replaceAllUsesWith(NewSqrt);
435 Call->eraseFromParent();
448 if (Length < InputBits || Length > InputBits * 2)
452 unsigned Matched = 0;
454 for (
unsigned i = 0; i <
Length; i++) {
456 if (Element >= InputBits)
463 if ((((
Mul << Element) & Mask.getZExtValue()) >> Shift) == i)
467 return Matched == InputBits;
534 if (!
GEP || !
GEP->isInBounds() ||
GEP->getNumIndices() != 2)
537 if (!
GEP->getSourceElementType()->isArrayTy())
540 uint64_t ArraySize =
GEP->getSourceElementType()->getArrayNumElements();
541 if (ArraySize != 32 && ArraySize != 64)
556 Value *Idx2 = std::next(
GEP->idx_begin())->get();
568 if (InputBits != 32 && InputBits != 64)
572 if (InputBits -
Log2_32(InputBits) != ShiftConst &&
573 InputBits -
Log2_32(InputBits) - 1 != ShiftConst)
576 if (!
isCTTZTable(*ConstData, MulConst, ShiftConst, InputBits))
580 bool DefinedForZero = ZeroTableElem == InputBits;
585 auto Cttz =
B.CreateIntrinsic(Intrinsic::cttz, {XType}, {X1, BoolConst});
586 Value *ZExtOrTrunc =
nullptr;
588 if (DefinedForZero) {
589 ZExtOrTrunc =
B.CreateZExtOrTrunc(Cttz, AccessType);
593 auto Cmp =
B.CreateICmpEQ(X1, ConstantInt::get(XType, 0));
595 B.CreateSelect(Cmp, ConstantInt::get(XType, ZeroTableElem), Cttz);
600 ZExtOrTrunc =
B.CreateZExtOrTrunc(
Select, AccessType);
626 const APInt *ShAmt2 =
nullptr;
650 LI1 = dyn_cast<LoadInst>(L1);
652 LoadInst *LI2 = dyn_cast<LoadInst>(L2);
664 bool IsBigEndian =
DL.isBigEndian();
682 if (Load1Ptr != Load2Ptr || LoadSize1 != LoadSize2)
692 if (!Start->comesBefore(
End)) {
699 unsigned NumScanned = 0;
713 if (Offset2.
slt(Offset1)) {
744 uint64_t ShiftDiff = IsBigEndian ? LoadSize2 : LoadSize1;
747 if ((Shift2 - Shift1) != ShiftDiff || (Offset2 - Offset1) != PrevSize)
757 LOps.
LoadSize = LoadSize1 + LoadSize2;
776 if (isa<VectorType>(
I.getType()))
792 unsigned AS = LI1->getPointerAddressSpace();
795 AS, LI1->getAlign(), &
Fast);
796 if (!Allowed || !
Fast)
800 Value *Load1Ptr = LI1->getPointerOperand();
810 LI1->isVolatile(),
"");
816 Value *NewOp = NewLoad;
824 NewOp = Builder.
CreateShl(NewOp, ConstantInt::get(
I.getContext(), *LOps.
Shift));
825 I.replaceAllUsesWith(NewOp);
832static std::pair<APInt, APInt>
834 unsigned BW =
DL.getIndexTypeSizeInBits(PtrOp->
getType());
835 std::optional<APInt> Stride;
836 APInt ModOffset(BW, 0);
839 while (
auto *
GEP = dyn_cast<GEPOperator>(PtrOp)) {
841 if (!
GEP->collectOffset(
DL, BW, VarOffsets, ModOffset))
844 for (
auto [V, Scale] : VarOffsets) {
846 if (!
GEP->isInBounds())
855 PtrOp =
GEP->getPointerOperand();
860 if (!isa<GlobalVariable>(PtrOp) || !Stride)
865 ModOffset = ModOffset.
srem(*Stride);
867 ModOffset += *Stride;
869 return {*Stride, ModOffset};
875 auto *LI = dyn_cast<LoadInst>(&
I);
876 if (!LI || LI->isVolatile())
881 auto *PtrOp = LI->getPointerOperand();
883 if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
888 uint64_t GVSize =
DL.getTypeAllocSize(
C->getType());
889 if (!GVSize || 4096 < GVSize)
892 Type *LoadTy = LI->getType();
893 unsigned BW =
DL.getIndexTypeSizeInBits(PtrOp->getType());
899 if (
auto LA = LI->getAlign();
900 LA <= GV->
getAlign().valueOrOne() && Stride.getZExtValue() < LA.value()) {
901 ConstOffset =
APInt(BW, 0);
902 Stride =
APInt(BW, LA.value());
909 unsigned E = GVSize -
DL.getTypeStoreSize(LoadTy);
910 for (; ConstOffset.getZExtValue() <= E; ConstOffset += Stride)
914 I.replaceAllUsesWith(Ca);
920class StrNCmpInliner {
926 bool optimizeStrNCmp();
967bool StrNCmpInliner::optimizeStrNCmp() {
974 Value *Str1P = CI->getArgOperand(0);
975 Value *Str2P = CI->getArgOperand(1);
983 if (HasStr1 == HasStr2)
988 Value *StrP = HasStr1 ? Str2P : Str1P;
990 size_t Idx = Str.find(
'\0');
992 if (Func == LibFunc_strncmp) {
993 if (
auto *ConstInt = dyn_cast<ConstantInt>(CI->getArgOperand(2)))
994 N = std::min(
N, ConstInt->getZExtValue());
1004 bool CanBeNull =
false, CanBeFreed =
false;
1007 inlineCompare(StrP, Str,
N, HasStr1);
1047 auto &Ctx = CI->getContext();
1055 B.SetCurrentDebugLocation(CI->getDebugLoc());
1067 cast<BranchInst>(BBCI->
getTerminator())->setSuccessor(0, BBSubs[0]);
1069 B.SetInsertPoint(BBNE);
1075 B.SetInsertPoint(BBSubs[i]);
1077 B.CreateZExt(
B.CreateLoad(
B.getInt8Ty(),
1078 B.CreateInBoundsPtrAdd(
Base,
B.getInt64(i))),
1081 ConstantInt::get(CI->getType(),
static_cast<unsigned char>(RHS[i]));
1082 Value *Sub = Swapped ?
B.CreateSub(VR, VL) :
B.CreateSub(VL, VR);
1084 B.CreateCondBr(
B.CreateICmpNE(Sub, ConstantInt::get(CI->getType(), 0)),
1085 BBNE, BBSubs[i + 1]);
1089 Phi->addIncoming(Sub, BBSubs[i]);
1092 CI->replaceAllUsesWith(Phi);
1093 CI->eraseFromParent();
1097 Updates.
push_back({DominatorTree::Insert, BBCI, BBSubs[0]});
1100 Updates.
push_back({DominatorTree::Insert, BBSubs[i], BBSubs[i + 1]});
1101 Updates.
push_back({DominatorTree::Insert, BBSubs[i], BBNE});
1103 Updates.
push_back({DominatorTree::Insert, BBNE, BBTail});
1104 Updates.
push_back({DominatorTree::Delete, BBCI, BBTail});
1105 DTU->applyUpdates(Updates);
1112 if (isa<Constant>(Call->getArgOperand(1)))
1121 if (
auto *ConstInt = dyn_cast<ConstantInt>(Call->getArgOperand(2))) {
1122 uint64_t Val = ConstInt->getZExtValue();
1139 IRB.
CreateTrunc(Call->getArgOperand(1), ByteTy), BBNext,
N);
1140 Type *IndexTy =
DL.getIndexType(Call->getType());
1144 Call->getContext(),
"memchr.success", BB->
getParent(), BBNext);
1150 Updates.
push_back({DominatorTree::Insert, BBSuccess, BBNext});
1154 ConstantInt *CaseVal = ConstantInt::get(ByteTy, Str[
I]);
1155 if (!Cases.
insert(CaseVal).second)
1160 SI->addCase(CaseVal, BBCase);
1162 IndexPHI->
addIncoming(ConstantInt::get(IndexTy,
I), BBCase);
1165 Updates.
push_back({DominatorTree::Insert, BB, BBCase});
1166 Updates.
push_back({DominatorTree::Insert, BBCase, BBSuccess});
1173 PHI->addIncoming(FirstOccursLocation, BBSuccess);
1175 Call->replaceAllUsesWith(
PHI);
1176 Call->eraseFromParent();
1187 bool &MadeCFGChange) {
1189 auto *CI = dyn_cast<CallInst>(&
I);
1190 if (!CI || CI->isNoBuiltin())
1193 Function *CalledFunc = CI->getCalledFunction();
1209 case LibFunc_strcmp:
1210 case LibFunc_strncmp:
1211 if (StrNCmpInliner(CI, LF, &DTU,
DL).optimizeStrNCmp()) {
1212 MadeCFGChange =
true;
1216 case LibFunc_memchr:
1218 MadeCFGChange =
true;
1234 bool MadeChange =
false;
1275 bool MadeChange =
false;
1278 MadeChange |= TIC.
run(
F);
1290 bool MadeCFGChange =
false;
1291 if (!
runImpl(
F, AC,
TTI, TLI, DT, AA, MadeCFGChange)) {
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool tryToRecognizePopCount(Instruction &I)
static bool foldSqrt(CallInst *Call, LibFunc Func, TargetTransformInfo &TTI, TargetLibraryInfo &TLI, AssumptionCache &AC, DominatorTree &DT)
Try to replace a mathlib call to sqrt with the LLVM intrinsic.
static bool foldAnyOrAllBitsSet(Instruction &I)
Match patterns that correspond to "any-bits-set" and "all-bits-set".
static cl::opt< unsigned > MemChrInlineThreshold("memchr-inline-threshold", cl::init(3), cl::Hidden, cl::desc("The maximum length of a constant string to " "inline a memchr call."))
static bool tryToFPToSat(Instruction &I, TargetTransformInfo &TTI)
Fold smin(smax(fptosi(x), C1), C2) to llvm.fptosi.sat(x), providing C1 and C2 saturate the value of t...
static cl::opt< unsigned > StrNCmpInlineThreshold("strncmp-inline-threshold", cl::init(3), cl::Hidden, cl::desc("The maximum length of a constant string for a builtin string cmp " "call eligible for inlining. The default value is 3."))
static bool matchAndOrChain(Value *V, MaskOps &MOps)
This is a recursive helper for foldAnyOrAllBitsSet() that walks through a chain of 'and' or 'or' inst...
static bool foldMemChr(CallInst *Call, DomTreeUpdater *DTU, const DataLayout &DL)
Convert memchr with a small constant string into a switch.
static bool foldConsecutiveLoads(Instruction &I, const DataLayout &DL, TargetTransformInfo &TTI, AliasAnalysis &AA, const DominatorTree &DT)
static bool runImpl(Function &F, AssumptionCache &AC, TargetTransformInfo &TTI, TargetLibraryInfo &TLI, DominatorTree &DT, AliasAnalysis &AA, bool &MadeCFGChange)
This is the entry point for all transforms.
static bool tryToRecognizeTableBasedCttz(Instruction &I)
static bool foldGuardedFunnelShift(Instruction &I, const DominatorTree &DT)
Match a pattern for a bitwise funnel/rotate operation that partially guards against undefined behavio...
static cl::opt< unsigned > MaxInstrsToScan("aggressive-instcombine-max-scan-instrs", cl::init(64), cl::Hidden, cl::desc("Max number of instructions to scan for aggressive instcombine."))
static bool foldLoadsRecursive(Value *V, LoadOps &LOps, const DataLayout &DL, AliasAnalysis &AA)
static std::pair< APInt, APInt > getStrideAndModOffsetOfGEP(Value *PtrOp, const DataLayout &DL)
static bool isCTTZTable(const ConstantDataArray &Table, uint64_t Mul, uint64_t Shift, uint64_t InputBits)
static bool foldPatternedLoads(Instruction &I, const DataLayout &DL)
If C is a constant patterned array and all valid loaded results for given alignment are same to a con...
static bool foldLibCalls(Instruction &I, TargetTransformInfo &TTI, TargetLibraryInfo &TLI, AssumptionCache &AC, DominatorTree &DT, const DataLayout &DL, bool &MadeCFGChange)
static bool foldUnusualPatterns(Function &F, DominatorTree &DT, TargetTransformInfo &TTI, TargetLibraryInfo &TLI, AliasAnalysis &AA, AssumptionCache &AC, bool &MadeCFGChange)
This is the entry point for folds that could be implemented in regular InstCombine,...
AggressiveInstCombiner - Combine expression patterns to form expressions with fewer,...
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
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.
static MaybeAlign getAlign(Value *Ptr)
static Instruction * matchFunnelShift(Instruction &Or, InstCombinerImpl &IC)
Match UB-safe variants of the funnel shift intrinsic.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static const MCExpr * MaskShift(const MCExpr *Val, uint32_t Mask, uint32_t Shift, MCContext &Ctx)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
A manager for alias analyses.
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
Check whether or not an instruction may read or write the optionally specified memory location.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool isNegative() const
Determine sign of this APInt.
static APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
APInt srem(const APInt &RHS) const
Function for signed remainder operation.
bool slt(const APInt &RHS) const
Signed less than comparison.
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
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.
A function analysis which provides an AssumptionCache.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Function * getParent() const
Return the enclosing method, or null if none.
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...
Represents analyses that only rely on functions' control flow.
This class represents a function call, abstracting a target machine's calling convention.
An array constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
uint64_t getElementAsInteger(unsigned i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
unsigned getNumElements() const
Return the number of elements in the array or vector.
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const char *Name)
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Value * CreateSExt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateFreeze(Value *V, const Twine &Name="")
Value * CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
void setFastMathFlags(FastMathFlags NewFMF)
Set the fast-math flags to be used with generated fp-math operators.
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
SwitchInst * CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases=10, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a switch instruction with the specified value, default dest, and with a hint for the number of...
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
BranchInst * CreateBr(BasicBlock *Dest)
Create an unconditional 'br label X' instruction.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreateInBoundsPtrAdd(Value *Ptr, Value *Offset, const Twine &Name="")
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
Class to represent integer types.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
An instruction for reading from memory.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
Value * getPointerOperand()
Representation for a specific memory location.
MemoryLocation getWithNewSize(LocationSize NewSize) const
static MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
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...
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 preserveSet()
Mark an analysis set as preserved.
void preserve()
Mark an analysis as preserved.
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.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
static constexpr size_t npos
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
bool run(Function &F)
Perform TruncInst pattern optimization on given function.
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 isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr) const
Accumulate the constant offset this value has compared to a base pointer.
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.
uint64_t getPointerDereferenceableBytes(const DataLayout &DL, bool &CanBeNull, bool &CanBeFreed) const
Returns the number of bytes known to be dereferenceable for the pointer value.
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
const ParentTy * getParent() const
APInt GreatestCommonDivisor(APInt A, APInt B)
Compute GCD of two unsigned APInt values.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ C
The default llvm calling convention, compatible with C.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
OneUse_match< T > m_OneUse(const T &SubPattern)
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
specific_bbval m_SpecificBB(BasicBlock *BB)
Match a specific basic block value.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
brc_match< Cond_t, bind_ty< BasicBlock >, bind_ty< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
CastInst_match< OpTy, FPToSIInst > m_FPToSI(const OpTy &Op)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
initializer< Ty > init(const Ty &Val)
NodeAddr< PhiNode * > Phi
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
bool isOnlyUsedInZeroComparison(const Instruction *CxtI)
bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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 SimplifyInstructionsInBlock(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr)
Scan the specified basic block and try to simplify any instructions in it and recursively delete dead...
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
auto reverse(ContainerTy &&C)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
bool isModSet(const ModRefInfo MRI)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
@ And
Bitwise or logical AND of integers.
constexpr unsigned BitWidth
BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
bool cannotBeOrderedLessThanZero(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if we can prove that the specified FP value is either NaN or never less than -0....
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This is used by foldLoadsRecursive() to capture a Root Load node which is of type or(load,...
This is used by foldAnyOrAllBitsSet() to capture a source value (Root) and the bit indexes (Mask) nee...
MaskOps(unsigned BitWidth, bool MatchAnds)
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
AAMDNodes concat(const AAMDNodes &Other) const
Determine the best AAMDNodes after concatenating two different locations together.
A MapVector that performs no allocations if smaller than a certain size.