18#include "llvm/IR/IntrinsicsNVPTX.h"
24#define Check(C, ...) \
27 VS.CheckFailed(__VA_ARGS__); \
37 unsigned NumRegisters;
41struct SPOperandLayout {
42 unsigned MetadataSize;
43 unsigned CompressedDataSize;
54 return ElemSize == 8 || ElemSize == 16;
58 return IdxSize == 2 || IdxSize == 4;
68 return NumTgt == 2 || NumTgt == 4 || NumTgt == 8 || NumTgt == 16;
70 return NumTgt == 4 || NumTgt == 8 || NumTgt == 16;
72 return NumTgt == 8 || NumTgt == 16;
78static std::optional<SPOperandLayout>
80 unsigned RepeatFactor) {
85 SPOperandLayout Layout = {
divideCeil(RepeatFactor * IdxSize, ElemSize),
86 RepeatFactor, RepeatFactor * 2};
87 if (Layout.MetadataSize + Layout.CompressedDataSize + Layout.DataSize >
93static std::optional<SPOperandLayout>
95 unsigned IdxSize,
unsigned RepeatFactor) {
99 (IdxSize == 2 && NumTgt > 4))
102 unsigned DataBits = NumTgt * ElemSize * RepeatFactor;
103 if (DataBits < 32 || DataBits > 4096)
106 SPOperandLayout Layout = {
divideCeil(NumSrc * IdxSize * RepeatFactor, 32),
107 divideCeil(NumSrc * ElemSize * RepeatFactor, 32),
109 if (Layout.MetadataSize + Layout.CompressedDataSize + Layout.DataSize >
122 unsigned ElemSize =
ElemTy->getBitWidth();
123 if (ElemSize != 8 && ElemSize != 16)
125 unsigned NumElements = VT->getNumElements();
126 return SPVectorInfo{ElemSize, NumElements,
131 if (Ty->isIntegerTy(32))
134 if (!VT || !VT->getElementType()->isIntegerTy(32) || VT->getNumElements() < 2)
136 return VT->getNumElements();
141 Check(ResultTy && ResultTy->getNumElements() == 2,
142 "invalid llvm.nvvm.spcompress result type", &
Call);
147 Check(MDataRegs && CData &&
Data && CData->ElemSize ==
Data->ElemSize,
148 "invalid llvm.nvvm.spcompress operand or result type", &
Call);
155 Check(NumTgt == 4 &&
Data->NumElements % NumTgt == 0 &&
156 CData->NumElements == 2 * (
Data->NumElements / NumTgt) &&
157 Data->NumRegisters % 2 == 0,
158 "invalid llvm.nvvm.spcompress layout", &
Call);
160 unsigned RepeatFactor =
Data->NumRegisters / 2;
164 Check(Layout && *MDataRegs == Layout->MetadataSize &&
165 CData->NumRegisters == Layout->CompressedDataSize &&
166 Data->NumRegisters == Layout->DataSize,
167 "invalid llvm.nvvm.spcompress layout", &
Call);
174 Check(
Data && MDataRegs && CData &&
Data->ElemSize == CData->ElemSize,
175 "invalid llvm.nvvm.spdecompress operand or result type", &
Call);
180 Check(NumTgt != 0 &&
Data->NumElements % NumTgt == 0,
181 "invalid llvm.nvvm.spdecompress layout", &
Call);
183 unsigned RepeatFactor =
Data->NumElements / NumTgt;
185 Check(RepeatFactor != 0 && CData->NumElements % RepeatFactor == 0,
186 "invalid llvm.nvvm.spdecompress layout", &
Call);
188 unsigned NumSrc = CData->NumElements / RepeatFactor;
193 Check(Layout && *MDataRegs == Layout->MetadataSize &&
194 CData->NumRegisters == Layout->CompressedDataSize &&
195 Data->NumRegisters == Layout->DataSize,
196 "invalid llvm.nvvm.spdecompress layout", &
Call);
204 case Intrinsic::nvvm_spcompress:
207 case Intrinsic::nvvm_spdecompress:
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static std::optional< SPOperandLayout > getSPCompressLayout(unsigned ElemSize, unsigned IdxSize, unsigned RepeatFactor)
static std::optional< unsigned > getSPMetadataRegisters(Type *Ty)
constexpr unsigned MaxSPOperandRegisters
static std::optional< SPOperandLayout > getSPDecompressLayout(unsigned NumSrc, unsigned NumTgt, unsigned ElemSize, unsigned IdxSize, unsigned RepeatFactor)
static bool isValidSPRepeatFactor(unsigned RepeatFactor)
static bool isValidSPIdxSize(unsigned IdxSize)
static bool isValidSPDecompressFactor(unsigned NumSrc, unsigned NumTgt)
static std::optional< SPVectorInfo > getSPVectorInfo(Type *Ty)
static void verifySPCompress(VerifierSupport &VS, CallBase &Call)
static bool isValidSPElemSize(unsigned ElemSize)
static void verifySPDecompress(VerifierSupport &VS, CallBase &Call)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
The instances of the Type class are immutable: once they are created, they are never changed.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void verifyNVVMIntrinsicCall(VerifierSupport &VS, Intrinsic::ID ID, CallBase &Call)