Home | History | Annotate | Download | only in Transforms
      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 
     18 namespace llvm {
     19 class BasicBlock;
     20 class BasicBlockPass;
     21 
     22 //===----------------------------------------------------------------------===//
     23 /// @brief Vectorize configuration.
     24 struct VectorizeConfig {
     25   //===--------------------------------------------------------------------===//
     26   // Target architecture related parameters
     27 
     28   /// @brief The size of the native vector registers.
     29   unsigned VectorBits;
     30 
     31   /// @brief Vectorize integer values.
     32   bool VectorizeInts;
     33 
     34   /// @brief Vectorize floating-point values.
     35   bool VectorizeFloats;
     36 
     37   /// @brief Vectorize pointer values.
     38   bool VectorizePointers;
     39 
     40   /// @brief Vectorize casting (conversion) operations.
     41   bool VectorizeCasts;
     42 
     43   /// @brief Vectorize floating-point math intrinsics.
     44   bool VectorizeMath;
     45 
     46   /// @brief Vectorize the fused-multiply-add intrinsic.
     47   bool VectorizeFMA;
     48 
     49   /// @brief Vectorize select instructions.
     50   bool VectorizeSelect;
     51 
     52   /// @brief Vectorize getelementptr instructions.
     53   bool VectorizeGEP;
     54 
     55   /// @brief Vectorize loads and stores.
     56   bool VectorizeMemOps;
     57 
     58   /// @brief Only generate aligned loads and stores.
     59   bool AlignedOnly;
     60 
     61   //===--------------------------------------------------------------------===//
     62   // Misc parameters
     63 
     64   /// @brief The required chain depth for vectorization.
     65   unsigned ReqChainDepth;
     66 
     67   /// @brief The maximum search distance for instruction pairs.
     68   unsigned SearchLimit;
     69 
     70   /// @brief The maximum number of candidate pairs with which to use a full
     71   ///        cycle check.
     72   unsigned MaxCandPairsForCycleCheck;
     73 
     74   /// @brief Replicating one element to a pair breaks the chain.
     75   bool SplatBreaksChain;
     76 
     77   /// @brief The maximum number of pairable instructions per group.
     78   unsigned MaxInsts;
     79 
     80   /// @brief The maximum number of pairing iterations.
     81   unsigned MaxIter;
     82 
     83   /// @brief Don't boost the chain-depth contribution of loads and stores.
     84   bool NoMemOpBoost;
     85 
     86   /// @brief Use a fast instruction dependency analysis.
     87   bool FastDep;
     88 
     89   /// @brief Initialize the VectorizeConfig from command line options.
     90   VectorizeConfig();
     91 };
     92 
     93 //===----------------------------------------------------------------------===//
     94 //
     95 // BBVectorize - A basic-block vectorization pass.
     96 //
     97 BasicBlockPass *
     98 createBBVectorizePass(const VectorizeConfig &C = VectorizeConfig());
     99 
    100 //===----------------------------------------------------------------------===//
    101 /// @brief Vectorize the BasicBlock.
    102 ///
    103 /// @param BB The BasicBlock to be vectorized
    104 /// @param P  The current running pass, should require AliasAnalysis and
    105 ///           ScalarEvolution. After the vectorization, AliasAnalysis,
    106 ///           ScalarEvolution and CFG are preserved.
    107 ///
    108 /// @return True if the BB is changed, false otherwise.
    109 ///
    110 bool vectorizeBasicBlock(Pass *P, BasicBlock &BB,
    111                          const VectorizeConfig &C = VectorizeConfig());
    112 
    113 } // End llvm namespace
    114 
    115 #endif
    116