1 //===-- Vectorize.h - Vectorization Transformations -------------*- 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 header file defines prototypes for accessor functions that expose passes 11 // in the Vectorize transformations library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_TRANSFORMS_VECTORIZE_H 16 #define LLVM_TRANSFORMS_VECTORIZE_H 17 18 namespace llvm { 19 class BasicBlock; 20 class BasicBlockPass; 21 class Pass; 22 23 //===----------------------------------------------------------------------===// 24 /// @brief Vectorize configuration. 25 struct VectorizeConfig { 26 //===--------------------------------------------------------------------===// 27 // Target architecture related parameters 28 29 /// @brief The size of the native vector registers. 30 unsigned VectorBits; 31 32 /// @brief Vectorize boolean values. 33 bool VectorizeBools; 34 35 /// @brief Vectorize integer values. 36 bool VectorizeInts; 37 38 /// @brief Vectorize floating-point values. 39 bool VectorizeFloats; 40 41 /// @brief Vectorize pointer values. 42 bool VectorizePointers; 43 44 /// @brief Vectorize casting (conversion) operations. 45 bool VectorizeCasts; 46 47 /// @brief Vectorize floating-point math intrinsics. 48 bool VectorizeMath; 49 50 /// @brief Vectorize the fused-multiply-add intrinsic. 51 bool VectorizeFMA; 52 53 /// @brief Vectorize select instructions. 54 bool VectorizeSelect; 55 56 /// @brief Vectorize comparison instructions. 57 bool VectorizeCmp; 58 59 /// @brief Vectorize getelementptr instructions. 60 bool VectorizeGEP; 61 62 /// @brief Vectorize loads and stores. 63 bool VectorizeMemOps; 64 65 /// @brief Only generate aligned loads and stores. 66 bool AlignedOnly; 67 68 //===--------------------------------------------------------------------===// 69 // Misc parameters 70 71 /// @brief The required chain depth for vectorization. 72 unsigned ReqChainDepth; 73 74 /// @brief The maximum search distance for instruction pairs. 75 unsigned SearchLimit; 76 77 /// @brief The maximum number of candidate pairs with which to use a full 78 /// cycle check. 79 unsigned MaxCandPairsForCycleCheck; 80 81 /// @brief Replicating one element to a pair breaks the chain. 82 bool SplatBreaksChain; 83 84 /// @brief The maximum number of pairable instructions per group. 85 unsigned MaxInsts; 86 87 /// @brief The maximum number of candidate instruction pairs per group. 88 unsigned MaxPairs; 89 90 /// @brief The maximum number of pairing iterations. 91 unsigned MaxIter; 92 93 /// @brief Don't try to form odd-length vectors. 94 bool Pow2LenOnly; 95 96 /// @brief Don't boost the chain-depth contribution of loads and stores. 97 bool NoMemOpBoost; 98 99 /// @brief Use a fast instruction dependency analysis. 100 bool FastDep; 101 102 /// @brief Initialize the VectorizeConfig from command line options. 103 VectorizeConfig(); 104 }; 105 106 //===----------------------------------------------------------------------===// 107 // 108 // BBVectorize - A basic-block vectorization pass. 109 // 110 BasicBlockPass * 111 createBBVectorizePass(const VectorizeConfig &C = VectorizeConfig()); 112 113 //===----------------------------------------------------------------------===// 114 // 115 // LoopVectorize - Create a loop vectorization pass. 116 // 117 Pass *createLoopVectorizePass(); 118 119 //===----------------------------------------------------------------------===// 120 // 121 // SLPVectorizer - Create a bottom-up SLP vectorizer pass. 122 // 123 Pass *createSLPVectorizerPass(); 124 125 //===----------------------------------------------------------------------===// 126 /// @brief Vectorize the BasicBlock. 127 /// 128 /// @param BB The BasicBlock to be vectorized 129 /// @param P The current running pass, should require AliasAnalysis and 130 /// ScalarEvolution. After the vectorization, AliasAnalysis, 131 /// ScalarEvolution and CFG are preserved. 132 /// 133 /// @return True if the BB is changed, false otherwise. 134 /// 135 bool vectorizeBasicBlock(Pass *P, BasicBlock &BB, 136 const VectorizeConfig &C = VectorizeConfig()); 137 138 } // End llvm namespace 139 140 #endif 141