Vectorize.h revision 360784
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
17namespace llvm {
18class BasicBlock;
19class Pass;
20
21//===----------------------------------------------------------------------===//
22/// Vectorize configuration.
23struct 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//
111Pass *createLoopVectorizePass();
112Pass *createLoopVectorizePass(bool InterleaveOnlyWhenForced,
113                              bool VectorizeOnlyWhenForced);
114
115//===----------------------------------------------------------------------===//
116//
117// SLPVectorizer - Create a bottom-up SLP vectorizer pass.
118//
119Pass *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///
131bool 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//
139Pass *createLoadStoreVectorizerPass();
140
141} // End llvm namespace
142
143#endif
144