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