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