xref: /aosp_15_r20/external/llvm/lib/Analysis/VectorUtils.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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