LLVM 17.0.0git
|
#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 Value * | createShiftShuffle (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 ExtractElementInst * | translateExtract (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< bool > | DisableVectorCombine ("disable-vector-combine", cl::init(false), cl::Hidden, cl::desc("Disable all vector combine transforms")) |
static cl::opt< bool > | DisableBinopExtractShuffle ("disable-binop-extract-shuffle", cl::init(false), cl::Hidden, cl::desc("Disable binop extract to shuffle transforms")) |
static 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.")) |
static const unsigned | InvalidIndex = std::numeric_limits<unsigned>::max() |
#define DEBUG_TYPE "vector-combine" |
Definition at line 32 of file VectorCombine.cpp.
|
static |
Check if it is legal to scalarize a memory access to VecTy
at index Idx
.
Idx
must access a valid vector element.
Definition at line 1016 of file VectorCombine.cpp.
References llvm::ConstantRange::binaryAnd(), llvm::CallingConv::C, llvm::computeConstantRange(), llvm::ConstantRange::contains(), llvm::FixedVectorType::getNumElements(), llvm::ConstantInt::getValue(), Idx, llvm::isGuaranteedNotToBePoison(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and llvm::ConstantRange::urem().
|
static |
Definition at line 131 of file VectorCombine.cpp.
References llvm::TargetTransformInfo::getMinVectorRegisterBitWidth(), llvm::Type::getPrimitiveSizeInBits(), and llvm::mustSuppressSpeculation().
|
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.
|
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().
|
static |
Definition at line 947 of file VectorCombine.cpp.
References End, llvm::AAResults::getModRefInfo(), llvm::isModSet(), and MaxInstrsToScan.
STATISTIC | ( | NumScalarBO | , |
"Number of scalar binops formed" | |||
) |
STATISTIC | ( | NumScalarCmp | , |
"Number of scalar compares formed" | |||
) |
STATISTIC | ( | NumShufOfBitcast | , |
"Number of shuffles moved after bitcast" | |||
) |
STATISTIC | ( | NumVecBO | , |
"Number of vector binops formed" | |||
) |
STATISTIC | ( | NumVecCmp | , |
"Number of vector compares formed" | |||
) |
STATISTIC | ( | NumVecCmpBO | , |
"Number of vector compare + binop formed" | |||
) |
STATISTIC | ( | NumVecLoad | , |
"Number of vector loads formed" | |||
) |
|
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.
|
static |
|
static |
Definition at line 58 of file VectorCombine.cpp.
|
static |
Referenced by isMemModifiedBetween().