13#ifndef LLVM_LIB_TARGET_SPIRV_SPIRVUTILS_H
14#define LLVM_LIB_TARGET_SPIRV_SPIRVUTILS_H
25#include <unordered_map>
26#include <unordered_set>
32class MachineInstrBuilder;
33class MachineIRBuilder;
34class MachineRegisterInfo;
39class SPIRVGlobalRegistry;
73 std::unordered_set<BasicBlock *> Queued = {};
74 std::queue<BasicBlock *> ToVisit = {};
78 size_t TraversalIndex;
81 using BlockToOrderInfoMap = std::unordered_map<BasicBlock *, OrderInfo>;
82 BlockToOrderInfoMap BlockToOrder;
83 std::vector<BasicBlock *> Order = {};
86 std::unordered_set<BasicBlock *> getReachableFrom(
BasicBlock *Start);
122 std::vector<Value *> &Args);
143 SPIRV::Decoration::Decoration Dec,
144 const std::vector<uint32_t> &DecArgs,
147 SPIRV::Decoration::Decoration Dec,
148 const std::vector<uint32_t> &DecArgs,
153 SPIRV::Decoration::Decoration Dec,
uint32_t Member,
154 const std::vector<uint32_t> &DecArgs,
158 SPIRV::Decoration::Decoration Dec,
uint32_t Member,
159 const std::vector<uint32_t> &DecArgs,
178 case SPIRV::StorageClass::Workgroup:
179 case SPIRV::StorageClass::CrossWorkgroup:
180 case SPIRV::StorageClass::Function:
193 case SPIRV::StorageClass::Function:
195 case SPIRV::StorageClass::CrossWorkgroup:
197 case SPIRV::StorageClass::UniformConstant:
199 case SPIRV::StorageClass::Workgroup:
201 case SPIRV::StorageClass::Generic:
203 case SPIRV::StorageClass::DeviceOnlyINTEL:
205 case SPIRV::StorageClass::HostOnlyINTEL:
207 case SPIRV::StorageClass::Input:
209 case SPIRV::StorageClass::Output:
211 case SPIRV::StorageClass::CodeSectionINTEL:
213 case SPIRV::StorageClass::Private:
215 case SPIRV::StorageClass::StorageBuffer:
217 case SPIRV::StorageClass::Uniform:
225SPIRV::StorageClass::StorageClass
228SPIRV::MemorySemantics::MemorySemantics
239 const MachineRegisterInfo *
MRI);
295 Type *SubT =
T->getScalarType();
297 ? cast<PointerType>(SubT)->getAddressSpace()
298 : cast<TypedPointerType>(SubT)->getAddressSpace();
319 for (
unsigned i = 0; i <
F->arg_size(); ++i)
324#define TYPED_PTR_TARGET_EXT_NAME "spirv.$TypedPointerType"
338 if (
auto *ExtTy = dyn_cast<TargetExtType>(Ty))
344 if (
auto *ExtTy = dyn_cast<TargetExtType>(Ty)) {
347 ExtTy->getIntParameter(0));
348 }
else if (
auto *VecTy = dyn_cast<VectorType>(Ty)) {
349 Type *ElemTy = VecTy->getElementType();
351 if (NewElemTy != ElemTy)
359 if (
auto PType = dyn_cast<TypedPointerType>(Ty))
360 return PType->getElementType();
361 else if (
auto *ExtTy = dyn_cast<TargetExtType>(Ty))
363 return ExtTy->getTypeParameter(0);
371 if (
auto *ExtTy = dyn_cast<TargetExtType>(Ty2))
373 ExtTy->getTypeParameter(0) ==
375 ExtTy->getIntParameter(0) == cast<PointerType>(Ty1)->getAddressSpace())
397 bool IsUntypedPtr =
false;
404 if (!IsUntypedPtr &&
RetTy == OrigRetTy)
413 if (
auto FTy = dyn_cast<FunctionType>(Ty))
419 auto *FVTy = dyn_cast<FixedVectorType>(Ty);
420 return FVTy && FVTy->getNumElements() == 1;
427 auto *FVTy = dyn_cast<FixedVectorType>(Ty);
428 if (!FVTy || FVTy->getNumElements() != 1)
447 Value *Arg, Value *Arg2, ArrayRef<Constant *> Imms,
452#define SPIRV_BACKEND_SERVICE_FUN_NAME "__spirv_backend_service_fun"
456 MachineIRBuilder &MIRBuilder,
457 SPIRV::AccessQualifier::AccessQualifier AccessQual,
458 bool EmitIR,
bool Force =
false);
471 SPIRV::AccessQualifier::AccessQualifier AccessQual,
bool EmitIR);
479 static std::unordered_map<std::string, FPDecorationId> Mapping = {
485 auto It = Mapping.find(S);
489SmallVector<MachineInstr *, 4>
491 unsigned MinWC,
unsigned ContinuedOpcode,
492 ArrayRef<Register> Args, Register ReturnRegister,
503MachineInstr *
passCopy(MachineInstr *Def,
const MachineRegisterInfo *
MRI);
504MachineInstr *
getDef(
const MachineOperand &MO,
const MachineRegisterInfo *
MRI);
505MachineInstr *
getImm(
const MachineOperand &MO,
const MachineRegisterInfo *
MRI);
506int64_t
foldImm(
const MachineOperand &MO,
const MachineRegisterInfo *
MRI);
508 const MachineInstr *ResType);
unsigned const MachineRegisterInfo * MRI
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
Promote Memory to Register
#define TYPED_PTR_TARGET_EXT_NAME
Class for arbitrary precision integers.
This class represents an incoming formal argument to a Function.
LLVM_ABI Type * getParamByRefType() const
If this is a byref argument, return its type.
LLVM_ABI bool hasByRefAttr() const
Return true if this argument has the byref attribute.
LLVM_ABI Type * getParamStructRetType() const
If this is an sret argument, return its type.
LLVM_ABI bool hasByValAttr() const
Return true if this argument has the byval attribute.
LLVM_ABI Type * getParamByValType() const
If this is a byval argument, return its type.
LLVM_ABI bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
LLVM Basic Block Representation.
This class represents an Operation in the Expression.
Core dominator tree base class.
Class to represent function types.
ArrayRef< Type * > params() const
Type * getReturnType() const
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
This is an important class for using LLVM in a threaded context.
Instances of this class represent a single low-level machine instruction.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
MachineInstrBundleIterator< MachineInstr > iterator
Helper class to build MachineInstr.
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
size_t GetNodeRank(BasicBlock *BB) const
void partialOrderVisit(BasicBlock &Start, std::function< bool(BasicBlock *)> Op)
bool compare(const BasicBlock *LHS, const BasicBlock *RHS) const
In order to facilitate speculative execution, many instructions do not invoke immediate undefined beh...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
unsigned getNumIntParameters() const
static LLVM_ABI TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters.
unsigned getNumTypeParameters() const
StringRef getName() const
Return the name for this target extension type.
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
@ TypedPointerTyID
Typed pointer used by some GPU targets.
bool isTargetExtTy() const
Return true if this is a target extension type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
TypeID getTypeID() const
Return the type id for the type.
static LLVM_ABI TypedPointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
LLVM Value Representation.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
This is an optimization pass for GlobalISel generic memory operations.
void buildOpName(Register Target, const StringRef &Name, MachineIRBuilder &MIRBuilder)
bool getVacantFunctionName(Module &M, std::string &Name)
std::string getStringImm(const MachineInstr &MI, unsigned StartIndex)
bool isTypedPointerWrapper(const TargetExtType *ExtTy)
bool isTypeFoldingSupported(unsigned Opcode)
unsigned getPointerAddressSpace(const Type *T)
MachineInstr * getDef(const MachineOperand &MO, const MachineRegisterInfo *MRI)
void addNumImm(const APInt &Imm, MachineInstrBuilder &MIB)
FPDecorationId demangledPostfixToDecorationId(const std::string &S)
CallInst * buildIntrWithMD(Intrinsic::ID IntrID, ArrayRef< Type * > Types, Value *Arg, Value *Arg2, ArrayRef< Constant * > Imms, IRBuilder<> &B)
unsigned getArrayComponentCount(const MachineRegisterInfo *MRI, const MachineInstr *ResType)
bool sortBlocks(Function &F)
Type * toTypedFunPointer(FunctionType *FTy)
SmallVector< unsigned, 1 > getSpirvLoopControlOperandsFromLoopMetadata(Loop *L)
uint64_t getIConstVal(Register ConstReg, const MachineRegisterInfo *MRI)
SmallVector< MachineInstr *, 4 > createContinuedInstructions(MachineIRBuilder &MIRBuilder, unsigned Opcode, unsigned MinWC, unsigned ContinuedOpcode, ArrayRef< Register > Args, Register ReturnRegister, Register TypeID)
SPIRV::MemorySemantics::MemorySemantics getMemSemanticsForStorageClass(SPIRV::StorageClass::StorageClass SC)
constexpr unsigned storageClassToAddressSpace(SPIRV::StorageClass::StorageClass SC)
MachineBasicBlock::iterator getFirstValidInstructionInsertPoint(MachineBasicBlock &BB)
bool isNestedPointer(const Type *Ty)
MetadataAsValue * buildMD(Value *Arg)
std::string getOclOrSpirvBuiltinDemangledName(StringRef Name)
bool isTypedPointerTy(const Type *T)
bool isUntypedEquivalentToTyExt(Type *Ty1, Type *Ty2)
void buildOpDecorate(Register Reg, MachineIRBuilder &MIRBuilder, SPIRV::Decoration::Decoration Dec, const std::vector< uint32_t > &DecArgs, StringRef StrImm)
MachineBasicBlock::iterator getOpVariableMBBIt(MachineInstr &I)
Register createVirtualRegister(SPIRVType *SpvType, SPIRVGlobalRegistry *GR, MachineRegisterInfo *MRI, const MachineFunction &MF)
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
Type * getTypedPointerWrapper(Type *ElemTy, unsigned AS)
Type * reconstructFunctionType(Function *F)
void buildOpMemberDecorate(Register Reg, MachineIRBuilder &MIRBuilder, SPIRV::Decoration::Decoration Dec, uint32_t Member, const std::vector< uint32_t > &DecArgs, StringRef StrImm)
Type * toTypedPointer(Type *Ty)
bool isSpecialOpaqueType(const Type *Ty)
void setRegClassType(Register Reg, SPIRVType *SpvType, SPIRVGlobalRegistry *GR, MachineRegisterInfo *MRI, const MachineFunction &MF, bool Force)
bool isPointerTy(const Type *T)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
MachineBasicBlock::iterator getInsertPtValidEnd(MachineBasicBlock *MBB)
const Type * unifyPtrType(const Type *Ty)
constexpr bool isGenericCastablePtr(SPIRV::StorageClass::StorageClass SC)
MachineInstr * passCopy(MachineInstr *Def, const MachineRegisterInfo *MRI)
bool isEntryPoint(const Function &F)
const std::set< unsigned > & getTypeFoldingSupportedOpcodes()
SPIRV::StorageClass::StorageClass addressSpaceToStorageClass(unsigned AddrSpace, const SPIRVSubtarget &STI)
AtomicOrdering
Atomic ordering for LLVM's memory model.
SPIRV::Scope::Scope getMemScope(LLVMContext &Ctx, SyncScope::ID Id)
std::string getStringValueFromReg(Register Reg, MachineRegisterInfo &MRI)
int64_t foldImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
Type * parseBasicTypeName(StringRef &TypeName, LLVMContext &Ctx)
Type * getPointeeTypeByAttr(Argument *Arg)
bool hasPointeeTypeAttr(Argument *Arg)
MachineInstr * getDefInstrMaybeConstant(Register &ConstReg, const MachineRegisterInfo *MRI)
bool isEquivalentTypes(Type *Ty1, Type *Ty2)
bool hasBuiltinTypePrefix(StringRef Name)
Type * getMDOperandAsType(const MDNode *N, unsigned I)
bool hasInitializer(const GlobalVariable *GV)
Type * applyWrappers(Type *Ty)
Type * normalizeType(Type *Ty)
bool isPointerTyOrWrapper(const Type *Ty)
bool isSpvIntrinsic(const MachineInstr &MI, Intrinsic::ID IntrinsicID)
Type * getPointeeType(const Type *Ty)
PoisonValue * getNormalizedPoisonValue(Type *Ty)
void addStringImm(const StringRef &Str, MCInst &Inst)
MachineInstr * getVRegDef(MachineRegisterInfo &MRI, Register Reg)
void buildOpSpirvDecorations(Register Reg, MachineIRBuilder &MIRBuilder, const MDNode *GVarMD)
bool isUntypedPointerTy(const Type *T)
SPIRV::MemorySemantics::MemorySemantics getMemSemantics(AtomicOrdering Ord)