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