Vectorize.h revision 263508
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 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//
110BasicBlockPass *
111createBBVectorizePass(const VectorizeConfig &C = VectorizeConfig());
112
113//===----------------------------------------------------------------------===//
114//
115// LoopVectorize - Create a loop vectorization pass.
116//
117Pass *createLoopVectorizePass(bool NoUnrolling = false);
118
119//===----------------------------------------------------------------------===//
120//
121// SLPVectorizer - Create a bottom-up SLP vectorizer pass.
122//
123Pass *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///
135bool vectorizeBasicBlock(Pass *P, BasicBlock &BB,
136                         const VectorizeConfig &C = VectorizeConfig());
137
138} // End llvm namespace
139
140#endif
141