LLVM 20.0.0git
Macros | Typedefs | Functions | Variables
VectorCombine.cpp File Reference
#include "llvm/Transforms/Vectorize/VectorCombine.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/ScopeExit.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 "llvm/Transforms/Utils/LoopUtils.h"
#include <numeric>
#include <queue>
#include "llvm/Transforms/Utils/InstructionWorklist.h"

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "vector-combine"
 

Typedefs

using InstLane = std::pair< Use *, int >
 

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 ValuepeekThroughBitcasts (Value *V)
 Return the source operand of a potentially bitcasted value.
 
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 (VectorType *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.
 
static InstLane lookThroughShuffles (Use *U, int Lane)
 
static SmallVector< InstLanegenerateInstLaneVectorFromOperand (ArrayRef< InstLane > Item, int Op)
 
static bool isFreeConcat (ArrayRef< InstLane > Item, const TargetTransformInfo &TTI)
 Detect concat of multiple values into a vector.
 
static ValuegenerateNewInstTree (ArrayRef< InstLane > Item, FixedVectorType *Ty, const SmallPtrSet< Use *, 4 > &IdentityLeafs, const SmallPtrSet< Use *, 4 > &SplatLeafs, const SmallPtrSet< Use *, 4 > &ConcatLeafs, IRBuilder<> &Builder)
 

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 37 of file VectorCombine.cpp.

Typedef Documentation

◆ InstLane

using InstLane = std::pair<Use *, int>

Definition at line 1676 of file VectorCombine.cpp.

Function Documentation

◆ canScalarizeAccess()

static ScalarizationResult canScalarizeAccess ( VectorType 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 1237 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 494 of file VectorCombine.cpp.

References llvm::IRBuilderBase::CreateShuffleVector(), llvm::Value::getType(), and llvm::PoisonMaskElem.

Referenced by translateExtract().

◆ generateInstLaneVectorFromOperand()

static SmallVector< InstLane > generateInstLaneVectorFromOperand ( ArrayRef< InstLane Item,
int  Op 
)
static

◆ generateNewInstTree()

static Value * generateNewInstTree ( ArrayRef< InstLane Item,
FixedVectorType Ty,
const SmallPtrSet< Use *, 4 > &  IdentityLeafs,
const SmallPtrSet< Use *, 4 > &  SplatLeafs,
const SmallPtrSet< Use *, 4 > &  ConcatLeafs,
IRBuilder<> &  Builder 
)
static

◆ isFreeConcat()

static bool isFreeConcat ( ArrayRef< InstLane Item,
const TargetTransformInfo TTI 
)
static

◆ isMemModifiedBetween()

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

◆ lookThroughShuffles()

static InstLane lookThroughShuffles ( Use U,
int  Lane 
)
static

Definition at line 1678 of file VectorCombine.cpp.

References llvm::PoisonMaskElem.

Referenced by generateInstLaneVectorFromOperand().

◆ peekThroughBitcasts()

static Value * peekThroughBitcasts ( Value V)
static

Return the source operand of a potentially bitcasted value.

If there is no bitcast, return the input value itself.

Definition at line 144 of file VectorCombine.cpp.

◆ 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 509 of file VectorCombine.cpp.

References assert(), llvm::CallingConv::C, llvm::IRBuilderBase::CreateExtractElement(), 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 63 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().