68 Value *B0 =
nullptr, *B1 =
nullptr;
86 NarrowedLeafShifts.
empty())
88 unsigned NumLeaves = NarrowedLeafShifts.
size();
91 for (
const auto &[V, L] : NarrowedLeafShifts) {
92 if (L.Shift >= NumLeaves || Seen.
test(L.Shift))
97 if ((L.Mask & ~
Known.Zero).ugt(1))
114 if (Leaves.
size() < 2)
116 Type *FieldTy = Leaves.
front().V->getType();
121 return A.Shift <
B.Shift;
123 for (
const auto &[Pos, L] :
enumerate(Leaves))
124 if (L.V->getType() != FieldTy || !L.Mask.isAllOnes() ||
138 unsigned VF = VecTy->getNumElements();
140 DebugLoc DL = Builder.getCurrentDebugLocation();
142 Value *
T = Builder.CreateTrunc(Vec, I1VecTy);
143 Value *BC = Builder.CreateBitCast(
T, Builder.getIntNTy(VF));
149 Value *Res = Builder.CreateICmp(Pred, BC, RHS);
152 auto CastCost = [&](
Value *V,
unsigned Opcode,
Type *SrcTy) {
156 return TTI.getCastInstrCost(Opcode,
I->getType(), SrcTy,
157 TTI.getCastContextHint(
I), CostKind,
I);
160 CastCost(BC, Instruction::BitCast, I1VecTy);
162 BitcastCmpCost +=
TTI.getCmpSelInstrCost(
163 Instruction::ICmp, BC->
getType(),
nullptr, Pred, CostKind,
164 TTI.getOperandInfo(BC),
TTI.getOperandInfo(RHS), Cmp);
165 if (BitcastCmpCost >=
167 for (
Value *V : {Res, BC,
T})
169 I->eraseFromParent();
170 Builder.SetCurrentDebugLocation(
DL);
173 Builder.SetCurrentDebugLocation(
DL);
182 auto DominatedReduxValue = [&](
Value *R) {
190 if (
P->getIncomingBlock(0) == ParentBB) {
192 }
else if (
P->getIncomingBlock(1) == ParentBB) {
196 if (Rdx && DominatedReduxValue(Rdx))
209 if (
P->getIncomingBlock(0) == BBLatch) {
211 }
else if (
P->getIncomingBlock(1) == BBLatch) {
215 if (Rdx && DominatedReduxValue(Rdx))
229 while (!Worklist.
empty()) {
235 I->getParent() == Root->
getParent() &&
I->hasOneUse() &&
242 constexpr unsigned MinReducedVals = 4;
245 if (RdxVals.
size() < MinReducedVals || !L || L->contains(Root) ||
256 if (Acc || !
P ||
P->getParent() != L->getHeader() || !
P->hasOneUse())
264 PHINode *Acc = GetAccumulator(RdxVal);
272 while (!Stack.empty()) {
273 auto [
I,
Depth] = Stack.pop_back_val();
290 Stack.emplace_back(OpI,
Depth + 1);
296 else if (RdxShape != Shape)
300 LoadInst *Ld0 = Loads.front()[Pos];
301 SmallVector<int64_t> Offsets;
302 for (ArrayRef<LoadInst *> RdxLoads : Loads) {
303 std::optional<int64_t> Diff = getPointersDiff(
304 Ld0->getType(), Ld0->getPointerOperand(), RdxLoads[Pos]->getType(),
305 RdxLoads[Pos]->getPointerOperand(), DL, SE);
308 Offsets.push_back(*Diff);
312 return P.value() == Offsets.front() +
static_cast<int64_t
>(
P.index());
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool IsSelect(unsigned Opcode, bool CheckOnlyCC=false)
Check if the opcode is a SELECT or SELECT_CC variant.
Provides some synthesis utilities to produce sequences of values.
This file implements the SmallBitVector class.
LLVM Basic Block Representation.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This is an important base class in LLVM.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI 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.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
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.
Convenience struct for specifying and reasoning about fast-math flags.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Common base class shared among various IRBuilders.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
The main scalar evolution driver.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
bool test(unsigned Idx) const
Returns true if bit Idx is set.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
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.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isIntegerTy() const
True if this is an instance of IntegerType.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
iterator_range< user_iterator > users()
const ParentTy * getParent() const
bool match(Val *V, const Pattern &P)
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
auto m_FMinimum(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_FMaximum(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_FMinNum(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_FMaxNum(const Opnd0 &Op0, const Opnd1 &Op1)
A private "module" namespace for types and utilities used by this pass.
bool matchPackedFields(Value *V, unsigned MaxDepth, SmallVectorImpl< Value * > &Fields, SmallVectorImpl< Instruction * > &Chain)
Matches V as the zero-extended fields, placed one after another from the lowest bit and filling V com...
Instruction * getReductionInstr(const DominatorTree *DT, PHINode *P, BasicBlock *ParentBB, LoopInfo *LI)
Try to get a reduction instruction from phi node P in block ParentBB, considering incoming values fro...
Type * getBoolReduxWideTy(RecurKind RdxKind, Type *RootTy, Type *LeafTy)
Value * tryEmitBoolReduxBitcastCmp(IRBuilderBase &Builder, const TargetTransformInfo &TTI, RecurKind RdxKind, Value *Vec, const Value *Root, FastMathFlags FMF, const TTI::TargetCostKind CostKind)
Emits the booleanized logical and/or reduction of Vec with the i1 root Root as trunc+bitcast+cmp (all...
bool isReductionOfConsecutiveAccumulators(Instruction *Root, const LoopInfo &LI, const DataLayout &DL, ScalarEvolution &SE, unsigned MaxDepth, SmallVectorImpl< unsigned > &Shape, SmallPtrSetImpl< PHINode * > &Accs)
Checks if the reduction, rooted at Root, reduces the loop accumulators, whose updates are the same ex...
BoolBitmask isBoolBitmaskRdx(RecurKind RdxKind, const SmallDenseMap< Value *, NarrowedLeafInfo > &NarrowedLeafShifts, const DataLayout &DL)
InstructionCost getBoolReduxWideRdxCost(const TargetTransformInfo &TTI, RecurKind RdxKind, FixedVectorType *VecTy, const Value *Root, FastMathFlags FMF, const TTI::TargetCostKind CostKind)
Returns the cost of the booleanized logical and/or reduction of a vector of type VecTy with the i1 ro...
static bool matchRdxBop(Instruction *I, Value *&V0, Value *&V1)
Instruction * getNonPhiOperand(Instruction *I, PHINode *Phi)
bool isReductionCandidate(Instruction *I)
void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW, unsigned MaxDepth, SmallVectorImpl< NarrowedLeafInfo > &Leaves, SmallVectorImpl< Instruction * > &ChainInsts)
Recursively collects the narrow leaves of the widened reduction value V.
BoolBitmask
The result of matching a boolean bitmask reduction over narrowed leaves.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
@ Known
Known to have no common set bits.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
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 void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
auto reverse(ContainerTy &&C)
void sort(IteratorTy Start, IteratorTy End)
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...
RecurKind
These are the kinds of recurrences that we support.
@ Or
Bitwise or logical OR of integers.
@ And
Bitwise or logical AND of integers.
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Narrow reduction leaf: the value, the shift applied after widening and the mask applied in the narrow...