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 18namespace llvm { 19class BasicBlock; 20class BasicBlockPass; 21class Pass; 22 23//===----------------------------------------------------------------------===// 24/// @brief Vectorize configuration. 25struct 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 bit intrinsics. 51 bool VectorizeBitManipulations; 52 53 /// @brief Vectorize the fused-multiply-add intrinsic. 54 bool VectorizeFMA; 55 56 /// @brief Vectorize select instructions. 57 bool VectorizeSelect; 58 59 /// @brief Vectorize comparison instructions. 60 bool VectorizeCmp; 61 62 /// @brief Vectorize getelementptr instructions. 63 bool VectorizeGEP; 64 65 /// @brief Vectorize loads and stores. 66 bool VectorizeMemOps; 67 68 /// @brief Only generate aligned loads and stores. 69 bool AlignedOnly; 70 71 //===--------------------------------------------------------------------===// 72 // Misc parameters 73 74 /// @brief The required chain depth for vectorization. 75 unsigned ReqChainDepth; 76 77 /// @brief The maximum search distance for instruction pairs. 78 unsigned SearchLimit; 79 80 /// @brief The maximum number of candidate pairs with which to use a full 81 /// cycle check. 82 unsigned MaxCandPairsForCycleCheck; 83 84 /// @brief Replicating one element to a pair breaks the chain. 85 bool SplatBreaksChain; 86 87 /// @brief The maximum number of pairable instructions per group. 88 unsigned MaxInsts; 89 90 /// @brief The maximum number of candidate instruction pairs per group. 91 unsigned MaxPairs; 92 93 /// @brief The maximum number of pairing iterations. 94 unsigned MaxIter; 95 96 /// @brief Don't try to form odd-length vectors. 97 bool Pow2LenOnly; 98 99 /// @brief Don't boost the chain-depth contribution of loads and stores. 100 bool NoMemOpBoost; 101 102 /// @brief Use a fast instruction dependency analysis. 103 bool FastDep; 104 105 /// @brief Initialize the VectorizeConfig from command line options. 106 VectorizeConfig(); 107}; 108 109//===----------------------------------------------------------------------===// 110// 111// BBVectorize - A basic-block vectorization pass. 112// 113BasicBlockPass * 114createBBVectorizePass(const VectorizeConfig &C = VectorizeConfig()); 115 116//===----------------------------------------------------------------------===// 117// 118// LoopVectorize - Create a loop vectorization pass. 119// 120Pass *createLoopVectorizePass(bool NoUnrolling = false, 121 bool AlwaysVectorize = true); 122 123//===----------------------------------------------------------------------===// 124// 125// SLPVectorizer - Create a bottom-up SLP vectorizer pass. 126// 127Pass *createSLPVectorizerPass(); 128 129//===----------------------------------------------------------------------===// 130/// @brief Vectorize the BasicBlock. 131/// 132/// @param BB The BasicBlock to be vectorized 133/// @param P The current running pass, should require AliasAnalysis and 134/// ScalarEvolution. After the vectorization, AliasAnalysis, 135/// ScalarEvolution and CFG are preserved. 136/// 137/// @return True if the BB is changed, false otherwise. 138/// 139bool vectorizeBasicBlock(Pass *P, BasicBlock &BB, 140 const VectorizeConfig &C = VectorizeConfig()); 141 142} // End llvm namespace 143 144#endif 145