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/// Vectorize configuration.
25struct 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//
113Pass *createLoopVectorizePass(bool InterleaveOnlyWhenForced = false,
114 bool VectorizeOnlyWhenForced = false);
115
116//===----------------------------------------------------------------------===//
117//
118// SLPVectorizer - Create a bottom-up SLP vectorizer pass.
119//
120Pass *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///
132bool 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//
140Pass *createLoadStoreVectorizerPass();
141
142} // End llvm namespace
143
144#endif
145