1 //===- llvm/Analysis/VectorUtils.h - Vector utilities -----------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines some vectorizer utilities. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_ANALYSIS_VECTORUTILS_H 15 #define LLVM_ANALYSIS_VECTORUTILS_H 16 17 #include "llvm/ADT/MapVector.h" 18 #include "llvm/Analysis/TargetLibraryInfo.h" 19 #include "llvm/IR/IRBuilder.h" 20 21 namespace llvm { 22 23 template <typename T> class ArrayRef; 24 class DemandedBits; 25 class GetElementPtrInst; 26 class Loop; 27 class ScalarEvolution; 28 class TargetTransformInfo; 29 class Type; 30 class Value; 31 32 namespace Intrinsic { 33 enum ID : unsigned; 34 } 35 36 /// \brief Identify if the intrinsic is trivially vectorizable. 37 /// This method returns true if the intrinsic's argument types are all 38 /// scalars for the scalar form of the intrinsic and all vectors for 39 /// the vector form of the intrinsic. 40 bool isTriviallyVectorizable(Intrinsic::ID ID); 41 42 /// \brief Identifies if the intrinsic has a scalar operand. It checks for 43 /// ctlz,cttz and powi special intrinsics whose argument is scalar. 44 bool hasVectorInstrinsicScalarOpd(Intrinsic::ID ID, unsigned ScalarOpdIdx); 45 46 /// \brief Returns intrinsic ID for call. 47 /// For the input call instruction it finds mapping intrinsic and returns 48 /// its intrinsic ID, in case it does not found it return not_intrinsic. 49 Intrinsic::ID getVectorIntrinsicIDForCall(const CallInst *CI, 50 const TargetLibraryInfo *TLI); 51 52 /// \brief Find the operand of the GEP that should be checked for consecutive 53 /// stores. This ignores trailing indices that have no effect on the final 54 /// pointer. 55 unsigned getGEPInductionOperand(const GetElementPtrInst *Gep); 56 57 /// \brief If the argument is a GEP, then returns the operand identified by 58 /// getGEPInductionOperand. However, if there is some other non-loop-invariant 59 /// operand, it returns that instead. 60 Value *stripGetElementPtr(Value *Ptr, ScalarEvolution *SE, Loop *Lp); 61 62 /// \brief If a value has only one user that is a CastInst, return it. 63 Value *getUniqueCastUse(Value *Ptr, Loop *Lp, Type *Ty); 64 65 /// \brief Get the stride of a pointer access in a loop. Looks for symbolic 66 /// strides "a[i*stride]". Returns the symbolic stride, or null otherwise. 67 Value *getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp); 68 69 /// \brief Given a vector and an element number, see if the scalar value is 70 /// already around as a register, for example if it were inserted then extracted 71 /// from the vector. 72 Value *findScalarElement(Value *V, unsigned EltNo); 73 74 /// \brief Get splat value if the input is a splat vector or return nullptr. 75 /// The value may be extracted from a splat constants vector or from 76 /// a sequence of instructions that broadcast a single value into a vector. 77 const Value *getSplatValue(const Value *V); 78 79 /// \brief Compute a map of integer instructions to their minimum legal type 80 /// size. 81 /// 82 /// C semantics force sub-int-sized values (e.g. i8, i16) to be promoted to int 83 /// type (e.g. i32) whenever arithmetic is performed on them. 84 /// 85 /// For targets with native i8 or i16 operations, usually InstCombine can shrink 86 /// the arithmetic type down again. However InstCombine refuses to create 87 /// illegal types, so for targets without i8 or i16 registers, the lengthening 88 /// and shrinking remains. 89 /// 90 /// Most SIMD ISAs (e.g. NEON) however support vectors of i8 or i16 even when 91 /// their scalar equivalents do not, so during vectorization it is important to 92 /// remove these lengthens and truncates when deciding the profitability of 93 /// vectorization. 94 /// 95 /// This function analyzes the given range of instructions and determines the 96 /// minimum type size each can be converted to. It attempts to remove or 97 /// minimize type size changes across each def-use chain, so for example in the 98 /// following code: 99 /// 100 /// %1 = load i8, i8* 101 /// %2 = add i8 %1, 2 102 /// %3 = load i16, i16* 103 /// %4 = zext i8 %2 to i32 104 /// %5 = zext i16 %3 to i32 105 /// %6 = add i32 %4, %5 106 /// %7 = trunc i32 %6 to i16 107 /// 108 /// Instruction %6 must be done at least in i16, so computeMinimumValueSizes 109 /// will return: {%1: 16, %2: 16, %3: 16, %4: 16, %5: 16, %6: 16, %7: 16}. 110 /// 111 /// If the optional TargetTransformInfo is provided, this function tries harder 112 /// to do less work by only looking at illegal types. 113 MapVector<Instruction*, uint64_t> 114 computeMinimumValueSizes(ArrayRef<BasicBlock*> Blocks, 115 DemandedBits &DB, 116 const TargetTransformInfo *TTI=nullptr); 117 118 /// Specifically, let Kinds = [MD_tbaa, MD_alias_scope, MD_noalias, MD_fpmath, 119 /// MD_nontemporal]. For K in Kinds, we get the MDNode for K from each of the 120 /// elements of VL, compute their "intersection" (i.e., the most generic 121 /// metadata value that covers all of the individual values), and set I's 122 /// metadata for M equal to the intersection value. 123 /// 124 /// This function always sets a (possibly null) value for each K in Kinds. 125 Instruction *propagateMetadata(Instruction *I, ArrayRef<Value *> VL); 126 127 /// \brief Create an interleave shuffle mask. 128 /// 129 /// This function creates a shuffle mask for interleaving \p NumVecs vectors of 130 /// vectorization factor \p VF into a single wide vector. The mask is of the 131 /// form: 132 /// 133 /// <0, VF, VF * 2, ..., VF * (NumVecs - 1), 1, VF + 1, VF * 2 + 1, ...> 134 /// 135 /// For example, the mask for VF = 4 and NumVecs = 2 is: 136 /// 137 /// <0, 4, 1, 5, 2, 6, 3, 7>. 138 Constant *createInterleaveMask(IRBuilder<> &Builder, unsigned VF, 139 unsigned NumVecs); 140 141 /// \brief Create a stride shuffle mask. 142 /// 143 /// This function creates a shuffle mask whose elements begin at \p Start and 144 /// are incremented by \p Stride. The mask can be used to deinterleave an 145 /// interleaved vector into separate vectors of vectorization factor \p VF. The 146 /// mask is of the form: 147 /// 148 /// <Start, Start + Stride, ..., Start + Stride * (VF - 1)> 149 /// 150 /// For example, the mask for Start = 0, Stride = 2, and VF = 4 is: 151 /// 152 /// <0, 2, 4, 6> 153 Constant *createStrideMask(IRBuilder<> &Builder, unsigned Start, 154 unsigned Stride, unsigned VF); 155 156 /// \brief Create a sequential shuffle mask. 157 /// 158 /// This function creates shuffle mask whose elements are sequential and begin 159 /// at \p Start. The mask contains \p NumInts integers and is padded with \p 160 /// NumUndefs undef values. The mask is of the form: 161 /// 162 /// <Start, Start + 1, ... Start + NumInts - 1, undef_1, ... undef_NumUndefs> 163 /// 164 /// For example, the mask for Start = 0, NumInsts = 4, and NumUndefs = 4 is: 165 /// 166 /// <0, 1, 2, 3, undef, undef, undef, undef> 167 Constant *createSequentialMask(IRBuilder<> &Builder, unsigned Start, 168 unsigned NumInts, unsigned NumUndefs); 169 170 /// \brief Concatenate a list of vectors. 171 /// 172 /// This function generates code that concatenate the vectors in \p Vecs into a 173 /// single large vector. The number of vectors should be greater than one, and 174 /// their element types should be the same. The number of elements in the 175 /// vectors should also be the same; however, if the last vector has fewer 176 /// elements, it will be padded with undefs. 177 Value *concatenateVectors(IRBuilder<> &Builder, ArrayRef<Value *> Vecs); 178 179 } // llvm namespace 180 181 #endif 182