1*9880d681SAndroid Build Coastguard Worker //===----------- VectorUtils.cpp - Vectorizer utility functions -----------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines vectorizer utilities.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/EquivalenceClasses.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/DemandedBits.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LoopInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ScalarEvolutionExpressions.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ScalarEvolution.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetTransformInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ValueTracking.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/VectorUtils.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GetElementPtrTypeIterator.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PatternMatch.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Value.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker using namespace llvm;
28*9880d681SAndroid Build Coastguard Worker using namespace llvm::PatternMatch;
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker /// \brief Identify if the intrinsic is trivially vectorizable.
31*9880d681SAndroid Build Coastguard Worker /// This method returns true if the intrinsic's argument types are all
32*9880d681SAndroid Build Coastguard Worker /// scalars for the scalar form of the intrinsic and all vectors for
33*9880d681SAndroid Build Coastguard Worker /// the vector form of the intrinsic.
isTriviallyVectorizable(Intrinsic::ID ID)34*9880d681SAndroid Build Coastguard Worker bool llvm::isTriviallyVectorizable(Intrinsic::ID ID) {
35*9880d681SAndroid Build Coastguard Worker switch (ID) {
36*9880d681SAndroid Build Coastguard Worker case Intrinsic::sqrt:
37*9880d681SAndroid Build Coastguard Worker case Intrinsic::sin:
38*9880d681SAndroid Build Coastguard Worker case Intrinsic::cos:
39*9880d681SAndroid Build Coastguard Worker case Intrinsic::exp:
40*9880d681SAndroid Build Coastguard Worker case Intrinsic::exp2:
41*9880d681SAndroid Build Coastguard Worker case Intrinsic::log:
42*9880d681SAndroid Build Coastguard Worker case Intrinsic::log10:
43*9880d681SAndroid Build Coastguard Worker case Intrinsic::log2:
44*9880d681SAndroid Build Coastguard Worker case Intrinsic::fabs:
45*9880d681SAndroid Build Coastguard Worker case Intrinsic::minnum:
46*9880d681SAndroid Build Coastguard Worker case Intrinsic::maxnum:
47*9880d681SAndroid Build Coastguard Worker case Intrinsic::copysign:
48*9880d681SAndroid Build Coastguard Worker case Intrinsic::floor:
49*9880d681SAndroid Build Coastguard Worker case Intrinsic::ceil:
50*9880d681SAndroid Build Coastguard Worker case Intrinsic::trunc:
51*9880d681SAndroid Build Coastguard Worker case Intrinsic::rint:
52*9880d681SAndroid Build Coastguard Worker case Intrinsic::nearbyint:
53*9880d681SAndroid Build Coastguard Worker case Intrinsic::round:
54*9880d681SAndroid Build Coastguard Worker case Intrinsic::bswap:
55*9880d681SAndroid Build Coastguard Worker case Intrinsic::bitreverse:
56*9880d681SAndroid Build Coastguard Worker case Intrinsic::ctpop:
57*9880d681SAndroid Build Coastguard Worker case Intrinsic::pow:
58*9880d681SAndroid Build Coastguard Worker case Intrinsic::fma:
59*9880d681SAndroid Build Coastguard Worker case Intrinsic::fmuladd:
60*9880d681SAndroid Build Coastguard Worker case Intrinsic::ctlz:
61*9880d681SAndroid Build Coastguard Worker case Intrinsic::cttz:
62*9880d681SAndroid Build Coastguard Worker case Intrinsic::powi:
63*9880d681SAndroid Build Coastguard Worker return true;
64*9880d681SAndroid Build Coastguard Worker default:
65*9880d681SAndroid Build Coastguard Worker return false;
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker }
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker /// \brief Identifies if the intrinsic has a scalar operand. It check for
70*9880d681SAndroid Build Coastguard Worker /// ctlz,cttz and powi special intrinsics whose argument is scalar.
hasVectorInstrinsicScalarOpd(Intrinsic::ID ID,unsigned ScalarOpdIdx)71*9880d681SAndroid Build Coastguard Worker bool llvm::hasVectorInstrinsicScalarOpd(Intrinsic::ID ID,
72*9880d681SAndroid Build Coastguard Worker unsigned ScalarOpdIdx) {
73*9880d681SAndroid Build Coastguard Worker switch (ID) {
74*9880d681SAndroid Build Coastguard Worker case Intrinsic::ctlz:
75*9880d681SAndroid Build Coastguard Worker case Intrinsic::cttz:
76*9880d681SAndroid Build Coastguard Worker case Intrinsic::powi:
77*9880d681SAndroid Build Coastguard Worker return (ScalarOpdIdx == 1);
78*9880d681SAndroid Build Coastguard Worker default:
79*9880d681SAndroid Build Coastguard Worker return false;
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker }
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker /// \brief Returns intrinsic ID for call.
84*9880d681SAndroid Build Coastguard Worker /// For the input call instruction it finds mapping intrinsic and returns
85*9880d681SAndroid Build Coastguard Worker /// its ID, in case it does not found it return not_intrinsic.
getVectorIntrinsicIDForCall(const CallInst * CI,const TargetLibraryInfo * TLI)86*9880d681SAndroid Build Coastguard Worker Intrinsic::ID llvm::getVectorIntrinsicIDForCall(const CallInst *CI,
87*9880d681SAndroid Build Coastguard Worker const TargetLibraryInfo *TLI) {
88*9880d681SAndroid Build Coastguard Worker Intrinsic::ID ID = getIntrinsicForCallSite(CI, TLI);
89*9880d681SAndroid Build Coastguard Worker if (ID == Intrinsic::not_intrinsic)
90*9880d681SAndroid Build Coastguard Worker return Intrinsic::not_intrinsic;
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker if (isTriviallyVectorizable(ID) || ID == Intrinsic::lifetime_start ||
93*9880d681SAndroid Build Coastguard Worker ID == Intrinsic::lifetime_end || ID == Intrinsic::assume)
94*9880d681SAndroid Build Coastguard Worker return ID;
95*9880d681SAndroid Build Coastguard Worker return Intrinsic::not_intrinsic;
96*9880d681SAndroid Build Coastguard Worker }
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker /// \brief Find the operand of the GEP that should be checked for consecutive
99*9880d681SAndroid Build Coastguard Worker /// stores. This ignores trailing indices that have no effect on the final
100*9880d681SAndroid Build Coastguard Worker /// pointer.
getGEPInductionOperand(const GetElementPtrInst * Gep)101*9880d681SAndroid Build Coastguard Worker unsigned llvm::getGEPInductionOperand(const GetElementPtrInst *Gep) {
102*9880d681SAndroid Build Coastguard Worker const DataLayout &DL = Gep->getModule()->getDataLayout();
103*9880d681SAndroid Build Coastguard Worker unsigned LastOperand = Gep->getNumOperands() - 1;
104*9880d681SAndroid Build Coastguard Worker unsigned GEPAllocSize = DL.getTypeAllocSize(Gep->getResultElementType());
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker // Walk backwards and try to peel off zeros.
107*9880d681SAndroid Build Coastguard Worker while (LastOperand > 1 && match(Gep->getOperand(LastOperand), m_Zero())) {
108*9880d681SAndroid Build Coastguard Worker // Find the type we're currently indexing into.
109*9880d681SAndroid Build Coastguard Worker gep_type_iterator GEPTI = gep_type_begin(Gep);
110*9880d681SAndroid Build Coastguard Worker std::advance(GEPTI, LastOperand - 1);
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker // If it's a type with the same allocation size as the result of the GEP we
113*9880d681SAndroid Build Coastguard Worker // can peel off the zero index.
114*9880d681SAndroid Build Coastguard Worker if (DL.getTypeAllocSize(*GEPTI) != GEPAllocSize)
115*9880d681SAndroid Build Coastguard Worker break;
116*9880d681SAndroid Build Coastguard Worker --LastOperand;
117*9880d681SAndroid Build Coastguard Worker }
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker return LastOperand;
120*9880d681SAndroid Build Coastguard Worker }
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker /// \brief If the argument is a GEP, then returns the operand identified by
123*9880d681SAndroid Build Coastguard Worker /// getGEPInductionOperand. However, if there is some other non-loop-invariant
124*9880d681SAndroid Build Coastguard Worker /// operand, it returns that instead.
stripGetElementPtr(Value * Ptr,ScalarEvolution * SE,Loop * Lp)125*9880d681SAndroid Build Coastguard Worker Value *llvm::stripGetElementPtr(Value *Ptr, ScalarEvolution *SE, Loop *Lp) {
126*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr);
127*9880d681SAndroid Build Coastguard Worker if (!GEP)
128*9880d681SAndroid Build Coastguard Worker return Ptr;
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker unsigned InductionOperand = getGEPInductionOperand(GEP);
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker // Check that all of the gep indices are uniform except for our induction
133*9880d681SAndroid Build Coastguard Worker // operand.
134*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i)
135*9880d681SAndroid Build Coastguard Worker if (i != InductionOperand &&
136*9880d681SAndroid Build Coastguard Worker !SE->isLoopInvariant(SE->getSCEV(GEP->getOperand(i)), Lp))
137*9880d681SAndroid Build Coastguard Worker return Ptr;
138*9880d681SAndroid Build Coastguard Worker return GEP->getOperand(InductionOperand);
139*9880d681SAndroid Build Coastguard Worker }
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker /// \brief If a value has only one user that is a CastInst, return it.
getUniqueCastUse(Value * Ptr,Loop * Lp,Type * Ty)142*9880d681SAndroid Build Coastguard Worker Value *llvm::getUniqueCastUse(Value *Ptr, Loop *Lp, Type *Ty) {
143*9880d681SAndroid Build Coastguard Worker Value *UniqueCast = nullptr;
144*9880d681SAndroid Build Coastguard Worker for (User *U : Ptr->users()) {
145*9880d681SAndroid Build Coastguard Worker CastInst *CI = dyn_cast<CastInst>(U);
146*9880d681SAndroid Build Coastguard Worker if (CI && CI->getType() == Ty) {
147*9880d681SAndroid Build Coastguard Worker if (!UniqueCast)
148*9880d681SAndroid Build Coastguard Worker UniqueCast = CI;
149*9880d681SAndroid Build Coastguard Worker else
150*9880d681SAndroid Build Coastguard Worker return nullptr;
151*9880d681SAndroid Build Coastguard Worker }
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker return UniqueCast;
154*9880d681SAndroid Build Coastguard Worker }
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker /// \brief Get the stride of a pointer access in a loop. Looks for symbolic
157*9880d681SAndroid Build Coastguard Worker /// strides "a[i*stride]". Returns the symbolic stride, or null otherwise.
getStrideFromPointer(Value * Ptr,ScalarEvolution * SE,Loop * Lp)158*9880d681SAndroid Build Coastguard Worker Value *llvm::getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp) {
159*9880d681SAndroid Build Coastguard Worker auto *PtrTy = dyn_cast<PointerType>(Ptr->getType());
160*9880d681SAndroid Build Coastguard Worker if (!PtrTy || PtrTy->isAggregateType())
161*9880d681SAndroid Build Coastguard Worker return nullptr;
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker // Try to remove a gep instruction to make the pointer (actually index at this
164*9880d681SAndroid Build Coastguard Worker // point) easier analyzable. If OrigPtr is equal to Ptr we are analzying the
165*9880d681SAndroid Build Coastguard Worker // pointer, otherwise, we are analyzing the index.
166*9880d681SAndroid Build Coastguard Worker Value *OrigPtr = Ptr;
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker // The size of the pointer access.
169*9880d681SAndroid Build Coastguard Worker int64_t PtrAccessSize = 1;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker Ptr = stripGetElementPtr(Ptr, SE, Lp);
172*9880d681SAndroid Build Coastguard Worker const SCEV *V = SE->getSCEV(Ptr);
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker if (Ptr != OrigPtr)
175*9880d681SAndroid Build Coastguard Worker // Strip off casts.
176*9880d681SAndroid Build Coastguard Worker while (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(V))
177*9880d681SAndroid Build Coastguard Worker V = C->getOperand();
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker const SCEVAddRecExpr *S = dyn_cast<SCEVAddRecExpr>(V);
180*9880d681SAndroid Build Coastguard Worker if (!S)
181*9880d681SAndroid Build Coastguard Worker return nullptr;
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker V = S->getStepRecurrence(*SE);
184*9880d681SAndroid Build Coastguard Worker if (!V)
185*9880d681SAndroid Build Coastguard Worker return nullptr;
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker // Strip off the size of access multiplication if we are still analyzing the
188*9880d681SAndroid Build Coastguard Worker // pointer.
189*9880d681SAndroid Build Coastguard Worker if (OrigPtr == Ptr) {
190*9880d681SAndroid Build Coastguard Worker if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(V)) {
191*9880d681SAndroid Build Coastguard Worker if (M->getOperand(0)->getSCEVType() != scConstant)
192*9880d681SAndroid Build Coastguard Worker return nullptr;
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker const APInt &APStepVal = cast<SCEVConstant>(M->getOperand(0))->getAPInt();
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker // Huge step value - give up.
197*9880d681SAndroid Build Coastguard Worker if (APStepVal.getBitWidth() > 64)
198*9880d681SAndroid Build Coastguard Worker return nullptr;
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker int64_t StepVal = APStepVal.getSExtValue();
201*9880d681SAndroid Build Coastguard Worker if (PtrAccessSize != StepVal)
202*9880d681SAndroid Build Coastguard Worker return nullptr;
203*9880d681SAndroid Build Coastguard Worker V = M->getOperand(1);
204*9880d681SAndroid Build Coastguard Worker }
205*9880d681SAndroid Build Coastguard Worker }
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker // Strip off casts.
208*9880d681SAndroid Build Coastguard Worker Type *StripedOffRecurrenceCast = nullptr;
209*9880d681SAndroid Build Coastguard Worker if (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(V)) {
210*9880d681SAndroid Build Coastguard Worker StripedOffRecurrenceCast = C->getType();
211*9880d681SAndroid Build Coastguard Worker V = C->getOperand();
212*9880d681SAndroid Build Coastguard Worker }
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker // Look for the loop invariant symbolic value.
215*9880d681SAndroid Build Coastguard Worker const SCEVUnknown *U = dyn_cast<SCEVUnknown>(V);
216*9880d681SAndroid Build Coastguard Worker if (!U)
217*9880d681SAndroid Build Coastguard Worker return nullptr;
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker Value *Stride = U->getValue();
220*9880d681SAndroid Build Coastguard Worker if (!Lp->isLoopInvariant(Stride))
221*9880d681SAndroid Build Coastguard Worker return nullptr;
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker // If we have stripped off the recurrence cast we have to make sure that we
224*9880d681SAndroid Build Coastguard Worker // return the value that is used in this loop so that we can replace it later.
225*9880d681SAndroid Build Coastguard Worker if (StripedOffRecurrenceCast)
226*9880d681SAndroid Build Coastguard Worker Stride = getUniqueCastUse(Stride, Lp, StripedOffRecurrenceCast);
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker return Stride;
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker /// \brief Given a vector and an element number, see if the scalar value is
232*9880d681SAndroid Build Coastguard Worker /// already around as a register, for example if it were inserted then extracted
233*9880d681SAndroid Build Coastguard Worker /// from the vector.
findScalarElement(Value * V,unsigned EltNo)234*9880d681SAndroid Build Coastguard Worker Value *llvm::findScalarElement(Value *V, unsigned EltNo) {
235*9880d681SAndroid Build Coastguard Worker assert(V->getType()->isVectorTy() && "Not looking at a vector?");
236*9880d681SAndroid Build Coastguard Worker VectorType *VTy = cast<VectorType>(V->getType());
237*9880d681SAndroid Build Coastguard Worker unsigned Width = VTy->getNumElements();
238*9880d681SAndroid Build Coastguard Worker if (EltNo >= Width) // Out of range access.
239*9880d681SAndroid Build Coastguard Worker return UndefValue::get(VTy->getElementType());
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker if (Constant *C = dyn_cast<Constant>(V))
242*9880d681SAndroid Build Coastguard Worker return C->getAggregateElement(EltNo);
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker if (InsertElementInst *III = dyn_cast<InsertElementInst>(V)) {
245*9880d681SAndroid Build Coastguard Worker // If this is an insert to a variable element, we don't know what it is.
246*9880d681SAndroid Build Coastguard Worker if (!isa<ConstantInt>(III->getOperand(2)))
247*9880d681SAndroid Build Coastguard Worker return nullptr;
248*9880d681SAndroid Build Coastguard Worker unsigned IIElt = cast<ConstantInt>(III->getOperand(2))->getZExtValue();
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker // If this is an insert to the element we are looking for, return the
251*9880d681SAndroid Build Coastguard Worker // inserted value.
252*9880d681SAndroid Build Coastguard Worker if (EltNo == IIElt)
253*9880d681SAndroid Build Coastguard Worker return III->getOperand(1);
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker // Otherwise, the insertelement doesn't modify the value, recurse on its
256*9880d681SAndroid Build Coastguard Worker // vector input.
257*9880d681SAndroid Build Coastguard Worker return findScalarElement(III->getOperand(0), EltNo);
258*9880d681SAndroid Build Coastguard Worker }
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(V)) {
261*9880d681SAndroid Build Coastguard Worker unsigned LHSWidth = SVI->getOperand(0)->getType()->getVectorNumElements();
262*9880d681SAndroid Build Coastguard Worker int InEl = SVI->getMaskValue(EltNo);
263*9880d681SAndroid Build Coastguard Worker if (InEl < 0)
264*9880d681SAndroid Build Coastguard Worker return UndefValue::get(VTy->getElementType());
265*9880d681SAndroid Build Coastguard Worker if (InEl < (int)LHSWidth)
266*9880d681SAndroid Build Coastguard Worker return findScalarElement(SVI->getOperand(0), InEl);
267*9880d681SAndroid Build Coastguard Worker return findScalarElement(SVI->getOperand(1), InEl - LHSWidth);
268*9880d681SAndroid Build Coastguard Worker }
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker // Extract a value from a vector add operation with a constant zero.
271*9880d681SAndroid Build Coastguard Worker Value *Val = nullptr; Constant *Con = nullptr;
272*9880d681SAndroid Build Coastguard Worker if (match(V, m_Add(m_Value(Val), m_Constant(Con))))
273*9880d681SAndroid Build Coastguard Worker if (Constant *Elt = Con->getAggregateElement(EltNo))
274*9880d681SAndroid Build Coastguard Worker if (Elt->isNullValue())
275*9880d681SAndroid Build Coastguard Worker return findScalarElement(Val, EltNo);
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker // Otherwise, we don't know.
278*9880d681SAndroid Build Coastguard Worker return nullptr;
279*9880d681SAndroid Build Coastguard Worker }
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker /// \brief Get splat value if the input is a splat vector or return nullptr.
282*9880d681SAndroid Build Coastguard Worker /// This function is not fully general. It checks only 2 cases:
283*9880d681SAndroid Build Coastguard Worker /// the input value is (1) a splat constants vector or (2) a sequence
284*9880d681SAndroid Build Coastguard Worker /// of instructions that broadcast a single value into a vector.
285*9880d681SAndroid Build Coastguard Worker ///
getSplatValue(const Value * V)286*9880d681SAndroid Build Coastguard Worker const llvm::Value *llvm::getSplatValue(const Value *V) {
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker if (auto *C = dyn_cast<Constant>(V))
289*9880d681SAndroid Build Coastguard Worker if (isa<VectorType>(V->getType()))
290*9880d681SAndroid Build Coastguard Worker return C->getSplatValue();
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker auto *ShuffleInst = dyn_cast<ShuffleVectorInst>(V);
293*9880d681SAndroid Build Coastguard Worker if (!ShuffleInst)
294*9880d681SAndroid Build Coastguard Worker return nullptr;
295*9880d681SAndroid Build Coastguard Worker // All-zero (or undef) shuffle mask elements.
296*9880d681SAndroid Build Coastguard Worker for (int MaskElt : ShuffleInst->getShuffleMask())
297*9880d681SAndroid Build Coastguard Worker if (MaskElt != 0 && MaskElt != -1)
298*9880d681SAndroid Build Coastguard Worker return nullptr;
299*9880d681SAndroid Build Coastguard Worker // The first shuffle source is 'insertelement' with index 0.
300*9880d681SAndroid Build Coastguard Worker auto *InsertEltInst =
301*9880d681SAndroid Build Coastguard Worker dyn_cast<InsertElementInst>(ShuffleInst->getOperand(0));
302*9880d681SAndroid Build Coastguard Worker if (!InsertEltInst || !isa<ConstantInt>(InsertEltInst->getOperand(2)) ||
303*9880d681SAndroid Build Coastguard Worker !cast<ConstantInt>(InsertEltInst->getOperand(2))->isNullValue())
304*9880d681SAndroid Build Coastguard Worker return nullptr;
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker return InsertEltInst->getOperand(1);
307*9880d681SAndroid Build Coastguard Worker }
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker MapVector<Instruction *, uint64_t>
computeMinimumValueSizes(ArrayRef<BasicBlock * > Blocks,DemandedBits & DB,const TargetTransformInfo * TTI)310*9880d681SAndroid Build Coastguard Worker llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
311*9880d681SAndroid Build Coastguard Worker const TargetTransformInfo *TTI) {
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker // DemandedBits will give us every value's live-out bits. But we want
314*9880d681SAndroid Build Coastguard Worker // to ensure no extra casts would need to be inserted, so every DAG
315*9880d681SAndroid Build Coastguard Worker // of connected values must have the same minimum bitwidth.
316*9880d681SAndroid Build Coastguard Worker EquivalenceClasses<Value *> ECs;
317*9880d681SAndroid Build Coastguard Worker SmallVector<Value *, 16> Worklist;
318*9880d681SAndroid Build Coastguard Worker SmallPtrSet<Value *, 4> Roots;
319*9880d681SAndroid Build Coastguard Worker SmallPtrSet<Value *, 16> Visited;
320*9880d681SAndroid Build Coastguard Worker DenseMap<Value *, uint64_t> DBits;
321*9880d681SAndroid Build Coastguard Worker SmallPtrSet<Instruction *, 4> InstructionSet;
322*9880d681SAndroid Build Coastguard Worker MapVector<Instruction *, uint64_t> MinBWs;
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker // Determine the roots. We work bottom-up, from truncs or icmps.
325*9880d681SAndroid Build Coastguard Worker bool SeenExtFromIllegalType = false;
326*9880d681SAndroid Build Coastguard Worker for (auto *BB : Blocks)
327*9880d681SAndroid Build Coastguard Worker for (auto &I : *BB) {
328*9880d681SAndroid Build Coastguard Worker InstructionSet.insert(&I);
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker if (TTI && (isa<ZExtInst>(&I) || isa<SExtInst>(&I)) &&
331*9880d681SAndroid Build Coastguard Worker !TTI->isTypeLegal(I.getOperand(0)->getType()))
332*9880d681SAndroid Build Coastguard Worker SeenExtFromIllegalType = true;
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker // Only deal with non-vector integers up to 64-bits wide.
335*9880d681SAndroid Build Coastguard Worker if ((isa<TruncInst>(&I) || isa<ICmpInst>(&I)) &&
336*9880d681SAndroid Build Coastguard Worker !I.getType()->isVectorTy() &&
337*9880d681SAndroid Build Coastguard Worker I.getOperand(0)->getType()->getScalarSizeInBits() <= 64) {
338*9880d681SAndroid Build Coastguard Worker // Don't make work for ourselves. If we know the loaded type is legal,
339*9880d681SAndroid Build Coastguard Worker // don't add it to the worklist.
340*9880d681SAndroid Build Coastguard Worker if (TTI && isa<TruncInst>(&I) && TTI->isTypeLegal(I.getType()))
341*9880d681SAndroid Build Coastguard Worker continue;
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker Worklist.push_back(&I);
344*9880d681SAndroid Build Coastguard Worker Roots.insert(&I);
345*9880d681SAndroid Build Coastguard Worker }
346*9880d681SAndroid Build Coastguard Worker }
347*9880d681SAndroid Build Coastguard Worker // Early exit.
348*9880d681SAndroid Build Coastguard Worker if (Worklist.empty() || (TTI && !SeenExtFromIllegalType))
349*9880d681SAndroid Build Coastguard Worker return MinBWs;
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker // Now proceed breadth-first, unioning values together.
352*9880d681SAndroid Build Coastguard Worker while (!Worklist.empty()) {
353*9880d681SAndroid Build Coastguard Worker Value *Val = Worklist.pop_back_val();
354*9880d681SAndroid Build Coastguard Worker Value *Leader = ECs.getOrInsertLeaderValue(Val);
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker if (Visited.count(Val))
357*9880d681SAndroid Build Coastguard Worker continue;
358*9880d681SAndroid Build Coastguard Worker Visited.insert(Val);
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker // Non-instructions terminate a chain successfully.
361*9880d681SAndroid Build Coastguard Worker if (!isa<Instruction>(Val))
362*9880d681SAndroid Build Coastguard Worker continue;
363*9880d681SAndroid Build Coastguard Worker Instruction *I = cast<Instruction>(Val);
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker // If we encounter a type that is larger than 64 bits, we can't represent
366*9880d681SAndroid Build Coastguard Worker // it so bail out.
367*9880d681SAndroid Build Coastguard Worker if (DB.getDemandedBits(I).getBitWidth() > 64)
368*9880d681SAndroid Build Coastguard Worker return MapVector<Instruction *, uint64_t>();
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker uint64_t V = DB.getDemandedBits(I).getZExtValue();
371*9880d681SAndroid Build Coastguard Worker DBits[Leader] |= V;
372*9880d681SAndroid Build Coastguard Worker DBits[I] = V;
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Worker // Casts, loads and instructions outside of our range terminate a chain
375*9880d681SAndroid Build Coastguard Worker // successfully.
376*9880d681SAndroid Build Coastguard Worker if (isa<SExtInst>(I) || isa<ZExtInst>(I) || isa<LoadInst>(I) ||
377*9880d681SAndroid Build Coastguard Worker !InstructionSet.count(I))
378*9880d681SAndroid Build Coastguard Worker continue;
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker // Unsafe casts terminate a chain unsuccessfully. We can't do anything
381*9880d681SAndroid Build Coastguard Worker // useful with bitcasts, ptrtoints or inttoptrs and it'd be unsafe to
382*9880d681SAndroid Build Coastguard Worker // transform anything that relies on them.
383*9880d681SAndroid Build Coastguard Worker if (isa<BitCastInst>(I) || isa<PtrToIntInst>(I) || isa<IntToPtrInst>(I) ||
384*9880d681SAndroid Build Coastguard Worker !I->getType()->isIntegerTy()) {
385*9880d681SAndroid Build Coastguard Worker DBits[Leader] |= ~0ULL;
386*9880d681SAndroid Build Coastguard Worker continue;
387*9880d681SAndroid Build Coastguard Worker }
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker // We don't modify the types of PHIs. Reductions will already have been
390*9880d681SAndroid Build Coastguard Worker // truncated if possible, and inductions' sizes will have been chosen by
391*9880d681SAndroid Build Coastguard Worker // indvars.
392*9880d681SAndroid Build Coastguard Worker if (isa<PHINode>(I))
393*9880d681SAndroid Build Coastguard Worker continue;
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker if (DBits[Leader] == ~0ULL)
396*9880d681SAndroid Build Coastguard Worker // All bits demanded, no point continuing.
397*9880d681SAndroid Build Coastguard Worker continue;
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker for (Value *O : cast<User>(I)->operands()) {
400*9880d681SAndroid Build Coastguard Worker ECs.unionSets(Leader, O);
401*9880d681SAndroid Build Coastguard Worker Worklist.push_back(O);
402*9880d681SAndroid Build Coastguard Worker }
403*9880d681SAndroid Build Coastguard Worker }
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker // Now we've discovered all values, walk them to see if there are
406*9880d681SAndroid Build Coastguard Worker // any users we didn't see. If there are, we can't optimize that
407*9880d681SAndroid Build Coastguard Worker // chain.
408*9880d681SAndroid Build Coastguard Worker for (auto &I : DBits)
409*9880d681SAndroid Build Coastguard Worker for (auto *U : I.first->users())
410*9880d681SAndroid Build Coastguard Worker if (U->getType()->isIntegerTy() && DBits.count(U) == 0)
411*9880d681SAndroid Build Coastguard Worker DBits[ECs.getOrInsertLeaderValue(I.first)] |= ~0ULL;
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker for (auto I = ECs.begin(), E = ECs.end(); I != E; ++I) {
414*9880d681SAndroid Build Coastguard Worker uint64_t LeaderDemandedBits = 0;
415*9880d681SAndroid Build Coastguard Worker for (auto MI = ECs.member_begin(I), ME = ECs.member_end(); MI != ME; ++MI)
416*9880d681SAndroid Build Coastguard Worker LeaderDemandedBits |= DBits[*MI];
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Worker uint64_t MinBW = (sizeof(LeaderDemandedBits) * 8) -
419*9880d681SAndroid Build Coastguard Worker llvm::countLeadingZeros(LeaderDemandedBits);
420*9880d681SAndroid Build Coastguard Worker // Round up to a power of 2
421*9880d681SAndroid Build Coastguard Worker if (!isPowerOf2_64((uint64_t)MinBW))
422*9880d681SAndroid Build Coastguard Worker MinBW = NextPowerOf2(MinBW);
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker // We don't modify the types of PHIs. Reductions will already have been
425*9880d681SAndroid Build Coastguard Worker // truncated if possible, and inductions' sizes will have been chosen by
426*9880d681SAndroid Build Coastguard Worker // indvars.
427*9880d681SAndroid Build Coastguard Worker // If we are required to shrink a PHI, abandon this entire equivalence class.
428*9880d681SAndroid Build Coastguard Worker bool Abort = false;
429*9880d681SAndroid Build Coastguard Worker for (auto MI = ECs.member_begin(I), ME = ECs.member_end(); MI != ME; ++MI)
430*9880d681SAndroid Build Coastguard Worker if (isa<PHINode>(*MI) && MinBW < (*MI)->getType()->getScalarSizeInBits()) {
431*9880d681SAndroid Build Coastguard Worker Abort = true;
432*9880d681SAndroid Build Coastguard Worker break;
433*9880d681SAndroid Build Coastguard Worker }
434*9880d681SAndroid Build Coastguard Worker if (Abort)
435*9880d681SAndroid Build Coastguard Worker continue;
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker for (auto MI = ECs.member_begin(I), ME = ECs.member_end(); MI != ME; ++MI) {
438*9880d681SAndroid Build Coastguard Worker if (!isa<Instruction>(*MI))
439*9880d681SAndroid Build Coastguard Worker continue;
440*9880d681SAndroid Build Coastguard Worker Type *Ty = (*MI)->getType();
441*9880d681SAndroid Build Coastguard Worker if (Roots.count(*MI))
442*9880d681SAndroid Build Coastguard Worker Ty = cast<Instruction>(*MI)->getOperand(0)->getType();
443*9880d681SAndroid Build Coastguard Worker if (MinBW < Ty->getScalarSizeInBits())
444*9880d681SAndroid Build Coastguard Worker MinBWs[cast<Instruction>(*MI)] = MinBW;
445*9880d681SAndroid Build Coastguard Worker }
446*9880d681SAndroid Build Coastguard Worker }
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker return MinBWs;
449*9880d681SAndroid Build Coastguard Worker }
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker /// \returns \p I after propagating metadata from \p VL.
propagateMetadata(Instruction * Inst,ArrayRef<Value * > VL)452*9880d681SAndroid Build Coastguard Worker Instruction *llvm::propagateMetadata(Instruction *Inst, ArrayRef<Value *> VL) {
453*9880d681SAndroid Build Coastguard Worker Instruction *I0 = cast<Instruction>(VL[0]);
454*9880d681SAndroid Build Coastguard Worker SmallVector<std::pair<unsigned, MDNode *>, 4> Metadata;
455*9880d681SAndroid Build Coastguard Worker I0->getAllMetadataOtherThanDebugLoc(Metadata);
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker for (auto Kind : { LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope,
458*9880d681SAndroid Build Coastguard Worker LLVMContext::MD_noalias, LLVMContext::MD_fpmath,
459*9880d681SAndroid Build Coastguard Worker LLVMContext::MD_nontemporal }) {
460*9880d681SAndroid Build Coastguard Worker MDNode *MD = I0->getMetadata(Kind);
461*9880d681SAndroid Build Coastguard Worker
462*9880d681SAndroid Build Coastguard Worker for (int J = 1, E = VL.size(); MD && J != E; ++J) {
463*9880d681SAndroid Build Coastguard Worker const Instruction *IJ = cast<Instruction>(VL[J]);
464*9880d681SAndroid Build Coastguard Worker MDNode *IMD = IJ->getMetadata(Kind);
465*9880d681SAndroid Build Coastguard Worker switch (Kind) {
466*9880d681SAndroid Build Coastguard Worker case LLVMContext::MD_tbaa:
467*9880d681SAndroid Build Coastguard Worker MD = MDNode::getMostGenericTBAA(MD, IMD);
468*9880d681SAndroid Build Coastguard Worker break;
469*9880d681SAndroid Build Coastguard Worker case LLVMContext::MD_alias_scope:
470*9880d681SAndroid Build Coastguard Worker MD = MDNode::getMostGenericAliasScope(MD, IMD);
471*9880d681SAndroid Build Coastguard Worker break;
472*9880d681SAndroid Build Coastguard Worker case LLVMContext::MD_noalias:
473*9880d681SAndroid Build Coastguard Worker MD = MDNode::intersect(MD, IMD);
474*9880d681SAndroid Build Coastguard Worker break;
475*9880d681SAndroid Build Coastguard Worker case LLVMContext::MD_fpmath:
476*9880d681SAndroid Build Coastguard Worker MD = MDNode::getMostGenericFPMath(MD, IMD);
477*9880d681SAndroid Build Coastguard Worker break;
478*9880d681SAndroid Build Coastguard Worker case LLVMContext::MD_nontemporal:
479*9880d681SAndroid Build Coastguard Worker MD = MDNode::intersect(MD, IMD);
480*9880d681SAndroid Build Coastguard Worker break;
481*9880d681SAndroid Build Coastguard Worker default:
482*9880d681SAndroid Build Coastguard Worker llvm_unreachable("unhandled metadata");
483*9880d681SAndroid Build Coastguard Worker }
484*9880d681SAndroid Build Coastguard Worker }
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker Inst->setMetadata(Kind, MD);
487*9880d681SAndroid Build Coastguard Worker }
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Worker return Inst;
490*9880d681SAndroid Build Coastguard Worker }
491