LLVM 22.0.0git
|
This file contains implementations for different VPlan recipes. More...
#include "LoopVectorizationPlanner.h"
#include "VPlan.h"
#include "VPlanAnalysis.h"
#include "VPlanHelpers.h"
#include "VPlanPatternMatch.h"
#include "VPlanUtils.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/IVDescriptors.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
#include "llvm/Transforms/Utils/LoopVersioning.h"
#include <cassert>
Go to the source code of this file.
Namespaces | |
namespace | llvm |
This is an optimization pass for GlobalISel generic memory operations. |
Macros | |
#define | LV_NAME "loop-vectorize" |
#define | DEBUG_TYPE LV_NAME |
Typedefs | |
using | VectorParts = SmallVector<Value *, 2> |
Functions | |
static BranchInst * | createCondBranch (Value *Cond, VPBasicBlock *VPBB, VPTransformState &State) |
Create a conditional branch using Cond branching to the successors of VPBB . | |
static InstructionCost | getCostForIntrinsics (Intrinsic::ID ID, ArrayRef< const VPValue * > Operands, const VPRecipeWithIRFlags &R, ElementCount VF, VPCostContext &Ctx) |
Compute the cost for the intrinsic ID with Operands , produced by R . | |
static Constant * | getSignedIntOrFpConstant (Type *Ty, int64_t C) |
A helper function that returns an integer or floating-point constant with value C. | |
static Type * | getGEPIndexTy (bool IsScalable, bool IsReverse, bool IsUnitStride, unsigned CurrentPart, IRBuilderBase &Builder) |
static void | scalarizeInstruction (const Instruction *Instr, VPReplicateRecipe *RepRecipe, const VPLane &Lane, VPTransformState &State) |
A helper function to scalarize a single Instruction in the innermost loop. | |
static bool | shouldUseAddressAccessSCEV (const VPValue *Ptr) |
Returns true if Ptr is a pointer computation for which the legacy cost model computes a SCEV expression when computing the address cost. | |
static bool | isUsedByLoadStoreAddress (const VPUser *V) |
Returns true if V is used as part of the address of another load or store. | |
static Instruction * | createReverseEVL (IRBuilderBase &Builder, Value *Operand, Value *EVL, const Twine &Name) |
Use all-true mask for reverse rather than actual mask, as it avoids a dependence w/o affecting the result. | |
static Value * | createBitOrPointerCast (IRBuilderBase &Builder, Value *V, VectorType *DstVTy, const DataLayout &DL) |
static Value * | interleaveVectors (IRBuilderBase &Builder, ArrayRef< Value * > Vals, const Twine &Name) |
Return a vector containing interleaved elements from multiple smaller input vectors. |
This file contains implementations for different VPlan recipes.
Definition in file VPlanRecipes.cpp.
#define DEBUG_TYPE LV_NAME |
Definition at line 47 of file VPlanRecipes.cpp.
#define LV_NAME "loop-vectorize" |
Definition at line 46 of file VPlanRecipes.cpp.
using VectorParts = SmallVector<Value *, 2> |
Definition at line 44 of file VPlanRecipes.cpp.
|
static |
Definition at line 3698 of file VPlanRecipes.cpp.
References assert(), llvm::cast(), DL, llvm::VectorType::get(), llvm::Type::getIntNTy(), llvm::CastInst::isBitOrNoopPointerCastable(), llvm::Type::isFloatingPointTy(), and llvm::Type::isPointerTy().
Referenced by llvm::VPInterleaveEVLRecipe::execute(), and llvm::VPInterleaveRecipe::execute().
|
static |
Create a conditional branch using Cond
branching to the successors of VPBB
.
Note that the first successor is always forward (i.e. not created yet) while the second successor may already have been created (if it is a header block and VPBB is a latch).
Definition at line 571 of file VPlanRecipes.cpp.
References llvm::cast(), Cond, llvm::Instruction::eraseFromParent(), llvm::VPBlockBase::getSuccessors(), llvm::BasicBlock::getTerminator(), and llvm::BranchInst::setSuccessor().
|
static |
Use all-true mask for reverse rather than actual mask, as it avoids a dependence w/o affecting the result.
Definition at line 3511 of file VPlanRecipes.cpp.
References llvm::cast(), and llvm::Value::getType().
Referenced by llvm::VPWidenLoadEVLRecipe::execute(), and llvm::VPWidenStoreEVLRecipe::execute().
|
static |
Compute the cost for the intrinsic ID
with Operands
, produced by R
.
Definition at line 1748 of file VPlanRecipes.cpp.
References Arguments, llvm::dyn_cast_or_null(), llvm::enumerate(), llvm::InstructionCost::getInvalid(), llvm::ElementCount::isVector(), Operands, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::toVectorizedTy(), and llvm::toVectorTy().
Referenced by llvm::VPReplicateRecipe::computeCost(), and llvm::VPWidenIntrinsicRecipe::computeCost().
|
static |
Definition at line 2533 of file VPlanRecipes.cpp.
References DL.
Referenced by llvm::VPVectorEndPointerRecipe::execute(), and llvm::VPVectorPointerRecipe::execute().
A helper function that returns an integer or floating-point constant with value C.
Definition at line 2313 of file VPlanRecipes.cpp.
References llvm::CallingConv::C, and llvm::ConstantInt::getSigned().
Referenced by llvm::VPScalarIVStepsRecipe::execute().
|
static |
Return a vector containing interleaved elements from multiple smaller input vectors.
Definition at line 3730 of file VPlanRecipes.cpp.
References assert(), llvm::cast(), llvm::concatenateVectors(), llvm::createInterleaveMask(), getType(), and llvm::ArrayRef< T >::size().
Referenced by llvm::VPInterleaveEVLRecipe::execute(), and llvm::VPInterleaveRecipe::execute().
Returns true if V
is used as part of the address of another load or store.
Definition at line 3095 of file VPlanRecipes.cpp.
References llvm::append_range(), llvm::cast(), llvm::dyn_cast(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), and users.
Referenced by llvm::VPReplicateRecipe::computeCost().
|
static |
A helper function to scalarize a single Instruction in the innermost loop.
Generates a sequence of scalar instances for lane Lane
. Uses the VPValue operands from RepRecipe
instead of Instr's
operands.
Definition at line 2979 of file VPlanRecipes.cpp.
References llvm::all_of(), llvm::VPIRFlags::applyFlags(), llvm::VPIRMetadata::applyMetadata(), assert(), llvm::canVectorizeTy(), llvm::cast(), DL, llvm::dyn_cast(), llvm::enumerate(), llvm::VPRecipeBase::getDebugLoc(), llvm::VPLane::getFirstLane(), llvm::VPBlockBase::getParent(), llvm::VPRecipeBase::getParent(), llvm::VPBlockBase::getPlan(), llvm::VPIRFlags::getPredicate(), llvm::Value::getType(), llvm::VPlan::getVectorLoopRegion(), llvm::VPIRFlags::hasPredicate(), I, II, llvm::vputils::isSingleScalar(), llvm::Value::mutateType(), llvm::VPUser::operands(), llvm::Value::setName(), and llvm::User::setOperand().
Referenced by llvm::VPReplicateRecipe::execute().
Returns true if Ptr
is a pointer computation for which the legacy cost model computes a SCEV expression when computing the address cost.
Definition at line 3074 of file VPlanRecipes.cpp.
References llvm::cast(), llvm::drop_begin(), getOpcode(), llvm::isa(), and Ptr.
Referenced by llvm::VPReplicateRecipe::computeCost().