LLVM 17.0.0git
Macros | Functions | Variables
VectorCombine.cpp File Reference
#include "llvm/Transforms/Vectorize/VectorCombine.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Transforms/Utils/Local.h"
#include <numeric>
#include "llvm/Transforms/Utils/InstructionWorklist.h"

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "vector-combine"
 

Functions

 STATISTIC (NumVecLoad, "Number of vector loads formed")
 
 STATISTIC (NumVecCmp, "Number of vector compares formed")
 
 STATISTIC (NumVecBO, "Number of vector binops formed")
 
 STATISTIC (NumVecCmpBO, "Number of vector compare + binop formed")
 
 STATISTIC (NumShufOfBitcast, "Number of shuffles moved after bitcast")
 
 STATISTIC (NumScalarBO, "Number of scalar binops formed")
 
 STATISTIC (NumScalarCmp, "Number of scalar compares formed")
 
static bool canWidenLoad (LoadInst *Load, const TargetTransformInfo &TTI)
 
static ValuecreateShiftShuffle (Value *Vec, unsigned OldIndex, unsigned NewIndex, IRBuilder<> &Builder)
 Create a shuffle that translates (shifts) 1 element from the input vector to a new element location.
 
static ExtractElementInsttranslateExtract (ExtractElementInst *ExtElt, unsigned NewIndex, IRBuilder<> &Builder)
 Given an extract element instruction with constant index operand, shuffle the source vector (shift the scalar element) to a NewIndex for extraction.
 
static bool isMemModifiedBetween (BasicBlock::iterator Begin, BasicBlock::iterator End, const MemoryLocation &Loc, AAResults &AA)
 
static ScalarizationResult canScalarizeAccess (FixedVectorType *VecTy, Value *Idx, Instruction *CtxI, AssumptionCache &AC, const DominatorTree &DT)
 Check if it is legal to scalarize a memory access to VecTy at index Idx.
 
static Align computeAlignmentAfterScalarization (Align VectorAlignment, Type *ScalarType, Value *Idx, const DataLayout &DL)
 The memory operation on a vector of ScalarType had alignment of VectorAlignment.
 

Variables

static cl::opt< boolDisableVectorCombine ("disable-vector-combine", cl::init(false), cl::Hidden, cl::desc("Disable all vector combine transforms"))
 
static cl::opt< boolDisableBinopExtractShuffle ("disable-binop-extract-shuffle", cl::init(false), cl::Hidden, cl::desc("Disable binop extract to shuffle transforms"))
 
static cl::opt< unsignedMaxInstrsToScan ("vector-combine-max-scan-instrs", cl::init(30), cl::Hidden, cl::desc("Max number of instructions to scan for vector combining."))
 
static const unsigned InvalidIndex = std::numeric_limits<unsigned>::max()
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "vector-combine"

Definition at line 32 of file VectorCombine.cpp.

Function Documentation

◆ canScalarizeAccess()

static ScalarizationResult canScalarizeAccess ( FixedVectorType VecTy,
Value Idx,
Instruction CtxI,
AssumptionCache AC,
const DominatorTree DT 
)
static

◆ canWidenLoad()

static bool canWidenLoad ( LoadInst Load,
const TargetTransformInfo TTI 
)
static

◆ computeAlignmentAfterScalarization()

static Align computeAlignmentAfterScalarization ( Align  VectorAlignment,
Type ScalarType,
Value Idx,
const DataLayout DL 
)
static

The memory operation on a vector of ScalarType had alignment of VectorAlignment.

Compute the maximal, but conservatively correct, alignment that will be valid for the memory operation on a single scalar element of the same type with index Idx.

Definition at line 1058 of file VectorCombine.cpp.

References llvm::CallingConv::C, llvm::commonAlignment(), DL, and Idx.

◆ createShiftShuffle()

static Value * createShiftShuffle ( Value Vec,
unsigned  OldIndex,
unsigned  NewIndex,
IRBuilder<> &  Builder 
)
static

Create a shuffle that translates (shifts) 1 element from the input vector to a new element location.

Definition at line 477 of file VectorCombine.cpp.

References Builder, llvm::Value::getType(), and llvm::PoisonMaskElem.

Referenced by translateExtract().

◆ isMemModifiedBetween()

static bool isMemModifiedBetween ( BasicBlock::iterator  Begin,
BasicBlock::iterator  End,
const MemoryLocation Loc,
AAResults AA 
)
static

◆ STATISTIC() [1/7]

STATISTIC ( NumScalarBO  ,
"Number of scalar binops formed"   
)

◆ STATISTIC() [2/7]

STATISTIC ( NumScalarCmp  ,
"Number of scalar compares formed"   
)

◆ STATISTIC() [3/7]

STATISTIC ( NumShufOfBitcast  ,
"Number of shuffles moved after bitcast"   
)

◆ STATISTIC() [4/7]

STATISTIC ( NumVecBO  ,
"Number of vector binops formed"   
)

◆ STATISTIC() [5/7]

STATISTIC ( NumVecCmp  ,
"Number of vector compares formed"   
)

◆ STATISTIC() [6/7]

STATISTIC ( NumVecCmpBO  ,
"Number of vector compare + binop formed"   
)

◆ STATISTIC() [7/7]

STATISTIC ( NumVecLoad  ,
"Number of vector loads formed"   
)

◆ translateExtract()

static ExtractElementInst * translateExtract ( ExtractElementInst ExtElt,
unsigned  NewIndex,
IRBuilder<> &  Builder 
)
static

Given an extract element instruction with constant index operand, shuffle the source vector (shift the scalar element) to a NewIndex for extraction.

Return null if the input can be constant folded, so that we are not creating unnecessary instructions.

Definition at line 492 of file VectorCombine.cpp.

References assert(), Builder, llvm::CallingConv::C, createShiftShuffle(), llvm::ExtractElementInst::getIndexOperand(), llvm::User::getOperand(), llvm::Value::getType(), llvm::ExtractElementInst::getVectorOperand(), and X.

Variable Documentation

◆ DisableBinopExtractShuffle

cl::opt< bool > DisableBinopExtractShuffle("disable-binop-extract-shuffle", cl::init(false), cl::Hidden, cl::desc("Disable binop extract to shuffle transforms")) ( "disable-binop-extract-shuffle"  ,
cl::init(false)  ,
cl::Hidden  ,
cl::desc("Disable binop extract to shuffle transforms")   
)
static

◆ DisableVectorCombine

cl::opt< bool > DisableVectorCombine("disable-vector-combine", cl::init(false), cl::Hidden, cl::desc("Disable all vector combine transforms")) ( "disable-vector-combine"  ,
cl::init(false)  ,
cl::Hidden  ,
cl::desc("Disable all vector combine transforms")   
)
static

◆ InvalidIndex

const unsigned InvalidIndex = std::numeric_limits<unsigned>::max()
static

Definition at line 58 of file VectorCombine.cpp.

◆ MaxInstrsToScan

cl::opt< unsigned > MaxInstrsToScan("vector-combine-max-scan-instrs", cl::init(30), cl::Hidden, cl::desc("Max number of instructions to scan for vector combining.")) ( "vector-combine-max-scan-instrs"  ,
cl::init(30)  ,
cl::Hidden  ,
cl::desc("Max number of instructions to scan for vector combining.")   
)
static

Referenced by isMemModifiedBetween().