summaryrefslogtreecommitdiff
path: root/include/llvm/Transforms/Vectorize.h
blob: 1e49a9c01e6beb91d7bd2abf74dfddfd8cf3c160 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//===-- Vectorize.h - Vectorization Transformations -------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header file defines prototypes for accessor functions that expose passes
// in the Vectorize transformations library.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TRANSFORMS_VECTORIZE_H
#define LLVM_TRANSFORMS_VECTORIZE_H

namespace llvm {
class BasicBlock;
class BasicBlockPass;

//===----------------------------------------------------------------------===//
/// @brief Vectorize configuration.
struct VectorizeConfig {
  //===--------------------------------------------------------------------===//
  // Target architecture related parameters

  /// @brief The size of the native vector registers.
  unsigned VectorBits;

  /// @brief Vectorize boolean values.
  bool VectorizeBools;

  /// @brief Vectorize integer values.
  bool VectorizeInts;

  /// @brief Vectorize floating-point values.
  bool VectorizeFloats;

  /// @brief Vectorize pointer values.
  bool VectorizePointers;

  /// @brief Vectorize casting (conversion) operations.
  bool VectorizeCasts;

  /// @brief Vectorize floating-point math intrinsics.
  bool VectorizeMath;

  /// @brief Vectorize the fused-multiply-add intrinsic.
  bool VectorizeFMA;

  /// @brief Vectorize select instructions.
  bool VectorizeSelect;

  /// @brief Vectorize comparison instructions.
  bool VectorizeCmp;

  /// @brief Vectorize getelementptr instructions.
  bool VectorizeGEP;

  /// @brief Vectorize loads and stores.
  bool VectorizeMemOps;

  /// @brief Only generate aligned loads and stores.
  bool AlignedOnly;

  //===--------------------------------------------------------------------===//
  // Misc parameters

  /// @brief The required chain depth for vectorization.
  unsigned ReqChainDepth;

  /// @brief The maximum search distance for instruction pairs.
  unsigned SearchLimit;

  /// @brief The maximum number of candidate pairs with which to use a full
  ///        cycle check.
  unsigned MaxCandPairsForCycleCheck;

  /// @brief Replicating one element to a pair breaks the chain.
  bool SplatBreaksChain;

  /// @brief The maximum number of pairable instructions per group.
  unsigned MaxInsts;

  /// @brief The maximum number of pairing iterations.
  unsigned MaxIter;

  /// @brief Don't try to form odd-length vectors.
  bool Pow2LenOnly;

  /// @brief Don't boost the chain-depth contribution of loads and stores.
  bool NoMemOpBoost;

  /// @brief Use a fast instruction dependency analysis.
  bool FastDep;

  /// @brief Initialize the VectorizeConfig from command line options.
  VectorizeConfig();
};

//===----------------------------------------------------------------------===//
//
// BBVectorize - A basic-block vectorization pass.
//
BasicBlockPass *
createBBVectorizePass(const VectorizeConfig &C = VectorizeConfig());

//===----------------------------------------------------------------------===//
/// @brief Vectorize the BasicBlock.
///
/// @param BB The BasicBlock to be vectorized
/// @param P  The current running pass, should require AliasAnalysis and
///           ScalarEvolution. After the vectorization, AliasAnalysis,
///           ScalarEvolution and CFG are preserved.
///
/// @return True if the BB is changed, false otherwise.
///
bool vectorizeBasicBlock(Pass *P, BasicBlock &BB,
                         const VectorizeConfig &C = VectorizeConfig());

} // End llvm namespace

#endif