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