[mlir][LLVM] Switch undef for poison for uninitialized values (#125629)
LLVM itself is generally moving away from using `undef` and towards
using `poison`, to the point of having a lint that caches new uses of
`undef` in tests.
In order to not trip the lint on new patterns and to conform to the
evolution of LLVM
- Rename valious ::undef() methods on StructBuilder subclasses to
::poison()
- Audit the uses of UndefOp in the MLIR libraries and replace almost all
of them with PoisonOp
The remaining uses of `undef` are initializing `uninitialized` memrefs,
explicit conversions to undef from SPIR-V, and a few cases in
AMDGPUToROCDL where usage like
%v = insertelement <M x iN> undef, iN %v, i32 0
%arg = bitcast <M x iN> %v to i(M * N)
is used to handle "i32" arguments that are are really packed vectors of
smaller types that won't always be fully initialized.
This commit is contained in:
committed by
GitHub
parent
e41ffd3420
commit
f4e3b8783c
@@ -24,8 +24,8 @@ public:
|
||||
/// Construct a helper for the given complex number value.
|
||||
using StructBuilder::StructBuilder;
|
||||
/// Build IR creating an `undef` value of the complex number type.
|
||||
static ComplexStructBuilder undef(OpBuilder &builder, Location loc,
|
||||
Type type);
|
||||
static ComplexStructBuilder poison(OpBuilder &builder, Location loc,
|
||||
Type type);
|
||||
|
||||
// Build IR extracting the real value from the complex number struct.
|
||||
Value real(OpBuilder &builder, Location loc);
|
||||
|
||||
@@ -34,9 +34,9 @@ class MemRefDescriptor : public StructBuilder {
|
||||
public:
|
||||
/// Construct a helper for the given descriptor value.
|
||||
explicit MemRefDescriptor(Value descriptor);
|
||||
/// Builds IR creating an `undef` value of the descriptor type.
|
||||
static MemRefDescriptor undef(OpBuilder &builder, Location loc,
|
||||
Type descriptorType);
|
||||
/// Builds IR creating a `poison` value of the descriptor type.
|
||||
static MemRefDescriptor poison(OpBuilder &builder, Location loc,
|
||||
Type descriptorType);
|
||||
/// Builds IR creating a MemRef descriptor that represents `type` and
|
||||
/// populates it with static shape and stride information extracted from the
|
||||
/// type.
|
||||
@@ -160,8 +160,8 @@ public:
|
||||
/// Construct a helper for the given descriptor value.
|
||||
explicit UnrankedMemRefDescriptor(Value descriptor);
|
||||
/// Builds IR creating an `undef` value of the descriptor type.
|
||||
static UnrankedMemRefDescriptor undef(OpBuilder &builder, Location loc,
|
||||
Type descriptorType);
|
||||
static UnrankedMemRefDescriptor poison(OpBuilder &builder, Location loc,
|
||||
Type descriptorType);
|
||||
|
||||
/// Builds IR extracting the rank from the descriptor
|
||||
Value rank(OpBuilder &builder, Location loc) const;
|
||||
|
||||
@@ -27,9 +27,9 @@ class StructBuilder {
|
||||
public:
|
||||
/// Construct a helper for the given value.
|
||||
explicit StructBuilder(Value v);
|
||||
/// Builds IR creating an `undef` value of the descriptor type.
|
||||
static StructBuilder undef(OpBuilder &builder, Location loc,
|
||||
Type descriptorType);
|
||||
/// Builds IR creating a `poison` value of the descriptor type.
|
||||
static StructBuilder poison(OpBuilder &builder, Location loc,
|
||||
Type descriptorType);
|
||||
|
||||
/*implicit*/ operator Value() { return value; }
|
||||
|
||||
|
||||
@@ -317,7 +317,7 @@ struct ConvertArmSMESpillsAndFillsToLLVM : public ConvertToLLVMPattern {
|
||||
auto allTruePredicate = rewriter.create<arith::ConstantOp>(
|
||||
loc, DenseElementsAttr::get(predicateType, true));
|
||||
// Create padding vector (never used due to all-true predicate).
|
||||
auto padVector = rewriter.create<LLVM::UndefOp>(loc, sliceType);
|
||||
auto padVector = rewriter.create<LLVM::PoisonOp>(loc, sliceType);
|
||||
// Get a pointer to the current slice.
|
||||
auto slicePtr =
|
||||
getInMemoryTileSlicePtr(rewriter, loc, tileAlloca, sliceIndex);
|
||||
|
||||
@@ -33,9 +33,9 @@ using namespace mlir::arith;
|
||||
static constexpr unsigned kRealPosInComplexNumberStruct = 0;
|
||||
static constexpr unsigned kImaginaryPosInComplexNumberStruct = 1;
|
||||
|
||||
ComplexStructBuilder ComplexStructBuilder::undef(OpBuilder &builder,
|
||||
Location loc, Type type) {
|
||||
Value val = builder.create<LLVM::UndefOp>(loc, type);
|
||||
ComplexStructBuilder ComplexStructBuilder::poison(OpBuilder &builder,
|
||||
Location loc, Type type) {
|
||||
Value val = builder.create<LLVM::PoisonOp>(loc, type);
|
||||
return ComplexStructBuilder(val);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,8 @@ struct CreateOpConversion : public ConvertOpToLLVMPattern<complex::CreateOp> {
|
||||
// Pack real and imaginary part in a complex number struct.
|
||||
auto loc = complexOp.getLoc();
|
||||
auto structType = typeConverter->convertType(complexOp.getType());
|
||||
auto complexStruct = ComplexStructBuilder::undef(rewriter, loc, structType);
|
||||
auto complexStruct =
|
||||
ComplexStructBuilder::poison(rewriter, loc, structType);
|
||||
complexStruct.setReal(rewriter, loc, adaptor.getReal());
|
||||
complexStruct.setImaginary(rewriter, loc, adaptor.getImaginary());
|
||||
|
||||
@@ -183,7 +184,7 @@ struct AddOpConversion : public ConvertOpToLLVMPattern<complex::AddOp> {
|
||||
|
||||
// Initialize complex number struct for result.
|
||||
auto structType = typeConverter->convertType(op.getType());
|
||||
auto result = ComplexStructBuilder::undef(rewriter, loc, structType);
|
||||
auto result = ComplexStructBuilder::poison(rewriter, loc, structType);
|
||||
|
||||
// Emit IR to add complex numbers.
|
||||
arith::FastMathFlagsAttr complexFMFAttr = op.getFastMathFlagsAttr();
|
||||
@@ -214,7 +215,7 @@ struct DivOpConversion : public ConvertOpToLLVMPattern<complex::DivOp> {
|
||||
|
||||
// Initialize complex number struct for result.
|
||||
auto structType = typeConverter->convertType(op.getType());
|
||||
auto result = ComplexStructBuilder::undef(rewriter, loc, structType);
|
||||
auto result = ComplexStructBuilder::poison(rewriter, loc, structType);
|
||||
|
||||
// Emit IR to add complex numbers.
|
||||
arith::FastMathFlagsAttr complexFMFAttr = op.getFastMathFlagsAttr();
|
||||
@@ -262,7 +263,7 @@ struct MulOpConversion : public ConvertOpToLLVMPattern<complex::MulOp> {
|
||||
|
||||
// Initialize complex number struct for result.
|
||||
auto structType = typeConverter->convertType(op.getType());
|
||||
auto result = ComplexStructBuilder::undef(rewriter, loc, structType);
|
||||
auto result = ComplexStructBuilder::poison(rewriter, loc, structType);
|
||||
|
||||
// Emit IR to add complex numbers.
|
||||
arith::FastMathFlagsAttr complexFMFAttr = op.getFastMathFlagsAttr();
|
||||
@@ -302,7 +303,7 @@ struct SubOpConversion : public ConvertOpToLLVMPattern<complex::SubOp> {
|
||||
|
||||
// Initialize complex number struct for result.
|
||||
auto structType = typeConverter->convertType(op.getType());
|
||||
auto result = ComplexStructBuilder::undef(rewriter, loc, structType);
|
||||
auto result = ComplexStructBuilder::poison(rewriter, loc, structType);
|
||||
|
||||
// Emit IR to substract complex numbers.
|
||||
arith::FastMathFlagsAttr complexFMFAttr = op.getFastMathFlagsAttr();
|
||||
|
||||
@@ -660,7 +660,7 @@ struct UnrealizedConversionCastOpLowering
|
||||
// `ReturnOp` interacts with the function signature and must have as many
|
||||
// operands as the function has return values. Because in LLVM IR, functions
|
||||
// can only return 0 or 1 value, we pack multiple values into a structure type.
|
||||
// Emit `UndefOp` followed by `InsertValueOp`s to create such structure if
|
||||
// Emit `PoisonOp` followed by `InsertValueOp`s to create such structure if
|
||||
// necessary before returning it
|
||||
struct ReturnOpLowering : public ConvertOpToLLVMPattern<func::ReturnOp> {
|
||||
using ConvertOpToLLVMPattern<func::ReturnOp>::ConvertOpToLLVMPattern;
|
||||
@@ -714,7 +714,7 @@ struct ReturnOpLowering : public ConvertOpToLLVMPattern<func::ReturnOp> {
|
||||
return rewriter.notifyMatchFailure(op, "could not convert result types");
|
||||
}
|
||||
|
||||
Value packed = rewriter.create<LLVM::UndefOp>(loc, packedType);
|
||||
Value packed = rewriter.create<LLVM::PoisonOp>(loc, packedType);
|
||||
for (auto [idx, operand] : llvm::enumerate(updatedOperands)) {
|
||||
packed = rewriter.create<LLVM::InsertValueOp>(loc, packed, operand, idx);
|
||||
}
|
||||
|
||||
@@ -603,7 +603,7 @@ LogicalResult impl::scalarizeVectorOp(Operation *op, ValueRange operands,
|
||||
return rewriter.notifyMatchFailure(op, "expected vector result");
|
||||
|
||||
Location loc = op->getLoc();
|
||||
Value result = rewriter.create<LLVM::UndefOp>(loc, vectorType);
|
||||
Value result = rewriter.create<LLVM::PoisonOp>(loc, vectorType);
|
||||
Type indexType = converter.convertType(rewriter.getIndexType());
|
||||
StringAttr name = op->getName().getIdentifier();
|
||||
Type elementType = vectorType.getElementType();
|
||||
@@ -771,7 +771,7 @@ LogicalResult GPUReturnOpLowering::matchAndRewrite(
|
||||
return rewriter.notifyMatchFailure(op, "could not convert result types");
|
||||
}
|
||||
|
||||
Value packed = rewriter.create<LLVM::UndefOp>(loc, packedType);
|
||||
Value packed = rewriter.create<LLVM::PoisonOp>(loc, packedType);
|
||||
for (auto [idx, operand] : llvm::enumerate(updatedOperands)) {
|
||||
packed = rewriter.create<LLVM::InsertValueOp>(loc, packed, operand, idx);
|
||||
}
|
||||
|
||||
@@ -279,7 +279,7 @@ struct WmmaConstantOpToNVVMLowering
|
||||
cast<gpu::MMAMatrixType>(subgroupMmaConstantOp.getType()));
|
||||
// If the element type is a vector create a vector from the operand.
|
||||
if (auto vecType = dyn_cast<VectorType>(type.getBody()[0])) {
|
||||
Value vecCst = rewriter.create<LLVM::UndefOp>(loc, vecType);
|
||||
Value vecCst = rewriter.create<LLVM::PoisonOp>(loc, vecType);
|
||||
for (int64_t vecEl = 0; vecEl < vecType.getNumElements(); vecEl++) {
|
||||
Value idx = rewriter.create<LLVM::ConstantOp>(
|
||||
loc, rewriter.getI32Type(), vecEl);
|
||||
@@ -288,7 +288,7 @@ struct WmmaConstantOpToNVVMLowering
|
||||
}
|
||||
cst = vecCst;
|
||||
}
|
||||
Value matrixStruct = rewriter.create<LLVM::UndefOp>(loc, type);
|
||||
Value matrixStruct = rewriter.create<LLVM::PoisonOp>(loc, type);
|
||||
for (size_t i : llvm::seq(size_t(0), type.getBody().size())) {
|
||||
matrixStruct =
|
||||
rewriter.create<LLVM::InsertValueOp>(loc, matrixStruct, cst, i);
|
||||
@@ -355,7 +355,7 @@ struct WmmaElementwiseOpToNVVMLowering
|
||||
size_t numOperands = adaptor.getOperands().size();
|
||||
LLVM::LLVMStructType destType = convertMMAToLLVMType(
|
||||
cast<gpu::MMAMatrixType>(subgroupMmaElementwiseOp.getType()));
|
||||
Value matrixStruct = rewriter.create<LLVM::UndefOp>(loc, destType);
|
||||
Value matrixStruct = rewriter.create<LLVM::PoisonOp>(loc, destType);
|
||||
for (size_t i = 0, e = destType.getBody().size(); i < e; ++i) {
|
||||
SmallVector<Value> extractedOperands;
|
||||
for (size_t opIdx = 0; opIdx < numOperands; opIdx++) {
|
||||
|
||||
@@ -29,10 +29,10 @@ MemRefDescriptor::MemRefDescriptor(Value descriptor)
|
||||
}
|
||||
|
||||
/// Builds IR creating an `undef` value of the descriptor type.
|
||||
MemRefDescriptor MemRefDescriptor::undef(OpBuilder &builder, Location loc,
|
||||
Type descriptorType) {
|
||||
MemRefDescriptor MemRefDescriptor::poison(OpBuilder &builder, Location loc,
|
||||
Type descriptorType) {
|
||||
|
||||
Value descriptor = builder.create<LLVM::UndefOp>(loc, descriptorType);
|
||||
Value descriptor = builder.create<LLVM::PoisonOp>(loc, descriptorType);
|
||||
return MemRefDescriptor(descriptor);
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ MemRefDescriptor MemRefDescriptor::fromStaticShape(
|
||||
auto convertedType = typeConverter.convertType(type);
|
||||
assert(convertedType && "unexpected failure in memref type conversion");
|
||||
|
||||
auto descr = MemRefDescriptor::undef(builder, loc, convertedType);
|
||||
auto descr = MemRefDescriptor::poison(builder, loc, convertedType);
|
||||
descr.setAllocatedPtr(builder, loc, memory);
|
||||
descr.setAlignedPtr(builder, loc, alignedMemory);
|
||||
descr.setConstantOffset(builder, loc, offset);
|
||||
@@ -224,7 +224,7 @@ Value MemRefDescriptor::pack(OpBuilder &builder, Location loc,
|
||||
const LLVMTypeConverter &converter,
|
||||
MemRefType type, ValueRange values) {
|
||||
Type llvmType = converter.convertType(type);
|
||||
auto d = MemRefDescriptor::undef(builder, loc, llvmType);
|
||||
auto d = MemRefDescriptor::poison(builder, loc, llvmType);
|
||||
|
||||
d.setAllocatedPtr(builder, loc, values[kAllocatedPtrPosInMemRefDescriptor]);
|
||||
d.setAlignedPtr(builder, loc, values[kAlignedPtrPosInMemRefDescriptor]);
|
||||
@@ -300,10 +300,10 @@ UnrankedMemRefDescriptor::UnrankedMemRefDescriptor(Value descriptor)
|
||||
: StructBuilder(descriptor) {}
|
||||
|
||||
/// Builds IR creating an `undef` value of the descriptor type.
|
||||
UnrankedMemRefDescriptor UnrankedMemRefDescriptor::undef(OpBuilder &builder,
|
||||
Location loc,
|
||||
Type descriptorType) {
|
||||
Value descriptor = builder.create<LLVM::UndefOp>(loc, descriptorType);
|
||||
UnrankedMemRefDescriptor UnrankedMemRefDescriptor::poison(OpBuilder &builder,
|
||||
Location loc,
|
||||
Type descriptorType) {
|
||||
Value descriptor = builder.create<LLVM::PoisonOp>(loc, descriptorType);
|
||||
return UnrankedMemRefDescriptor(descriptor);
|
||||
}
|
||||
Value UnrankedMemRefDescriptor::rank(OpBuilder &builder, Location loc) const {
|
||||
@@ -331,7 +331,7 @@ Value UnrankedMemRefDescriptor::pack(OpBuilder &builder, Location loc,
|
||||
UnrankedMemRefType type,
|
||||
ValueRange values) {
|
||||
Type llvmType = converter.convertType(type);
|
||||
auto d = UnrankedMemRefDescriptor::undef(builder, loc, llvmType);
|
||||
auto d = UnrankedMemRefDescriptor::poison(builder, loc, llvmType);
|
||||
|
||||
d.setRank(builder, loc, values[kRankInUnrankedMemRefDescriptor]);
|
||||
d.setMemRefDescPtr(builder, loc, values[kPtrInUnrankedMemRefDescriptor]);
|
||||
|
||||
@@ -218,7 +218,7 @@ MemRefDescriptor ConvertToLLVMPattern::createMemRefDescriptor(
|
||||
ArrayRef<Value> sizes, ArrayRef<Value> strides,
|
||||
ConversionPatternRewriter &rewriter) const {
|
||||
auto structType = typeConverter->convertType(memRefType);
|
||||
auto memRefDescriptor = MemRefDescriptor::undef(rewriter, loc, structType);
|
||||
auto memRefDescriptor = MemRefDescriptor::poison(rewriter, loc, structType);
|
||||
|
||||
// Field 1: Allocated pointer, used for malloc/free.
|
||||
memRefDescriptor.setAllocatedPtr(rewriter, loc, allocatedPtr);
|
||||
@@ -319,7 +319,7 @@ LogicalResult ConvertToLLVMPattern::copyUnrankedDescriptors(
|
||||
if (!descriptorType)
|
||||
return failure();
|
||||
auto updatedDesc =
|
||||
UnrankedMemRefDescriptor::undef(builder, loc, descriptorType);
|
||||
UnrankedMemRefDescriptor::poison(builder, loc, descriptorType);
|
||||
Value rank = desc.rank(builder, loc);
|
||||
updatedDesc.setRank(builder, loc, rank);
|
||||
updatedDesc.setMemRefDescPtr(builder, loc, memory);
|
||||
|
||||
@@ -87,7 +87,7 @@ LogicalResult LLVM::detail::handleMultidimensionalVectors(
|
||||
auto result1DVectorTy = resultTypeInfo.llvm1DVectorTy;
|
||||
auto resultNDVectoryTy = resultTypeInfo.llvmNDVectorTy;
|
||||
auto loc = op->getLoc();
|
||||
Value desc = rewriter.create<LLVM::UndefOp>(loc, resultNDVectoryTy);
|
||||
Value desc = rewriter.create<LLVM::PoisonOp>(loc, resultNDVectoryTy);
|
||||
nDVectorIterate(resultTypeInfo, rewriter, [&](ArrayRef<int64_t> position) {
|
||||
// For this unrolled `position` corresponding to the `linearIndex`^th
|
||||
// element, extract operand vectors
|
||||
|
||||
@@ -714,10 +714,10 @@ struct MemRefCastOpLowering : public ConvertOpToLLVMPattern<memref::CastOp> {
|
||||
// rank = ConstantOp srcRank
|
||||
auto rankVal = rewriter.create<LLVM::ConstantOp>(
|
||||
loc, getIndexType(), rewriter.getIndexAttr(rank));
|
||||
// undef = UndefOp
|
||||
// poison = PoisonOp
|
||||
UnrankedMemRefDescriptor memRefDesc =
|
||||
UnrankedMemRefDescriptor::undef(rewriter, loc, targetStructType);
|
||||
// d1 = InsertValueOp undef, rank, 0
|
||||
UnrankedMemRefDescriptor::poison(rewriter, loc, targetStructType);
|
||||
// d1 = InsertValueOp poison, rank, 0
|
||||
memRefDesc.setRank(rewriter, loc, rankVal);
|
||||
// d2 = InsertValueOp d1, ptr, 1
|
||||
memRefDesc.setMemRefDescPtr(rewriter, loc, ptr);
|
||||
@@ -928,7 +928,7 @@ struct MemorySpaceCastOpLowering
|
||||
Value sourceUnderlyingDesc = sourceDesc.memRefDescPtr(rewriter, loc);
|
||||
|
||||
// Create and allocate storage for new memref descriptor.
|
||||
auto result = UnrankedMemRefDescriptor::undef(
|
||||
auto result = UnrankedMemRefDescriptor::poison(
|
||||
rewriter, loc, typeConverter->convertType(resultTypeU));
|
||||
result.setRank(rewriter, loc, rank);
|
||||
SmallVector<Value, 1> sizes;
|
||||
@@ -1058,7 +1058,7 @@ private:
|
||||
|
||||
// Create descriptor.
|
||||
Location loc = castOp.getLoc();
|
||||
auto desc = MemRefDescriptor::undef(rewriter, loc, llvmTargetDescriptorTy);
|
||||
auto desc = MemRefDescriptor::poison(rewriter, loc, llvmTargetDescriptorTy);
|
||||
|
||||
// Set allocated and aligned pointers.
|
||||
Value allocatedPtr, alignedPtr;
|
||||
@@ -1128,7 +1128,7 @@ private:
|
||||
// Create descriptor.
|
||||
Location loc = reshapeOp.getLoc();
|
||||
auto desc =
|
||||
MemRefDescriptor::undef(rewriter, loc, llvmTargetDescriptorTy);
|
||||
MemRefDescriptor::poison(rewriter, loc, llvmTargetDescriptorTy);
|
||||
|
||||
// Set allocated and aligned pointers.
|
||||
Value allocatedPtr, alignedPtr;
|
||||
@@ -1210,7 +1210,7 @@ private:
|
||||
|
||||
// Create the unranked memref descriptor that holds the ranked one. The
|
||||
// inner descriptor is allocated on stack.
|
||||
auto targetDesc = UnrankedMemRefDescriptor::undef(
|
||||
auto targetDesc = UnrankedMemRefDescriptor::poison(
|
||||
rewriter, loc, typeConverter->convertType(targetType));
|
||||
targetDesc.setRank(rewriter, loc, resultRank);
|
||||
SmallVector<Value, 4> sizes;
|
||||
@@ -1366,7 +1366,7 @@ public:
|
||||
if (transposeOp.getPermutation().isIdentity())
|
||||
return rewriter.replaceOp(transposeOp, {viewMemRef}), success();
|
||||
|
||||
auto targetMemRef = MemRefDescriptor::undef(
|
||||
auto targetMemRef = MemRefDescriptor::poison(
|
||||
rewriter, loc,
|
||||
typeConverter->convertType(transposeOp.getIn().getType()));
|
||||
|
||||
@@ -1469,7 +1469,7 @@ struct ViewOpLowering : public ConvertOpToLLVMPattern<memref::ViewOp> {
|
||||
|
||||
// Create the descriptor.
|
||||
MemRefDescriptor sourceMemRef(adaptor.getSource());
|
||||
auto targetMemRef = MemRefDescriptor::undef(rewriter, loc, targetDescTy);
|
||||
auto targetMemRef = MemRefDescriptor::poison(rewriter, loc, targetDescTy);
|
||||
|
||||
// Field 1: Copy the allocated pointer, used for malloc/free.
|
||||
Value allocatedPtr = sourceMemRef.allocatedPtr(rewriter, loc);
|
||||
|
||||
@@ -143,7 +143,7 @@ static Value convertIntrinsicResult(Location loc, Type intrinsicResultType,
|
||||
|
||||
for (unsigned i = 0, e = structType.getBody().size() / 2; i < e; i++) {
|
||||
Value vec =
|
||||
rewriter.create<LLVM::UndefOp>(loc, arrayType.getElementType());
|
||||
rewriter.create<LLVM::PoisonOp>(loc, arrayType.getElementType());
|
||||
Value x1 =
|
||||
rewriter.create<LLVM::ExtractValueOp>(loc, intrinsicResult, i * 2);
|
||||
Value x2 = rewriter.create<LLVM::ExtractValueOp>(loc, intrinsicResult,
|
||||
@@ -157,7 +157,7 @@ static Value convertIntrinsicResult(Location loc, Type intrinsicResultType,
|
||||
}
|
||||
|
||||
// Create the final vectorized result.
|
||||
Value result = rewriter.create<LLVM::UndefOp>(loc, arrayType);
|
||||
Value result = rewriter.create<LLVM::PoisonOp>(loc, arrayType);
|
||||
for (const auto &el : llvm::enumerate(elements)) {
|
||||
result = rewriter.create<LLVM::InsertValueOp>(loc, result, el.value(),
|
||||
el.index());
|
||||
@@ -296,7 +296,7 @@ struct MmaLdMatrixOpToNVVM : public ConvertOpToLLVMPattern<nvgpu::LdMatrixOp> {
|
||||
// actual vector type (still of width 32b) and repack them into a result
|
||||
// struct.
|
||||
Type finalResultType = typeConverter->convertType(vectorResultType);
|
||||
Value result = b.create<LLVM::UndefOp>(finalResultType);
|
||||
Value result = b.create<LLVM::PoisonOp>(finalResultType);
|
||||
for (int64_t i = 0, e = vectorResultType.getDimSize(0); i < e; i++) {
|
||||
Value i32Register =
|
||||
num32BitRegs > 1 ? b.create<LLVM::ExtractValueOp>(ldMatrixResult, i)
|
||||
@@ -1421,7 +1421,7 @@ struct NVGPUWarpgroupMmaOpLowering
|
||||
/// Generates multiple wgmma instructions to complete the given GEMM shape
|
||||
Value generateWgmmaGroup() {
|
||||
Value wgmmaResult =
|
||||
b.create<LLVM::UndefOp>(adaptor.getMatrixC().getType());
|
||||
b.create<LLVM::PoisonOp>(adaptor.getMatrixC().getType());
|
||||
|
||||
// Perform GEMM
|
||||
SmallVector<Value> wgmmaResults;
|
||||
@@ -1631,7 +1631,7 @@ struct NVGPUWarpgroupMmaInitAccumulatorOpLowering
|
||||
.getBody()
|
||||
.front();
|
||||
Value zero = b.create<LLVM::ConstantOp>(elemType, b.getZeroAttr(elemType));
|
||||
Value packStruct = b.create<LLVM::UndefOp>(packStructType);
|
||||
Value packStruct = b.create<LLVM::PoisonOp>(packStructType);
|
||||
SmallVector<Value> innerStructs;
|
||||
// Unpack the structs and set all values to zero
|
||||
for (auto [idx, s] : llvm::enumerate(packStructType.getBody())) {
|
||||
@@ -1676,7 +1676,7 @@ struct NVGPURcpOpLowering : public ConvertOpToLLVMPattern<nvgpu::RcpOp> {
|
||||
VectorType inTy = op.getIn().getType();
|
||||
// apply rcp.approx.ftz.f on each element in vector.
|
||||
auto convert1DVec = [&](Type llvm1DVectorTy, Value inVec) {
|
||||
Value ret1DVec = b.create<LLVM::UndefOp>(llvm1DVectorTy);
|
||||
Value ret1DVec = b.create<LLVM::PoisonOp>(llvm1DVectorTy);
|
||||
int numElems = llvm::cast<VectorType>(llvm1DVectorTy).getNumElements();
|
||||
for (int i = 0; i < numElems; i++) {
|
||||
Value idx = b.create<LLVM::ConstantOp>(i64Ty, b.getI64IntegerAttr(i));
|
||||
|
||||
@@ -155,7 +155,7 @@ static Value broadcast(Location loc, Value toBroadcast, unsigned numElements,
|
||||
auto vectorType = VectorType::get(numElements, toBroadcast.getType());
|
||||
auto llvmVectorType = typeConverter.convertType(vectorType);
|
||||
auto llvmI32Type = typeConverter.convertType(rewriter.getIntegerType(32));
|
||||
Value broadcasted = rewriter.create<LLVM::UndefOp>(loc, llvmVectorType);
|
||||
Value broadcasted = rewriter.create<LLVM::PoisonOp>(loc, llvmVectorType);
|
||||
for (unsigned i = 0; i < numElements; ++i) {
|
||||
auto index = rewriter.create<LLVM::ConstantOp>(
|
||||
loc, llvmI32Type, rewriter.getI32IntegerAttr(i));
|
||||
@@ -708,7 +708,7 @@ public:
|
||||
|
||||
// Initialize the struct and set the execution mode value.
|
||||
rewriter.setInsertionPointToStart(block);
|
||||
Value structValue = rewriter.create<LLVM::UndefOp>(loc, structType);
|
||||
Value structValue = rewriter.create<LLVM::PoisonOp>(loc, structType);
|
||||
Value executionMode = rewriter.create<LLVM::ConstantOp>(
|
||||
loc, llvmI32Type,
|
||||
rewriter.getI32IntegerAttr(
|
||||
@@ -1753,7 +1753,7 @@ public:
|
||||
auto componentsArray = components.getValue();
|
||||
auto *context = rewriter.getContext();
|
||||
auto llvmI32Type = IntegerType::get(context, 32);
|
||||
Value targetOp = rewriter.create<LLVM::UndefOp>(loc, dstType);
|
||||
Value targetOp = rewriter.create<LLVM::PoisonOp>(loc, dstType);
|
||||
for (unsigned i = 0; i < componentsArray.size(); i++) {
|
||||
if (!isa<IntegerAttr>(componentsArray[i]))
|
||||
return op.emitError("unable to support non-constant component");
|
||||
|
||||
@@ -1028,7 +1028,7 @@ public:
|
||||
eltType = arrayType.getElementType();
|
||||
else
|
||||
eltType = cast<VectorType>(llvmType).getElementType();
|
||||
Value insert = rewriter.create<LLVM::UndefOp>(loc, llvmType);
|
||||
Value insert = rewriter.create<LLVM::PoisonOp>(loc, llvmType);
|
||||
int64_t insPos = 0;
|
||||
for (int64_t extPos : mask) {
|
||||
Value value = adaptor.getV1();
|
||||
@@ -1442,7 +1442,7 @@ public:
|
||||
auto int64Ty = IntegerType::get(rewriter.getContext(), 64);
|
||||
|
||||
// Create descriptor.
|
||||
auto desc = MemRefDescriptor::undef(rewriter, loc, llvmTargetDescriptorTy);
|
||||
auto desc = MemRefDescriptor::poison(rewriter, loc, llvmTargetDescriptorTy);
|
||||
// Set allocated ptr.
|
||||
Value allocated = sourceMemRef.allocatedPtr(rewriter, loc);
|
||||
desc.setAllocatedPtr(rewriter, loc, allocated);
|
||||
@@ -1682,9 +1682,10 @@ struct VectorSplatOpLowering : public ConvertOpToLLVMPattern<vector::SplatOp> {
|
||||
if (resultType.getRank() > 1)
|
||||
return failure();
|
||||
|
||||
// First insert it into an undef vector so we can shuffle it.
|
||||
// First insert it into a poison vector so we can shuffle it.
|
||||
auto vectorType = typeConverter->convertType(splatOp.getType());
|
||||
Value undef = rewriter.create<LLVM::UndefOp>(splatOp.getLoc(), vectorType);
|
||||
Value poison =
|
||||
rewriter.create<LLVM::PoisonOp>(splatOp.getLoc(), vectorType);
|
||||
auto zero = rewriter.create<LLVM::ConstantOp>(
|
||||
splatOp.getLoc(),
|
||||
typeConverter->convertType(rewriter.getIntegerType(32)),
|
||||
@@ -1693,19 +1694,19 @@ struct VectorSplatOpLowering : public ConvertOpToLLVMPattern<vector::SplatOp> {
|
||||
// For 0-d vector, we simply do `insertelement`.
|
||||
if (resultType.getRank() == 0) {
|
||||
rewriter.replaceOpWithNewOp<LLVM::InsertElementOp>(
|
||||
splatOp, vectorType, undef, adaptor.getInput(), zero);
|
||||
splatOp, vectorType, poison, adaptor.getInput(), zero);
|
||||
return success();
|
||||
}
|
||||
|
||||
// For 1-d vector, we additionally do a `vectorshuffle`.
|
||||
auto v = rewriter.create<LLVM::InsertElementOp>(
|
||||
splatOp.getLoc(), vectorType, undef, adaptor.getInput(), zero);
|
||||
splatOp.getLoc(), vectorType, poison, adaptor.getInput(), zero);
|
||||
|
||||
int64_t width = cast<VectorType>(splatOp.getType()).getDimSize(0);
|
||||
SmallVector<int32_t> zeroValues(width, 0);
|
||||
|
||||
// Shuffle the value across the desired number of elements.
|
||||
rewriter.replaceOpWithNewOp<LLVM::ShuffleVectorOp>(splatOp, v, undef,
|
||||
rewriter.replaceOpWithNewOp<LLVM::ShuffleVectorOp>(splatOp, v, poison,
|
||||
zeroValues);
|
||||
return success();
|
||||
}
|
||||
@@ -1734,11 +1735,11 @@ struct VectorSplatNdOpLowering : public ConvertOpToLLVMPattern<SplatOp> {
|
||||
return failure();
|
||||
|
||||
// Construct returned value.
|
||||
Value desc = rewriter.create<LLVM::UndefOp>(loc, llvmNDVectorTy);
|
||||
Value desc = rewriter.create<LLVM::PoisonOp>(loc, llvmNDVectorTy);
|
||||
|
||||
// Construct a 1-D vector with the splatted value that we insert in all the
|
||||
// places within the returned descriptor.
|
||||
Value vdesc = rewriter.create<LLVM::UndefOp>(loc, llvm1DVectorTy);
|
||||
Value vdesc = rewriter.create<LLVM::PoisonOp>(loc, llvm1DVectorTy);
|
||||
auto zero = rewriter.create<LLVM::ConstantOp>(
|
||||
loc, typeConverter->convertType(rewriter.getIntegerType(32)),
|
||||
rewriter.getZeroAttr(rewriter.getIntegerType(32)));
|
||||
@@ -1879,7 +1880,7 @@ struct VectorFromElementsLowering
|
||||
return rewriter.notifyMatchFailure(fromElementsOp,
|
||||
"rank > 1 vectors are not supported");
|
||||
Type llvmType = typeConverter->convertType(vectorType);
|
||||
Value result = rewriter.create<LLVM::UndefOp>(loc, llvmType);
|
||||
Value result = rewriter.create<LLVM::PoisonOp>(loc, llvmType);
|
||||
for (auto [idx, val] : llvm::enumerate(adaptor.getElements()))
|
||||
result = rewriter.create<vector::InsertOp>(loc, val, result, idx);
|
||||
rewriter.replaceOp(fromElementsOp, result);
|
||||
|
||||
@@ -110,7 +110,7 @@ public:
|
||||
|
||||
Value SpecifierStructBuilder::getInitValue(OpBuilder &builder, Location loc,
|
||||
Type structType, Value source) {
|
||||
Value metaData = builder.create<LLVM::UndefOp>(loc, structType);
|
||||
Value metaData = builder.create<LLVM::PoisonOp>(loc, structType);
|
||||
SpecifierStructBuilder md(metaData);
|
||||
if (!source) {
|
||||
auto memSizeArrayType =
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
// CHECK-LABEL: @vec_bin
|
||||
func.func @vec_bin(%arg0: vector<2x2x2xf32>) -> vector<2x2x2xf32> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<2 x array<2 x vector<2xf32>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<2 x array<2 x vector<2xf32>>>
|
||||
|
||||
// This block appears 2x2 times
|
||||
// CHECK-NEXT: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<2 x array<2 x vector<2xf32>>>
|
||||
@@ -23,7 +23,7 @@ func.func @vec_bin(%arg0: vector<2x2x2xf32>) -> vector<2x2x2xf32> {
|
||||
|
||||
// CHECK-LABEL: @sexti
|
||||
func.func @sexti_vector(%arg0 : vector<1x2x3xi32>, %arg1 : vector<1x2x3xi64>) {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.sext %{{.*}} : vector<3xi32> to vector<3xi64>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
@@ -36,7 +36,7 @@ func.func @sexti_vector(%arg0 : vector<1x2x3xi32>, %arg1 : vector<1x2x3xi64>) {
|
||||
|
||||
// CHECK-LABEL: @zexti
|
||||
func.func @zexti_vector(%arg0 : vector<1x2x3xi32>, %arg1 : vector<1x2x3xi64>) {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.zext %{{.*}} : vector<3xi32> to vector<3xi64>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
@@ -49,7 +49,7 @@ func.func @zexti_vector(%arg0 : vector<1x2x3xi32>, %arg1 : vector<1x2x3xi64>) {
|
||||
|
||||
// CHECK-LABEL: @sitofp
|
||||
func.func @sitofp_vector(%arg0 : vector<1x2x3xi32>) -> vector<1x2x3xf32> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.sitofp %{{.*}} : vector<3xi32> to vector<3xf32>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
@@ -62,7 +62,7 @@ func.func @sitofp_vector(%arg0 : vector<1x2x3xi32>) -> vector<1x2x3xf32> {
|
||||
|
||||
// CHECK-LABEL: @uitofp
|
||||
func.func @uitofp_vector(%arg0 : vector<1x2x3xi32>) -> vector<1x2x3xf32> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.uitofp %{{.*}} : vector<3xi32> to vector<3xf32>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
@@ -75,7 +75,7 @@ func.func @uitofp_vector(%arg0 : vector<1x2x3xi32>) -> vector<1x2x3xf32> {
|
||||
|
||||
// CHECK-LABEL: @fptosi
|
||||
func.func @fptosi_vector(%arg0 : vector<1x2x3xf32>) -> vector<1x2x3xi32> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
// CHECK: llvm.fptosi %{{.*}} : vector<3xf32> to vector<3xi32>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
@@ -88,7 +88,7 @@ func.func @fptosi_vector(%arg0 : vector<1x2x3xf32>) -> vector<1x2x3xi32> {
|
||||
|
||||
// CHECK-LABEL: @fptoui
|
||||
func.func @fptoui_vector(%arg0 : vector<1x2x3xf32>) -> vector<1x2x3xi32> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf32>>>
|
||||
// CHECK: llvm.fptoui %{{.*}} : vector<3xf32> to vector<3xi32>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi32>>>
|
||||
@@ -101,7 +101,7 @@ func.func @fptoui_vector(%arg0 : vector<1x2x3xf32>) -> vector<1x2x3xi32> {
|
||||
|
||||
// CHECK-LABEL: @fpext
|
||||
func.func @fpext_vector(%arg0 : vector<1x2x3xf16>) -> vector<1x2x3xf64> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xf64>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xf64>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf16>>>
|
||||
// CHECK: llvm.fpext %{{.*}} : vector<3xf16> to vector<3xf64>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf64>>>
|
||||
@@ -114,7 +114,7 @@ func.func @fpext_vector(%arg0 : vector<1x2x3xf16>) -> vector<1x2x3xf64> {
|
||||
|
||||
// CHECK-LABEL: @fptrunc
|
||||
func.func @fptrunc_vector(%arg0 : vector<1x2x3xf64>) -> vector<1x2x3xf16> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xf16>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xf16>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf64>>>
|
||||
// CHECK: llvm.fptrunc %{{.*}} : vector<3xf64> to vector<3xf16>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xf16>>>
|
||||
@@ -127,7 +127,7 @@ func.func @fptrunc_vector(%arg0 : vector<1x2x3xf64>) -> vector<1x2x3xf16> {
|
||||
|
||||
// CHECK-LABEL: @trunci
|
||||
func.func @trunci_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi16> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi16>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi16>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.trunc %{{.*}} : vector<3xi64> to vector<3xi16>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi16>>>
|
||||
@@ -140,7 +140,7 @@ func.func @trunci_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi16> {
|
||||
|
||||
// CHECK-LABEL: @shl
|
||||
func.func @shl_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.shl %{{.*}}, %{{.*}} : vector<3xi64>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
@@ -154,7 +154,7 @@ func.func @shl_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
|
||||
|
||||
// CHECK-LABEL: @shrs
|
||||
func.func @shrs_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.ashr %{{.*}}, %{{.*}} : vector<3xi64>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
@@ -168,7 +168,7 @@ func.func @shrs_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
|
||||
|
||||
// CHECK-LABEL: @shru
|
||||
func.func @shru_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
// CHECK: llvm.lshr %{{.*}}, %{{.*}} : vector<3xi64>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0, 0] : !llvm.array<1 x array<2 x vector<3xi64>>>
|
||||
@@ -184,7 +184,7 @@ func.func @shru_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
|
||||
|
||||
// CHECK-LABEL: @bitcast_2d
|
||||
func.func @bitcast_2d(%arg0: vector<2x4xf32>) {
|
||||
// CHECK: llvm.mlir.undef
|
||||
// CHECK: llvm.mlir.poison
|
||||
// CHECK: llvm.extractvalue %{{.*}}[0]
|
||||
// CHECK: llvm.bitcast %{{.*}} : vector<4xf32> to vector<4xi32>
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0]
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
// CHECK-LABEL: func @complex_create
|
||||
// CHECK-SAME: (%[[REAL0:.*]]: f32, %[[IMAG0:.*]]: f32)
|
||||
// CHECK-NEXT: %[[CPLX0:.*]] = llvm.mlir.undef : !llvm.struct<(f32, f32)>
|
||||
// CHECK-NEXT: %[[CPLX0:.*]] = llvm.mlir.poison : !llvm.struct<(f32, f32)>
|
||||
// CHECK-NEXT: %[[CPLX1:.*]] = llvm.insertvalue %[[REAL0]], %[[CPLX0]][0] : !llvm.struct<(f32, f32)>
|
||||
// CHECK-NEXT: %[[CPLX2:.*]] = llvm.insertvalue %[[IMAG0]], %[[CPLX1]][1] : !llvm.struct<(f32, f32)>
|
||||
func.func @complex_create(%real: f32, %imag: f32) -> complex<f32> {
|
||||
@@ -37,7 +37,7 @@ func.func @complex_extract(%cplx: complex<f32>) {
|
||||
// CHECK-DAG: %[[B_REAL:.*]] = llvm.extractvalue %[[B:.*]][0] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[A_IMAG:.*]] = llvm.extractvalue %[[A]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[B_IMAG:.*]] = llvm.extractvalue %[[B]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.undef : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.poison : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[C_REAL:.*]] = llvm.fadd %[[A_REAL]], %[[B_REAL]] : f64
|
||||
// CHECK-DAG: %[[C_IMAG:.*]] = llvm.fadd %[[A_IMAG]], %[[B_IMAG]] : f64
|
||||
// CHECK: %[[C1:.*]] = llvm.insertvalue %[[C_REAL]], %[[C0]][0] : !llvm.struct<(f64, f64)>
|
||||
@@ -58,7 +58,7 @@ func.func @complex_addition() {
|
||||
// CHECK-DAG: %[[B_REAL:.*]] = llvm.extractvalue %[[B:.*]][0] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[A_IMAG:.*]] = llvm.extractvalue %[[A]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[B_IMAG:.*]] = llvm.extractvalue %[[B]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.undef : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.poison : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[C_REAL:.*]] = llvm.fsub %[[A_REAL]], %[[B_REAL]] : f64
|
||||
// CHECK-DAG: %[[C_IMAG:.*]] = llvm.fsub %[[A_IMAG]], %[[B_IMAG]] : f64
|
||||
// CHECK: %[[C1:.*]] = llvm.insertvalue %[[C_REAL]], %[[C0]][0] : !llvm.struct<(f64, f64)>
|
||||
@@ -88,7 +88,7 @@ func.func @complex_div(%lhs: complex<f32>, %rhs: complex<f32>) -> complex<f32> {
|
||||
// CHECK: %[[RHS_RE:.*]] = llvm.extractvalue %[[CASTED_RHS]][0] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_IM:.*]] = llvm.extractvalue %[[CASTED_RHS]][1] : ![[C_TY]]
|
||||
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.undef : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.poison : ![[C_TY]]
|
||||
|
||||
// CHECK-DAG: %[[RHS_RE_SQ:.*]] = llvm.fmul %[[RHS_RE]], %[[RHS_RE]] : f32
|
||||
// CHECK-DAG: %[[RHS_IM_SQ:.*]] = llvm.fmul %[[RHS_IM]], %[[RHS_IM]] : f32
|
||||
@@ -123,7 +123,7 @@ func.func @complex_mul(%lhs: complex<f32>, %rhs: complex<f32>) -> complex<f32> {
|
||||
// CHECK: %[[LHS_IM:.*]] = llvm.extractvalue %[[CASTED_LHS]][1] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_RE:.*]] = llvm.extractvalue %[[CASTED_RHS]][0] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_IM:.*]] = llvm.extractvalue %[[CASTED_RHS]][1] : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.undef : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.poison : ![[C_TY]]
|
||||
|
||||
// CHECK-DAG: %[[REAL_TMP_0:.*]] = llvm.fmul %[[RHS_RE]], %[[LHS_RE]] : f32
|
||||
// CHECK-DAG: %[[REAL_TMP_1:.*]] = llvm.fmul %[[RHS_IM]], %[[LHS_IM]] : f32
|
||||
@@ -159,7 +159,7 @@ func.func @complex_abs(%arg: complex<f32>) -> f32 {
|
||||
// CHECK-DAG: %[[B_REAL:.*]] = llvm.extractvalue %[[B:.*]][0] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[A_IMAG:.*]] = llvm.extractvalue %[[A]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[B_IMAG:.*]] = llvm.extractvalue %[[B]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.undef : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.poison : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[C_REAL:.*]] = llvm.fadd %[[A_REAL]], %[[B_REAL]] {fastmathFlags = #llvm.fastmath<reassoc>} : f64
|
||||
// CHECK-DAG: %[[C_IMAG:.*]] = llvm.fadd %[[A_IMAG]], %[[B_IMAG]] {fastmathFlags = #llvm.fastmath<reassoc>} : f64
|
||||
// CHECK: %[[C1:.*]] = llvm.insertvalue %[[C_REAL]], %[[C0]][0] : !llvm.struct<(f64, f64)>
|
||||
@@ -180,7 +180,7 @@ func.func @complex_addition_with_fmf() {
|
||||
// CHECK-DAG: %[[B_REAL:.*]] = llvm.extractvalue %[[B:.*]][0] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[A_IMAG:.*]] = llvm.extractvalue %[[A]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[B_IMAG:.*]] = llvm.extractvalue %[[B]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.undef : !llvm.struct<(f64, f64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.poison : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: %[[C_REAL:.*]] = llvm.fsub %[[A_REAL]], %[[B_REAL]] {fastmathFlags = #llvm.fastmath<nnan, ninf>} : f64
|
||||
// CHECK-DAG: %[[C_IMAG:.*]] = llvm.fsub %[[A_IMAG]], %[[B_IMAG]] {fastmathFlags = #llvm.fastmath<nnan, ninf>} : f64
|
||||
// CHECK: %[[C1:.*]] = llvm.insertvalue %[[C_REAL]], %[[C0]][0] : !llvm.struct<(f64, f64)>
|
||||
@@ -206,7 +206,7 @@ func.func @complex_substraction_with_fmf() {
|
||||
// CHECK: %[[RHS_RE:.*]] = llvm.extractvalue %[[CASTED_RHS]][0] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_IM:.*]] = llvm.extractvalue %[[CASTED_RHS]][1] : ![[C_TY]]
|
||||
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.undef : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.poison : ![[C_TY]]
|
||||
|
||||
// CHECK-DAG: %[[RHS_RE_SQ:.*]] = llvm.fmul %[[RHS_RE]], %[[RHS_RE]] {fastmathFlags = #llvm.fastmath<nsz, arcp>} : f32
|
||||
// CHECK-DAG: %[[RHS_IM_SQ:.*]] = llvm.fmul %[[RHS_IM]], %[[RHS_IM]] {fastmathFlags = #llvm.fastmath<nsz, arcp>} : f32
|
||||
@@ -242,7 +242,7 @@ func.func @complex_div_with_fmf(%lhs: complex<f32>, %rhs: complex<f32>) -> compl
|
||||
// CHECK: %[[LHS_IM:.*]] = llvm.extractvalue %[[CASTED_LHS]][1] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_RE:.*]] = llvm.extractvalue %[[CASTED_RHS]][0] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_IM:.*]] = llvm.extractvalue %[[CASTED_RHS]][1] : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.undef : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.poison : ![[C_TY]]
|
||||
|
||||
// CHECK-DAG: %[[REAL_TMP_0:.*]] = llvm.fmul %[[RHS_RE]], %[[LHS_RE]] {fastmathFlags = #llvm.fastmath<contract, afn>} : f32
|
||||
// CHECK-DAG: %[[REAL_TMP_1:.*]] = llvm.fmul %[[RHS_IM]], %[[LHS_IM]] {fastmathFlags = #llvm.fastmath<contract, afn>} : f32
|
||||
|
||||
@@ -11,7 +11,7 @@ func.func @complex_div(%lhs: complex<f32>, %rhs: complex<f32>) -> complex<f32> {
|
||||
// CHECK: %[[RHS_RE:.*]] = llvm.extractvalue %[[RHS]][0] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_IM:.*]] = llvm.extractvalue %[[RHS]][1] : ![[C_TY]]
|
||||
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.undef : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.poison : ![[C_TY]]
|
||||
|
||||
// CHECK-DAG: %[[RHS_RE_SQ:.*]] = llvm.fmul %[[RHS_RE]], %[[RHS_RE]] : f32
|
||||
// CHECK-DAG: %[[RHS_IM_SQ:.*]] = llvm.fmul %[[RHS_IM]], %[[RHS_IM]] : f32
|
||||
@@ -41,7 +41,7 @@ func.func @complex_mul(%lhs: complex<f32>, %rhs: complex<f32>) -> complex<f32> {
|
||||
// CHECK: %[[LHS_IM:.*]] = llvm.extractvalue %[[LHS]][1] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_RE:.*]] = llvm.extractvalue %[[RHS]][0] : ![[C_TY]]
|
||||
// CHECK: %[[RHS_IM:.*]] = llvm.extractvalue %[[RHS]][1] : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.undef : ![[C_TY]]
|
||||
// CHECK: %[[RESULT_0:.*]] = llvm.mlir.poison : ![[C_TY]]
|
||||
|
||||
// CHECK-DAG: %[[REAL_TMP_0:.*]] = llvm.fmul %[[RHS_RE]], %[[LHS_RE]] : f32
|
||||
// CHECK-DAG: %[[REAL_TMP_1:.*]] = llvm.fmul %[[RHS_IM]], %[[LHS_IM]] : f32
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
// CHECK: %[[ALLOC1:.*]]: !llvm.ptr, %[[ALIGN1:.*]]: !llvm.ptr, %[[OFFSET1:.*]]: i64)
|
||||
func.func private @external(%arg0: memref<?x?xf32>, %arg1: memref<f32>)
|
||||
// Populate the descriptor for arg0.
|
||||
// CHECK: %[[DESC00:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC00:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC01:.*]] = llvm.insertvalue %arg0, %[[DESC00]][0]
|
||||
// CHECK: %[[DESC02:.*]] = llvm.insertvalue %arg1, %[[DESC01]][1]
|
||||
// CHECK: %[[DESC03:.*]] = llvm.insertvalue %arg2, %[[DESC02]][2]
|
||||
@@ -27,7 +27,7 @@ func.func private @external(%arg0: memref<?x?xf32>, %arg1: memref<f32>)
|
||||
// CHECK: llvm.store %[[DESC07]], %[[DESC0_ALLOCA]]
|
||||
|
||||
// Populate the descriptor for arg1.
|
||||
// CHECK: %[[DESC10:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC10:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC11:.*]] = llvm.insertvalue %arg7, %[[DESC10]][0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC12:.*]] = llvm.insertvalue %arg8, %[[DESC11]][1] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC13:.*]] = llvm.insertvalue %arg9, %[[DESC12]][2] : !llvm.struct<(ptr, ptr, i64)>
|
||||
@@ -135,7 +135,7 @@ func.func @return_var_memref_caller(%arg0: memref<4x3xf32>) {
|
||||
// CHECK: %[[SOURCE:.*]] = llvm.extractvalue %[[CALL_RES]][1]
|
||||
// CHECK: "llvm.intr.memcpy"(%[[ALLOCA]], %[[SOURCE]], %[[ALLOC_SIZE]]) <{isVolatile = false}>
|
||||
// CHECK: llvm.call @free(%[[SOURCE]])
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[RANK:.*]] = llvm.extractvalue %[[CALL_RES]][0] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[DESC_1:.*]] = llvm.insertvalue %[[RANK]], %[[DESC]][0]
|
||||
// CHECK: llvm.insertvalue %[[ALLOCA]], %[[DESC_1]][1]
|
||||
@@ -147,7 +147,7 @@ func.func @return_var_memref(%arg0: memref<4x3xf32>) -> memref<*xf32> attributes
|
||||
// Match the construction of the unranked descriptor.
|
||||
// CHECK: %[[ALLOCA:.*]] = llvm.alloca
|
||||
// CHECK: %[[RANK:.*]] = llvm.mlir.constant(2 : index)
|
||||
// CHECK: %[[DESC_0:.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[DESC_0:.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[DESC_1:.*]] = llvm.insertvalue %[[RANK]], %[[DESC_0]][0]
|
||||
// CHECK: %[[DESC_2:.*]] = llvm.insertvalue %[[ALLOCA]], %[[DESC_1]][1]
|
||||
%0 = memref.cast %arg0: memref<4x3xf32> to memref<*xf32>
|
||||
@@ -167,7 +167,7 @@ func.func @return_var_memref(%arg0: memref<4x3xf32>) -> memref<*xf32> attributes
|
||||
// CHECK: %[[ALLOCATED:.*]] = llvm.call @malloc(%[[ALLOC_SIZE]])
|
||||
// CHECK: %[[ALLOCA_EXTRACTED:.*]] = llvm.extractvalue %[[DESC_2]][1]
|
||||
// CHECK: "llvm.intr.memcpy"(%[[ALLOCATED]], %[[ALLOCA_EXTRACTED]], %[[ALLOC_SIZE]]) <{isVolatile = false}>
|
||||
// CHECK: %[[NEW_DESC:.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[NEW_DESC:.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[RANK_EXTRACTED:.*]] = llvm.extractvalue %[[DESC_2]][0]
|
||||
// CHECK: %[[NEW_DESC_1:.*]] = llvm.insertvalue %[[RANK_EXTRACTED]], %[[NEW_DESC]][0]
|
||||
// CHECK: %[[NEW_DESC_2:.*]] = llvm.insertvalue %[[ALLOCATED]], %[[NEW_DESC_1]][1]
|
||||
@@ -193,7 +193,7 @@ func.func @return_two_var_memref_caller(%arg0: memref<4x3xf32>) {
|
||||
// CHECK: %[[SOURCE_1:.*]] = llvm.extractvalue %[[RES_1:.*]][1] : ![[DESC_TYPE:.*>]]
|
||||
// CHECK: "llvm.intr.memcpy"(%[[ALLOCA_1]], %[[SOURCE_1]], %{{.*}}) <{isVolatile = false}>
|
||||
// CHECK: llvm.call @free(%[[SOURCE_1]])
|
||||
// CHECK: %[[DESC_1:.*]] = llvm.mlir.undef : ![[DESC_TYPE]]
|
||||
// CHECK: %[[DESC_1:.*]] = llvm.mlir.poison : ![[DESC_TYPE]]
|
||||
// CHECK: %[[DESC_11:.*]] = llvm.insertvalue %{{.*}}, %[[DESC_1]][0]
|
||||
// CHECK: llvm.insertvalue %[[ALLOCA_1]], %[[DESC_11]][1]
|
||||
|
||||
@@ -201,7 +201,7 @@ func.func @return_two_var_memref_caller(%arg0: memref<4x3xf32>) {
|
||||
// CHECK: %[[SOURCE_2:.*]] = llvm.extractvalue %[[RES_2:.*]][1]
|
||||
// CHECK: "llvm.intr.memcpy"(%[[ALLOCA_2]], %[[SOURCE_2]], %{{.*}}) <{isVolatile = false}>
|
||||
// CHECK: llvm.call @free(%[[SOURCE_2]])
|
||||
// CHECK: %[[DESC_2:.*]] = llvm.mlir.undef : ![[DESC_TYPE]]
|
||||
// CHECK: %[[DESC_2:.*]] = llvm.mlir.poison : ![[DESC_TYPE]]
|
||||
// CHECK: %[[DESC_21:.*]] = llvm.insertvalue %{{.*}}, %[[DESC_2]][0]
|
||||
// CHECK: llvm.insertvalue %[[ALLOCA_2]], %[[DESC_21]][1]
|
||||
return
|
||||
@@ -211,7 +211,7 @@ func.func @return_two_var_memref_caller(%arg0: memref<4x3xf32>) {
|
||||
func.func @return_two_var_memref(%arg0: memref<4x3xf32>) -> (memref<*xf32>, memref<*xf32>) attributes { llvm.emit_c_interface } {
|
||||
// Match the construction of the unranked descriptor.
|
||||
// CHECK: %[[ALLOCA:.*]] = llvm.alloca
|
||||
// CHECK: %[[DESC_0:.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[DESC_0:.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: %[[DESC_1:.*]] = llvm.insertvalue %{{.*}}, %[[DESC_0]][0]
|
||||
// CHECK: %[[DESC_2:.*]] = llvm.insertvalue %[[ALLOCA]], %[[DESC_1]][1]
|
||||
%0 = memref.cast %arg0 : memref<4x3xf32> to memref<*xf32>
|
||||
@@ -223,18 +223,18 @@ func.func @return_two_var_memref(%arg0: memref<4x3xf32>) -> (memref<*xf32>, memr
|
||||
// CHECK: %[[ALLOCATED_1:.*]] = llvm.call @malloc(%{{.*}})
|
||||
// CHECK: %[[ALLOCA_EXTRACTED:.*]] = llvm.extractvalue %[[DESC_2]][1]
|
||||
// CHECK: "llvm.intr.memcpy"(%[[ALLOCATED_1]], %[[ALLOCA_EXTRACTED]], %{{.*}}) <{isVolatile = false}>
|
||||
// CHECK: %[[RES_1:.*]] = llvm.mlir.undef
|
||||
// CHECK: %[[RES_1:.*]] = llvm.mlir.poison
|
||||
// CHECK: %[[RES_11:.*]] = llvm.insertvalue %{{.*}}, %[[RES_1]][0]
|
||||
// CHECK: %[[RES_12:.*]] = llvm.insertvalue %[[ALLOCATED_1]], %[[RES_11]][1]
|
||||
|
||||
// CHECK: %[[ALLOCATED_2:.*]] = llvm.call @malloc(%{{.*}})
|
||||
// CHECK: %[[ALLOCA_EXTRACTED:.*]] = llvm.extractvalue %[[DESC_2]][1]
|
||||
// CHECK: "llvm.intr.memcpy"(%[[ALLOCATED_2]], %[[ALLOCA_EXTRACTED]], %{{.*}}) <{isVolatile = false}>
|
||||
// CHECK: %[[RES_2:.*]] = llvm.mlir.undef
|
||||
// CHECK: %[[RES_2:.*]] = llvm.mlir.poison
|
||||
// CHECK: %[[RES_21:.*]] = llvm.insertvalue %{{.*}}, %[[RES_2]][0]
|
||||
// CHECK: %[[RES_22:.*]] = llvm.insertvalue %[[ALLOCATED_2]], %[[RES_21]][1]
|
||||
|
||||
// CHECK: %[[RESULTS:.*]] = llvm.mlir.undef : !llvm.struct<(struct<(i64, ptr)>, struct<(i64, ptr)>)>
|
||||
// CHECK: %[[RESULTS:.*]] = llvm.mlir.poison : !llvm.struct<(struct<(i64, ptr)>, struct<(i64, ptr)>)>
|
||||
// CHECK: %[[RESULTS_1:.*]] = llvm.insertvalue %[[RES_12]], %[[RESULTS]]
|
||||
// CHECK: %[[RESULTS_2:.*]] = llvm.insertvalue %[[RES_22]], %[[RESULTS_1]]
|
||||
// CHECK: llvm.return %[[RESULTS_2]]
|
||||
@@ -251,8 +251,8 @@ func.func @return_two_var_memref(%arg0: memref<4x3xf32>) -> (memref<*xf32>, memr
|
||||
// CHECK-SAME: -> !llvm.ptr
|
||||
func.func @bare_ptr_calling_conv(%arg0: memref<4x3xf32>, %arg1 : index, %arg2 : index, %arg3 : f32)
|
||||
-> (memref<4x3xf32>) attributes { llvm.bareptr } {
|
||||
// CHECK: %[[UNDEF_DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[INSERT_ALLOCPTR:.*]] = llvm.insertvalue %[[ARG0]], %[[UNDEF_DESC]][0]
|
||||
// CHECK: %[[POISON_DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[INSERT_ALLOCPTR:.*]] = llvm.insertvalue %[[ARG0]], %[[POISON_DESC]][0]
|
||||
// CHECK: %[[INSERT_ALIGNEDPTR:.*]] = llvm.insertvalue %[[ARG0]], %[[INSERT_ALLOCPTR]][1]
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK: %[[INSERT_OFFSET:.*]] = llvm.insertvalue %[[C0]], %[[INSERT_ALIGNEDPTR]][2]
|
||||
@@ -280,8 +280,8 @@ func.func @bare_ptr_calling_conv(%arg0: memref<4x3xf32>, %arg1 : index, %arg2 :
|
||||
// CHECK-SAME: -> !llvm.struct<(f32, ptr)>
|
||||
func.func @bare_ptr_calling_conv_multiresult(%arg0: memref<4x3xf32>, %arg1 : index, %arg2 : index, %arg3 : f32)
|
||||
-> (f32, memref<4x3xf32>) attributes { llvm.bareptr } {
|
||||
// CHECK: %[[UNDEF_DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[INSERT_ALLOCPTR:.*]] = llvm.insertvalue %[[ARG0]], %[[UNDEF_DESC]][0]
|
||||
// CHECK: %[[POISON_DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[INSERT_ALLOCPTR:.*]] = llvm.insertvalue %[[ARG0]], %[[POISON_DESC]][0]
|
||||
// CHECK: %[[INSERT_ALIGNEDPTR:.*]] = llvm.insertvalue %[[ARG0]], %[[INSERT_ALLOCPTR]][1]
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK: %[[INSERT_OFFSET:.*]] = llvm.insertvalue %[[C0]], %[[INSERT_ALIGNEDPTR]][2]
|
||||
@@ -305,7 +305,7 @@ func.func @bare_ptr_calling_conv_multiresult(%arg0: memref<4x3xf32>, %arg1 : ind
|
||||
%0 = memref.load %arg0[%arg1, %arg2] : memref<4x3xf32>
|
||||
|
||||
// CHECK: %[[EXTRACT_MEMREF:.*]] = llvm.extractvalue %[[INSERT_STRIDE1]][0]
|
||||
// CHECK: %[[RETURN_DESC:.*]] = llvm.mlir.undef : !llvm.struct<(f32, ptr)>
|
||||
// CHECK: %[[RETURN_DESC:.*]] = llvm.mlir.poison : !llvm.struct<(f32, ptr)>
|
||||
// CHECK: %[[INSERT_RETURN0:.*]] = llvm.insertvalue %[[RETURN0]], %[[RETURN_DESC]][0]
|
||||
// CHECK: %[[INSERT_RETURN1:.*]] = llvm.insertvalue %[[EXTRACT_MEMREF]], %[[INSERT_RETURN0]][1]
|
||||
// CHECK: llvm.return %[[INSERT_RETURN1]]
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
func.func @check_static_return(%static : memref<32x18xf32>) -> memref<32x18xf32> {
|
||||
// CHECK: llvm.return %{{.*}} : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
|
||||
// BAREPTR: %[[udf:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR: %[[udf:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR-NEXT: %[[base0:.*]] = llvm.insertvalue %[[arg]], %[[udf]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR-NEXT: %[[aligned:.*]] = llvm.insertvalue %[[arg]], %[[base0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR-NEXT: %[[val0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -44,7 +44,7 @@ func.func @check_static_return(%static : memref<32x18xf32>) -> memref<32x18xf32>
|
||||
func.func @check_static_return_with_offset(%static : memref<32x18xf32, strided<[22,1], offset: 7>>) -> memref<32x18xf32, strided<[22,1], offset: 7>> {
|
||||
// CHECK: llvm.return %{{.*}} : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
|
||||
// BAREPTR: %[[udf:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR: %[[udf:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR-NEXT: %[[base0:.*]] = llvm.insertvalue %[[arg]], %[[udf]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR-NEXT: %[[aligned:.*]] = llvm.insertvalue %[[arg]], %[[base0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// BAREPTR-NEXT: %[[val0:.*]] = llvm.mlir.constant(7 : index) : i64
|
||||
@@ -72,7 +72,7 @@ func.func @check_memref_func_call(%in : memref<10xi8>) -> memref<20xi8> {
|
||||
// BAREPTR: %[[inDesc:.*]] = llvm.insertvalue %{{.*}}, %{{.*}}[4, 0]
|
||||
// BAREPTR-NEXT: %[[barePtr:.*]] = llvm.extractvalue %[[inDesc]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// BAREPTR-NEXT: %[[call:.*]] = llvm.call @foo(%[[barePtr]]) : (!llvm.ptr) -> !llvm.ptr
|
||||
// BAREPTR-NEXT: %[[desc0:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// BAREPTR-NEXT: %[[desc0:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// BAREPTR-NEXT: %[[desc1:.*]] = llvm.insertvalue %[[call]], %[[desc0]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// BAREPTR-NEXT: %[[desc2:.*]] = llvm.insertvalue %[[call]], %[[desc1]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// BAREPTR-NEXT: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
|
||||
@@ -400,12 +400,12 @@ func.func @multireturn() -> (i64, f32, memref<42x?x10x?xf32>) {
|
||||
%0 = call @get_i64() : () -> (i64)
|
||||
%1 = call @get_f32() : () -> (f32)
|
||||
%2 = call @get_memref() : () -> (memref<42x?x10x?xf32>)
|
||||
// CHECK-NEXT: {{.*}} = llvm.mlir.undef : !llvm.struct<(i64, f32, struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>)>
|
||||
// CHECK-NEXT: {{.*}} = llvm.mlir.poison : !llvm.struct<(i64, f32, struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>)>
|
||||
// CHECK-NEXT: {{.*}} = llvm.insertvalue {{.*}}, {{.*}}[0] : !llvm.struct<(i64, f32, struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>)>
|
||||
// CHECK-NEXT: {{.*}} = llvm.insertvalue {{.*}}, {{.*}}[1] : !llvm.struct<(i64, f32, struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>)>
|
||||
// CHECK-NEXT: {{.*}} = llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.struct<(i64, f32, struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>)>
|
||||
// CHECK-NEXT: llvm.return {{.*}} : !llvm.struct<(i64, f32, struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>)>
|
||||
// CHECK32-NEXT: {{.*}} = llvm.mlir.undef : !llvm.struct<(i64, f32, struct<(ptr, ptr, i32, array<4 x i32>, array<4 x i32>)>)>
|
||||
// CHECK32-NEXT: {{.*}} = llvm.mlir.poison : !llvm.struct<(i64, f32, struct<(ptr, ptr, i32, array<4 x i32>, array<4 x i32>)>)>
|
||||
// CHECK32-NEXT: {{.*}} = llvm.insertvalue {{.*}}, {{.*}}[0] : !llvm.struct<(i64, f32, struct<(ptr, ptr, i32, array<4 x i32>, array<4 x i32>)>)>
|
||||
// CHECK32-NEXT: {{.*}} = llvm.insertvalue {{.*}}, {{.*}}[1] : !llvm.struct<(i64, f32, struct<(ptr, ptr, i32, array<4 x i32>, array<4 x i32>)>)>
|
||||
// CHECK32-NEXT: {{.*}} = llvm.insertvalue {{.*}}, {{.*}}[2] : !llvm.struct<(i64, f32, struct<(ptr, ptr, i32, array<4 x i32>, array<4 x i32>)>)>
|
||||
@@ -473,7 +473,7 @@ func.func @floorf(%arg0 : f32) {
|
||||
func.return
|
||||
}
|
||||
|
||||
// Wrap the following tests in a module to control the place where
|
||||
// Wrap the following tests in a module to control the place where
|
||||
// `llvm.func @abort()` is produced.
|
||||
module {
|
||||
// Lowers `cf.assert` to a function call to `abort` if the assertion is violated.
|
||||
@@ -576,7 +576,7 @@ module attributes {transform.with_named_sequence} {
|
||||
transform.apply_conversion_patterns.memref.memref_to_llvm_type_converter
|
||||
{index_bitwidth = 32, use_opaque_pointers = true}
|
||||
} {
|
||||
legal_dialects = ["llvm"],
|
||||
legal_dialects = ["llvm"],
|
||||
partial_conversion
|
||||
} : !transform.any_op
|
||||
transform.yield
|
||||
|
||||
@@ -12,7 +12,7 @@ gpu.module @kernel {
|
||||
// ROCDL: %[[raw:.*]] = llvm.alloca %[[size]] x f32 : (i64) -> !llvm.ptr<5>
|
||||
|
||||
// Populate the memref descriptor.
|
||||
// NVVM: %[[descr1:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// NVVM: %[[descr1:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// NVVM: %[[descr2:.*]] = llvm.insertvalue %[[raw]], %[[descr1]][0]
|
||||
// NVVM: %[[descr3:.*]] = llvm.insertvalue %[[raw]], %[[descr2]][1]
|
||||
// NVVM: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -22,7 +22,7 @@ gpu.module @kernel {
|
||||
// NVVM: %[[c1:.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// NVVM: %[[descr6:.*]] = llvm.insertvalue %[[c1]], %[[descr5]][4, 0]
|
||||
|
||||
// ROCDL: %[[descr1:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<5>, ptr<5>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// ROCDL: %[[descr1:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<5>, ptr<5>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// ROCDL: %[[descr2:.*]] = llvm.insertvalue %[[raw]], %[[descr1]][0]
|
||||
// ROCDL: %[[descr3:.*]] = llvm.insertvalue %[[raw]], %[[descr2]][1]
|
||||
// ROCDL: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -76,7 +76,7 @@ gpu.module @kernel {
|
||||
// ROCDL-SAME: !llvm.ptr<3>
|
||||
|
||||
// Populate the memref descriptor.
|
||||
// NVVM: %[[descr1:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// NVVM: %[[descr1:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// NVVM: %[[descr2:.*]] = llvm.insertvalue %[[raw]], %[[descr1]][0]
|
||||
// NVVM: %[[descr3:.*]] = llvm.insertvalue %[[raw]], %[[descr2]][1]
|
||||
// NVVM: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -86,7 +86,7 @@ gpu.module @kernel {
|
||||
// NVVM: %[[c1:.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// NVVM: %[[descr6:.*]] = llvm.insertvalue %[[c1]], %[[descr5]][4, 0]
|
||||
|
||||
// ROCDL: %[[descr1:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// ROCDL: %[[descr1:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// ROCDL: %[[descr2:.*]] = llvm.insertvalue %[[raw]], %[[descr1]][0]
|
||||
// ROCDL: %[[descr3:.*]] = llvm.insertvalue %[[raw]], %[[descr2]][1]
|
||||
// ROCDL: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -137,7 +137,7 @@ gpu.module @kernel {
|
||||
// ROCDL-SAME: !llvm.ptr<3>
|
||||
|
||||
// Populate the memref descriptor.
|
||||
// NVVM: %[[descr1:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// NVVM: %[[descr1:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// NVVM: %[[descr2:.*]] = llvm.insertvalue %[[raw]], %[[descr1]][0]
|
||||
// NVVM: %[[descr3:.*]] = llvm.insertvalue %[[raw]], %[[descr2]][1]
|
||||
// NVVM: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -155,7 +155,7 @@ gpu.module @kernel {
|
||||
// NVVM: %[[c1:.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// NVVM: %[[descr10:.*]] = llvm.insertvalue %[[c1]], %[[descr9]][4, 2]
|
||||
|
||||
// ROCDL: %[[descr1:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// ROCDL: %[[descr1:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// ROCDL: %[[descr2:.*]] = llvm.insertvalue %[[raw]], %[[descr1]][0]
|
||||
// ROCDL: %[[descr3:.*]] = llvm.insertvalue %[[raw]], %[[descr2]][1]
|
||||
// ROCDL: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
|
||||
@@ -415,8 +415,8 @@ gpu.module @kernels {
|
||||
|
||||
// MemRef descriptor built from allocated pointer
|
||||
|
||||
// CHECK-64: %[[VAL_4:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_4:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i32, array<1 x i32>, array<1 x i32>)>
|
||||
// CHECK-64: %[[VAL_4:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_4:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i32, array<1 x i32>, array<1 x i32>)>
|
||||
|
||||
// CHECK: %[[VAL_5:.*]] = llvm.insertvalue %[[VAL_3]], %[[VAL_4]][0]
|
||||
// CHECK: llvm.insertvalue %[[VAL_3]], %[[VAL_5]][1]
|
||||
@@ -426,8 +426,8 @@ gpu.module @kernels {
|
||||
// CHECK: %[[VAL_14:.*]] = llvm.mlir.constant(16 : i64) : i64
|
||||
// CHECK: %[[VAL_15:.*]] = llvm.alloca %[[VAL_14]] x i16 : (i64) -> !llvm.ptr
|
||||
|
||||
// CHECK-64: %[[VAL_16:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_16:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i32, array<1 x i32>, array<1 x i32>)>
|
||||
// CHECK-64: %[[VAL_16:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_16:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i32, array<1 x i32>, array<1 x i32>)>
|
||||
|
||||
// CHECK: %[[VAL_17:.*]] = llvm.insertvalue %[[VAL_15]], %[[VAL_16]][0]
|
||||
// CHECK: llvm.insertvalue %[[VAL_15]], %[[VAL_17]][1]
|
||||
@@ -445,16 +445,16 @@ gpu.module @kernels {
|
||||
|
||||
// MemRef descriptor built from new argument
|
||||
|
||||
// CHECK-64: %[[VAL_31:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_31:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i32, array<1 x i32>, array<1 x i32>)>
|
||||
// CHECK-64: %[[VAL_31:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_31:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i32, array<1 x i32>, array<1 x i32>)>
|
||||
|
||||
// CHECK: %[[VAL_32:.*]] = llvm.insertvalue %[[VAL_29]], %[[VAL_31]][0]
|
||||
// CHECK: llvm.insertvalue %[[VAL_29]], %[[VAL_32]][1]
|
||||
|
||||
// Same as above
|
||||
|
||||
// CHECK-64: %[[VAL_41:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_41:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i32, array<1 x i32>, array<1 x i32>)>
|
||||
// CHECK-64: %[[VAL_41:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK-32: %[[VAL_41:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i32, array<1 x i32>, array<1 x i32>)>
|
||||
|
||||
// CHECK: %[[VAL_42:.*]] = llvm.insertvalue %[[VAL_30]], %[[VAL_41]][0]
|
||||
// CHECK: llvm.insertvalue %[[VAL_30]], %[[VAL_42]][1]
|
||||
@@ -526,7 +526,7 @@ gpu.module @kernels {
|
||||
gpu.return
|
||||
}
|
||||
// CHECK-LABEL: func.func @no_address_spaces_callee(
|
||||
// CHECK-SAME: [[ARG0:%.*]]: memref<2x2xf32, 1>
|
||||
// CHECK-SAME: [[ARG0:%.*]]: memref<2x2xf32, 1>
|
||||
// CHECK-SAME: [[ARG1:%.*]]: memref<4xf32, 1>
|
||||
// CHECK: [[C0:%.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: [[I0:%.*]] = llvm.call spir_funccc @_Z12get_group_idj([[C0]]) {
|
||||
|
||||
@@ -569,7 +569,7 @@ gpu.module @test_module_27 {
|
||||
// CHECK-LABEL: func @gpu_unroll
|
||||
func.func @gpu_unroll(%arg0 : vector<4xf32>) -> vector<4xf32> {
|
||||
%result = math.exp %arg0 : vector<4xf32>
|
||||
// CHECK: %[[V0:.+]] = llvm.mlir.undef : vector<4xf32>
|
||||
// CHECK: %[[V0:.+]] = llvm.mlir.poison : vector<4xf32>
|
||||
// CHECK: %[[CL:.+]] = llvm.call @__nv_expf(%{{.*}}) : (f32) -> f32
|
||||
// CHECK: %[[V1:.+]] = llvm.insertelement %[[CL]], %[[V0]]
|
||||
// CHECK: %[[CL:.+]] = llvm.call @__nv_expf(%{{.*}}) : (f32) -> f32
|
||||
@@ -729,13 +729,13 @@ gpu.module @test_module_33 {
|
||||
gpu.module @test_module_34 {
|
||||
// CHECK-LABEL: llvm.func @memref_signature(
|
||||
// CHECK-SAME: %{{.*}}: !llvm.ptr, %{{.*}}: !llvm.ptr, %{{.*}}: i64, %{{.*}}: i64, %{{.*}}: i64, %{{.*}}: f32) -> !llvm.struct<(struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, f32)>
|
||||
// CHECK: llvm.mlir.undef
|
||||
// CHECK: llvm.mlir.poison
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.mlir.undef
|
||||
// CHECK: llvm.mlir.poison
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.insertvalue
|
||||
// CHECK: llvm.return
|
||||
|
||||
@@ -265,12 +265,12 @@ gpu.module @test_module {
|
||||
|
||||
// CHECK-LABEL: func @gpu_wmma_constant_op
|
||||
// CHECK: %[[CST:.+]] = llvm.mlir.constant(1.000000e+00 : f16) : f16
|
||||
// CHECK: %[[V0:.+]] = llvm.mlir.undef : vector<2xf16>
|
||||
// CHECK: %[[V0:.+]] = llvm.mlir.poison : vector<2xf16>
|
||||
// CHECK: %[[C0:.+]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[V1:.+]] = llvm.insertelement %[[CST]], %[[V0]][%[[C0]] : i32] : vector<2xf16>
|
||||
// CHECK: %[[C1:.+]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[V2:.+]] = llvm.insertelement %[[CST]], %[[V1]][%[[C1]] : i32] : vector<2xf16>
|
||||
// CHECK: %[[M0:.+]] = llvm.mlir.undef : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[M0:.+]] = llvm.mlir.poison : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[M1:.+]] = llvm.insertvalue %[[V2]], %[[M0]][0] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[M2:.+]] = llvm.insertvalue %[[V2]], %[[M1]][1] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[M3:.+]] = llvm.insertvalue %[[V2]], %[[M2]][2] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
@@ -288,7 +288,7 @@ gpu.module @test_module {
|
||||
gpu.module @test_module {
|
||||
|
||||
// CHECK-LABEL: func @gpu_wmma_elementwise
|
||||
// CHECK: %[[M0:.*]] = llvm.mlir.undef : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[M0:.*]] = llvm.mlir.poison : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[A0:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[B0:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[C0:.*]] = llvm.fadd %[[A0]], %[[B0]] : vector<2xf16>
|
||||
@@ -306,7 +306,7 @@ gpu.module @test_module {
|
||||
// CHECK: %[[C3:.*]] = llvm.fadd %[[A3]], %[[B3]] : vector<2xf16>
|
||||
// CHECK: %[[M4:.*]] = llvm.insertvalue %[[C3]], %[[M3]][3] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
|
||||
// CHECK: %[[M0:.*]] = llvm.mlir.undef : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[M0:.*]] = llvm.mlir.poison : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[A0:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[B0:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(vector<2xf16>, vector<2xf16>, vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: %[[CMP0:.*]] = llvm.fcmp "ogt" %[[A0]], %[[B0]] : vector<2xf16>
|
||||
|
||||
@@ -529,7 +529,7 @@ gpu.module @test_module {
|
||||
// CHECK-LABEL: func @gpu_unroll
|
||||
func.func @gpu_unroll(%arg0 : vector<4xf32>) -> vector<4xf32> {
|
||||
%result = math.sin %arg0 : vector<4xf32>
|
||||
// CHECK: %[[V0:.+]] = llvm.mlir.undef : vector<4xf32>
|
||||
// CHECK: %[[V0:.+]] = llvm.mlir.poison : vector<4xf32>
|
||||
// CHECK: %[[CL:.+]] = llvm.call @__ocml_sin_f32(%{{.*}}) : (f32) -> f32
|
||||
// CHECK: %[[V1:.+]] = llvm.insertelement %[[CL]], %[[V0]]
|
||||
// CHECK: %[[CL:.+]] = llvm.call @__ocml_sin_f32(%{{.*}}) : (f32) -> f32
|
||||
|
||||
@@ -15,7 +15,7 @@ func.func @mixed_alloc(%arg0: index, %arg1: index) -> memref<?x42x?xf32> {
|
||||
// CHECK-NEXT: %[[gep:.*]] = llvm.getelementptr %[[null]][%[[sz]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
||||
// CHECK-NEXT: %[[sz_bytes:.*]] = llvm.ptrtoint %[[gep]] : !llvm.ptr to i64
|
||||
// CHECK-NEXT: llvm.call @malloc(%[[sz_bytes]]) : (i64) -> !llvm.ptr
|
||||
// CHECK-NEXT: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-NEXT: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-NEXT: %[[off:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -64,7 +64,7 @@ func.func @dynamic_alloc(%arg0: index, %arg1: index) -> memref<?x?xf32> {
|
||||
// CHECK-NEXT: %[[gep:.*]] = llvm.getelementptr %[[null]][%[[sz]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
||||
// CHECK-NEXT: %[[sz_bytes:.*]] = llvm.ptrtoint %[[gep]] : !llvm.ptr to i64
|
||||
// CHECK-NEXT: llvm.call @malloc(%[[sz_bytes]]) : (i64) -> !llvm.ptr
|
||||
// CHECK-NEXT: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: %[[off:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -87,7 +87,7 @@ func.func @dynamic_alloca(%arg0: index, %arg1: index) -> memref<?x?xf32> {
|
||||
// CHECK-NEXT: %[[st1:.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK-NEXT: %[[num_elems:.*]] = llvm.mul %[[N]], %[[M]] : i64
|
||||
// CHECK-NEXT: %[[allocated:.*]] = llvm.alloca %[[num_elems]] x f32 : (i64) -> !llvm.ptr
|
||||
// CHECK-NEXT: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: llvm.insertvalue %[[allocated]], %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: llvm.insertvalue %[[allocated]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-NEXT: %[[off:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -102,7 +102,7 @@ func.func @dynamic_alloca(%arg0: index, %arg1: index) -> memref<?x?xf32> {
|
||||
// alignment. The same pointer is thus used for allocation and aligned
|
||||
// accesses.
|
||||
// CHECK: %[[alloca_aligned:.*]] = llvm.alloca %{{.*}} x f32 {alignment = 32 : i64} : (i64) -> !llvm.ptr
|
||||
// CHECK: %[[desc:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[desc:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[desc1:.*]] = llvm.insertvalue %[[alloca_aligned]], %[[desc]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[alloca_aligned]], %[[desc1]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
memref.alloca(%arg0, %arg1) {alignment = 32} : memref<?x?xf32>
|
||||
@@ -272,7 +272,7 @@ module attributes { dlti.dl_spec = #dlti.dl_spec<
|
||||
// CHECK: [[INPUT:%.*]] = builtin.unrealized_conversion_cast %{{.*}} to !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[RANK:%.*]] = llvm.extractvalue [[INPUT]][0] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[SOURCE_DESC:%.*]] = llvm.extractvalue [[INPUT]][1]
|
||||
// CHECK: [[RESULT_0:%.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[RESULT_0:%.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[RESULT_1:%.*]] = llvm.insertvalue [[RANK]], [[RESULT_0]][0] : !llvm.struct<(i64, ptr)>
|
||||
|
||||
// Compute size in bytes to allocate result ranked descriptor
|
||||
@@ -378,14 +378,14 @@ func.func @memref_cast_ranked_to_unranked(%arg : memref<42x2x?xf32>) {
|
||||
// CHECK-DAG: %[[p:.*]] = llvm.alloca %[[c]] x !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)> : (i64) -> !llvm.ptr
|
||||
// CHECK-DAG: llvm.store %{{.*}}, %[[p]] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>, !llvm.ptr
|
||||
// CHECK-DAG: %[[r:.*]] = llvm.mlir.constant(3 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK-DAG: llvm.insertvalue %[[r]], %{{.*}}[0] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK-DAG: llvm.insertvalue %[[p]], %{{.*}}[1] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK32-DAG: %[[c:.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK32-DAG: %[[p:.*]] = llvm.alloca %[[c]] x !llvm.struct<(ptr, ptr, i32, array<3 x i32>, array<3 x i32>)> : (i64) -> !llvm.ptr
|
||||
// CHECK32-DAG: llvm.store %{{.*}}, %[[p]] : !llvm.struct<(ptr, ptr, i32, array<3 x i32>, array<3 x i32>)>, !llvm.ptr
|
||||
// CHECK32-DAG: %[[r:.*]] = llvm.mlir.constant(3 : index) : i32
|
||||
// CHECK32: llvm.mlir.undef : !llvm.struct<(i32, ptr)>
|
||||
// CHECK32: llvm.mlir.poison : !llvm.struct<(i32, ptr)>
|
||||
// CHECK32-DAG: llvm.insertvalue %[[r]], %{{.*}}[0] : !llvm.struct<(i32, ptr)>
|
||||
// CHECK32-DAG: llvm.insertvalue %[[p]], %{{.*}}[1] : !llvm.struct<(i32, ptr)>
|
||||
%0 = memref.cast %arg : memref<42x2x?xf32> to memref<*xf32>
|
||||
@@ -450,7 +450,7 @@ func.func @memref_reinterpret_cast_ranked_to_static_shape(%input : memref<2x3xf3
|
||||
}
|
||||
// CHECK: [[INPUT:%.*]] = builtin.unrealized_conversion_cast %{{.*}} :
|
||||
// CHECK: to [[TY:!.*]]
|
||||
// CHECK: [[OUT_0:%.*]] = llvm.mlir.undef : [[TY]]
|
||||
// CHECK: [[OUT_0:%.*]] = llvm.mlir.poison : [[TY]]
|
||||
// CHECK: [[BASE_PTR:%.*]] = llvm.extractvalue [[INPUT]][0] : [[TY]]
|
||||
// CHECK: [[ALIGNED_PTR:%.*]] = llvm.extractvalue [[INPUT]][1] : [[TY]]
|
||||
// CHECK: [[OUT_1:%.*]] = llvm.insertvalue [[BASE_PTR]], [[OUT_0]][0] : [[TY]]
|
||||
@@ -490,7 +490,7 @@ func.func @memref_reinterpret_cast_unranked_to_dynamic_shape(%offset: index,
|
||||
// CHECK-DAG: [[STRIDE_0:%.*]] = builtin.unrealized_conversion_cast [[STRIDE_0arg]]
|
||||
// CHECK-DAG: [[STRIDE_1:%.*]] = builtin.unrealized_conversion_cast [[STRIDE_1arg]]
|
||||
// CHECK-DAG: [[INPUT:%.*]] = builtin.unrealized_conversion_cast
|
||||
// CHECK: [[OUT_0:%.*]] = llvm.mlir.undef : [[TY:!.*]]
|
||||
// CHECK: [[OUT_0:%.*]] = llvm.mlir.poison : [[TY:!.*]]
|
||||
// CHECK: [[DESCRIPTOR:%.*]] = llvm.extractvalue [[INPUT]][1] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[BASE_PTR:%.*]] = llvm.load [[DESCRIPTOR]] : !llvm.ptr -> !llvm.ptr
|
||||
// CHECK: [[ALIGNED_PTR_PTR:%.*]] = llvm.getelementptr [[DESCRIPTOR]]{{\[}}1]
|
||||
@@ -516,7 +516,7 @@ func.func @memref_reshape(%input : memref<2x3xf32>, %shape : memref<?xindex>) {
|
||||
// CHECK-DAG: [[INPUT:%.*]] = builtin.unrealized_conversion_cast %[[ARG0]] : {{.*}} to [[INPUT_TY:!.*]]
|
||||
// CHECK-DAG: [[SHAPE:%.*]] = builtin.unrealized_conversion_cast %[[ARG1]] : {{.*}} to [[SHAPE_TY:!.*]]
|
||||
// CHECK: [[RANK:%.*]] = llvm.extractvalue [[SHAPE]][3, 0] : [[SHAPE_TY]]
|
||||
// CHECK: [[UNRANKED_OUT_O:%.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[UNRANKED_OUT_O:%.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[UNRANKED_OUT_1:%.*]] = llvm.insertvalue [[RANK]], [[UNRANKED_OUT_O]][0] : !llvm.struct<(i64, ptr)>
|
||||
|
||||
// Compute size in bytes to allocate result ranked descriptor
|
||||
@@ -581,7 +581,7 @@ func.func @memref_of_memref() {
|
||||
|
||||
// Check that the types are converted as expected.
|
||||
// ALIGNED-ALLOC: llvm.call @aligned_alloc
|
||||
// ALIGNED-ALLOC: llvm.mlir.undef
|
||||
// ALIGNED-ALLOC: llvm.mlir.poison
|
||||
// ALIGNED-ALLOC-SAME: !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%0 = memref.alloc() : memref<1xmemref<1xf32>>
|
||||
return
|
||||
@@ -603,7 +603,7 @@ module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<index, 32>> } {
|
||||
|
||||
// Check that the types are converted as expected.
|
||||
// ALIGNED-ALLOC: llvm.call @aligned_alloc
|
||||
// ALIGNED-ALLOC: llvm.mlir.undef
|
||||
// ALIGNED-ALLOC: llvm.mlir.poison
|
||||
// ALIGNED-ALLOC-SAME: !llvm.struct<(ptr, ptr, i32, array<1 x i32>, array<1 x i32>)>
|
||||
%0 = memref.alloc() : memref<1xmemref<1xf32>>
|
||||
return
|
||||
|
||||
@@ -7,7 +7,7 @@ func.func @zero_d_alloc() -> memref<f32> {
|
||||
// CHECK: %[[gep:.*]] = llvm.getelementptr %[[null]][%[[one]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
|
||||
// CHECK: %[[size_bytes:.*]] = llvm.ptrtoint %[[gep]] : !llvm.ptr to i64
|
||||
// CHECK: %[[ptr:.*]] = llvm.call @malloc(%[[size_bytes]]) : (i64) -> !llvm.ptr
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.insertvalue %[[ptr]], %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.insertvalue %[[ptr]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -49,7 +49,7 @@ func.func @aligned_1d_alloc() -> memref<42xf32> {
|
||||
// CHECK: %[[mod:.*]] = llvm.urem %[[bumped]], %[[alignment]] : i64
|
||||
// CHECK: %[[aligned:.*]] = llvm.sub %[[bumped]], %[[mod]] : i64
|
||||
// CHECK: %[[alignedBitCast:.*]] = llvm.inttoptr %[[aligned]] : i64 to !llvm.ptr
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[ptr]], %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[alignedBitCast]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -86,7 +86,7 @@ func.func @static_alloca() -> memref<32x18xf32> {
|
||||
// alignment. The same pointer is thus used for allocation and aligned
|
||||
// accesses.
|
||||
// CHECK: %[[alloca_aligned:.*]] = llvm.alloca %{{.*}} x f32 {alignment = 32 : i64} : (i64) -> !llvm.ptr
|
||||
// CHECK: %[[desc:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[desc:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[desc1:.*]] = llvm.insertvalue %[[alloca_aligned]], %[[desc]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[alloca_aligned]], %[[desc1]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
memref.alloca() {alignment = 32} : memref<32x18xf32>
|
||||
@@ -247,7 +247,7 @@ func.func @memref.reshape(%arg0: memref<4x5x6xf32>) -> memref<2x6x20xf32> {
|
||||
// CHECK: %[[cast0:.*]] = builtin.unrealized_conversion_cast %arg0 : memref<4x5x6xf32> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
%0 = memref.get_global @__constant_3xi64 : memref<3xi64>
|
||||
|
||||
// CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[undef:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[elem0:.*]] = llvm.extractvalue %[[cast0]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[elem1:.*]] = llvm.extractvalue %[[cast0]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[insert0:.*]] = llvm.insertvalue %[[elem0]], %[[undef]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
@@ -285,7 +285,7 @@ func.func @memref.reshape(%arg0: memref<4x5x6xf32>) -> memref<2x6x20xf32> {
|
||||
func.func @memref.reshape.dynamic.dim(%arg: memref<?x?x?xf32>, %shape: memref<4xi64>) -> memref<?x?x12x32xf32> {
|
||||
// CHECK-DAG: %[[arg_cast:.*]] = builtin.unrealized_conversion_cast %[[arg]] : memref<?x?x?xf32> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[shape_cast:.*]] = builtin.unrealized_conversion_cast %[[shape]] : memref<4xi64> to !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
|
||||
// CHECK: %[[undef:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
|
||||
// CHECK: %[[alloc_ptr:.*]] = llvm.extractvalue %[[arg_cast]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[align_ptr:.*]] = llvm.extractvalue %[[arg_cast]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[insert0:.*]] = llvm.insertvalue %[[alloc_ptr]], %[[undef]][0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
|
||||
@@ -334,7 +334,7 @@ func.func @memref.reshape.dynamic.dim(%arg: memref<?x?x?xf32>, %shape: memref<4x
|
||||
func.func @memref.reshape_index(%arg0: memref<?x?xi32>, %shape: memref<1xindex>) -> memref<?xi32> {
|
||||
// CHECK-DAG: %[[arg_cast:.*]] = builtin.unrealized_conversion_cast %[[arg]] : memref<?x?xi32> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[shape_cast:.*]] = builtin.unrealized_conversion_cast %[[shape]] : memref<1xindex> to !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[undef:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[alloc_ptr:.*]] = llvm.extractvalue %[[arg_cast]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[align_ptr:.*]] = llvm.extractvalue %[[arg_cast]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[insert0:.*]] = llvm.insertvalue %[[alloc_ptr]], %[[undef:.*]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
@@ -372,7 +372,7 @@ func.func @memref_memory_space_cast(%input : memref<?xf32>) -> memref<?xf32, 1>
|
||||
// CHECK: [[STRIDE:%.*]] = llvm.extractvalue [[INPUT]][4, 0]
|
||||
// CHECK: [[CAST_ALLOC:%.*]] = llvm.addrspacecast [[ALLOC]] : !llvm.ptr to !llvm.ptr<1>
|
||||
// CHECK: [[CAST_ALIGN:%.*]] = llvm.addrspacecast [[ALIGN]] : !llvm.ptr to !llvm.ptr<1>
|
||||
// CHECK: [[RESULT_0:%.*]] = llvm.mlir.undef
|
||||
// CHECK: [[RESULT_0:%.*]] = llvm.mlir.poison
|
||||
// CHECK: [[RESULT_1:%.*]] = llvm.insertvalue [[CAST_ALLOC]], [[RESULT_0]][0]
|
||||
// CHECK: [[RESULT_2:%.*]] = llvm.insertvalue [[CAST_ALIGN]], [[RESULT_1]][1]
|
||||
// CHECK: [[RESULT_3:%.*]] = llvm.insertvalue [[OFFSET]], [[RESULT_2]][2]
|
||||
|
||||
@@ -65,7 +65,7 @@ func.func @subview(%0 : memref<64x4xf32, strided<[4, 1], offset: 0>>, %arg0 : in
|
||||
// CHECK: %[[OFF2:.*]] = llvm.add %[[DESCSTRIDE0]], %[[ARG1]] : i64
|
||||
// CHECK: %[[TMP:.*]] = builtin.unrealized_conversion_cast %[[OFF2]] : i64 to index
|
||||
// CHECK: %[[OFF2:.*]] = builtin.unrealized_conversion_cast %[[TMP]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[OFF2]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -101,7 +101,7 @@ func.func @subview_non_zero_addrspace(%0 : memref<64x4xf32, strided<[4, 1], offs
|
||||
// CHECK: %[[OFF2:.*]] = llvm.add %[[DESCSTRIDE0]], %[[ARG1]] : i64
|
||||
// CHECK: %[[TMP:.*]] = builtin.unrealized_conversion_cast %[[OFF2]] : i64 to index
|
||||
// CHECK: %[[OFF2:.*]] = builtin.unrealized_conversion_cast %[[TMP]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[OFF2]], %[[DESC1]][2] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -137,7 +137,7 @@ func.func @subview_const_size(%0 : memref<64x4xf32, strided<[4, 1], offset: 0>>,
|
||||
// CHECK: %[[OFF2:.*]] = llvm.add %[[DESCSTRIDE0]], %[[ARG1]] : i64
|
||||
// CHECK: %[[TMP:.*]] = builtin.unrealized_conversion_cast %[[OFF2]] : i64 to index
|
||||
// CHECK: %[[OFF2:.*]] = builtin.unrealized_conversion_cast %[[TMP]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[OFF2]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -172,7 +172,7 @@ func.func @subview_const_stride(%0 : memref<64x4xf32, strided<[4, 1], offset: 0>
|
||||
// CHECK: %[[OFF2:.*]] = llvm.add %[[OFF0]], %[[ARG1]] : i64
|
||||
// CHECK: %[[TMP:.*]] = builtin.unrealized_conversion_cast %[[OFF2]] : i64 to index
|
||||
// CHECK: %[[OFF2:.*]] = builtin.unrealized_conversion_cast %[[TMP]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[OFF2]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -198,7 +198,7 @@ func.func @subview_const_stride_and_offset(%0 : memref<64x4xf32, strided<[4, 1],
|
||||
|
||||
// CHECK: %[[BASE:.*]] = llvm.extractvalue %[[MEMREF]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE_ALIGNED:.*]] = llvm.extractvalue %[[MEMREF]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[CST_OFF:.*]] = llvm.mlir.constant(8 : index) : i64
|
||||
@@ -242,7 +242,7 @@ func.func @subview_mixed_static_dynamic(%0 : memref<64x4xf32, strided<[4, 1], of
|
||||
// CHECK: %[[OFF2:.*]] = llvm.add %[[OFF0]], %[[BASE_OFF]] : i64
|
||||
// CHECK: %[[TMP:.*]] = builtin.unrealized_conversion_cast %[[OFF2]] : i64 to index
|
||||
// CHECK: %[[OFF2:.*]] = builtin.unrealized_conversion_cast %[[TMP]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[OFF2]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -269,7 +269,7 @@ func.func @subview_leading_operands(%0 : memref<5x3xf32>, %1: memref<5x?xf32>) -
|
||||
// CHECK: %[[BASE:.*]] = llvm.extractvalue %[[MEMREF]][0] : !llvm.struct<(ptr, ptr, i64
|
||||
// Aligned ptr
|
||||
// CHECK: %[[BASE_ALIGNED:.*]] = llvm.extractvalue %[[MEMREF]][1] : !llvm.struct<(ptr, ptr, i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// Offset
|
||||
@@ -304,7 +304,7 @@ func.func @subview_leading_operands_dynamic(%0 : memref<5x?xf32>) -> memref<3x?x
|
||||
// CHECK: %[[OFF0:.*]] = llvm.mul %[[STRIDE0]], %[[CST_OFF0]] overflow<nsw> : i64
|
||||
// CHECK: %[[TMP:.*]] = builtin.unrealized_conversion_cast %[[OFF0]] : i64 to index
|
||||
// CHECK: %[[OFF0:.*]] = builtin.unrealized_conversion_cast %[[TMP]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// Alloc ptr
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// Aligned ptr
|
||||
@@ -333,7 +333,7 @@ func.func @subview_rank_reducing_leading_operands(%0 : memref<5x3xf32>) -> memre
|
||||
// CHECK: %[[MEMREF:.*]] = builtin.unrealized_conversion_cast %[[MEM]]
|
||||
// CHECK: %[[BASE:.*]] = llvm.extractvalue %[[MEMREF]][0] : !llvm.struct<(ptr, ptr, i64
|
||||
// CHECK: %[[BASE_ALIGNED:.*]] = llvm.extractvalue %[[MEMREF]][1] : !llvm.struct<(ptr, ptr, i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// Alloc ptr
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// Aligned ptr
|
||||
@@ -358,7 +358,7 @@ func.func @subview_negative_stride(%arg0 : memref<7xf32>) -> memref<7xf32, strid
|
||||
// CHECK: %[[MEMREF:.*]] = builtin.unrealized_conversion_cast %[[MEM]]
|
||||
// CHECK: %[[BASE:.*]] = llvm.extractvalue %[[MEMREF]][0] : !llvm.struct<(ptr, ptr, i64
|
||||
// CHECK: %[[BASE_ALIGNED:.*]] = llvm.extractvalue %[[MEMREF]][1] : !llvm.struct<(ptr, ptr, i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_ALIGNED]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[CST_OFF0:.*]] = llvm.mlir.constant(6 : index) : i64
|
||||
@@ -387,7 +387,7 @@ func.func @collapse_shape_static(%arg0: memref<1x3x4x1x5xf32>) -> memref<3x4x5xf
|
||||
// CHECK: %[[BASE_BUFFER:.*]] = llvm.extractvalue %[[MEM]][0] : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
// CHECK: %[[ALIGNED_BUFFER:.*]] = llvm.extractvalue %[[MEM]][1] : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[C0]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
@@ -428,7 +428,7 @@ func.func @collapse_shape_dynamic_with_non_identity_layout(
|
||||
// CHECK: %[[FINAL_SIZE1:.*]] = llvm.mul %[[SIZE1]], %[[SIZE2]] overflow<nsw> : i64
|
||||
// CHECK: %[[SIZE1_TO_IDX:.*]] = builtin.unrealized_conversion_cast %[[FINAL_SIZE1]] : i64 to index
|
||||
// CHECK: %[[FINAL_SIZE1:.*]] = builtin.unrealized_conversion_cast %[[SIZE1_TO_IDX]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[OFFSET]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -461,7 +461,7 @@ func.func @expand_shape_static(%arg0: memref<3x4x5xf32>) -> memref<1x3x4x1x5xf32
|
||||
// CHECK: %[[BASE_BUFFER:.*]] = llvm.extractvalue %[[MEM]][0] : !llvm.struct<(ptr, ptr, i64,
|
||||
// CHECK: %[[ALIGNED_BUFFER:.*]] = llvm.extractvalue %[[MEM]][1] : !llvm.struct<(ptr, ptr, i64,
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[C0]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<5 x i64>, array<5 x i64>)>
|
||||
@@ -496,7 +496,7 @@ func.func @collapse_shape_fold_zero_dim(%arg0 : memref<1x1xf32>) -> memref<f32>
|
||||
// CHECK: %[[MEM:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : memref<1x1xf32> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE_BUFFER:.*]] = llvm.extractvalue %[[MEM]][0] : !llvm.struct<(ptr, ptr, i64,
|
||||
// CHECK: %[[ALIGNED_BUFFER:.*]] = llvm.extractvalue %[[MEM]][1] : !llvm.struct<(ptr, ptr, i64,
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -518,7 +518,7 @@ func.func @expand_shape_zero_dim(%arg0 : memref<f32>) -> memref<1x1xf32> {
|
||||
// CHECK: %[[BASE_BUFFER:.*]] = llvm.extractvalue %[[MEM]][0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[ALIGNED_BUFFER:.*]] = llvm.extractvalue %[[MEM]][1] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[C0]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -550,7 +550,7 @@ func.func @collapse_shape_dynamic(%arg0 : memref<1x2x?xf32>) -> memref<1x?xf32>
|
||||
// CHECK: %[[FINAL_SIZE1:.*]] = llvm.mul %[[SIZE2]], %[[C2]] overflow<nsw> : i64
|
||||
// CHECK: %[[SIZE1_TO_IDX:.*]] = builtin.unrealized_conversion_cast %[[FINAL_SIZE1]] : i64 to index
|
||||
// CHECK: %[[FINAL_SIZE1:.*]] = builtin.unrealized_conversion_cast %[[SIZE1_TO_IDX]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[C0]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -588,7 +588,7 @@ func.func @expand_shape_dynamic(%arg0 : memref<1x?xf32>, %sz0: index) -> memref<
|
||||
// CHECK: %[[FINAL_SIZE2:.*]] = llvm.select %[[IS_NEGATIVE_SIZE1]], %[[NEGATIVE_SIZE2]], %[[SIZE2]] : i1, i64
|
||||
// CHECK: %[[SIZE2_TO_IDX:.*]] = builtin.unrealized_conversion_cast %[[FINAL_SIZE2]] : i64 to index
|
||||
// CHECK: %[[FINAL_SIZE2:.*]] = builtin.unrealized_conversion_cast %[[SIZE2_TO_IDX]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[C0]], %[[DESC1]][2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
@@ -638,7 +638,7 @@ func.func @expand_shape_dynamic_with_non_identity_layout(
|
||||
// CHECK: %[[FINAL_STRIDE1:.*]] = llvm.mul %[[TMP_SIZE2]], %[[STRIDE1]]
|
||||
// CHECK: %[[STRIDE1_TO_IDX:.*]] = builtin.unrealized_conversion_cast %[[FINAL_STRIDE1]] : i64 to index
|
||||
// CHECK: %[[FINAL_STRIDE1:.*]] = builtin.unrealized_conversion_cast %[[STRIDE1_TO_IDX]] : index to i64
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[BASE_BUFFER]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC2:.*]] = llvm.insertvalue %[[ALIGNED_BUFFER]], %[[DESC1]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[DESC3:.*]] = llvm.insertvalue %[[OFFSET]], %[[DESC2]][2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
|
||||
@@ -14,11 +14,11 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
|
||||
// CHECK-DAG: %[[ARG0:.*]] = builtin.unrealized_conversion_cast %[[ARG0F]]
|
||||
// CHECK-DAG: %[[ARG1:.*]] = builtin.unrealized_conversion_cast %[[ARG1F]]
|
||||
// CHECK: llvm.mlir.constant(2048 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%0 = memref.alloc() : memref<2048xi8>
|
||||
|
||||
// Test two dynamic sizes.
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE_PTR:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[SHIFTED_BASE_PTR:.*]] = llvm.getelementptr %[[BASE_PTR]][%[[ARG2]]] : (!llvm.ptr, i64) -> !llvm.ptr, i8
|
||||
// CHECK: llvm.insertvalue %[[SHIFTED_BASE_PTR]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -33,7 +33,7 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
|
||||
%1 = memref.view %0[%arg2][%arg0, %arg1] : memref<2048xi8> to memref<?x?xf32>
|
||||
|
||||
// Test one dynamic size.
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE_PTR_2:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[SHIFTED_BASE_PTR_2:.*]] = llvm.getelementptr %[[BASE_PTR_2]][%[[ARG2]]] : (!llvm.ptr, i64) -> !llvm.ptr, i8
|
||||
// CHECK: llvm.insertvalue %[[SHIFTED_BASE_PTR_2]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -49,7 +49,7 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
|
||||
%3 = memref.view %0[%arg2][%arg1] : memref<2048xi8> to memref<4x?xf32>
|
||||
|
||||
// Test static sizes.
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE_PTR_3:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[SHIFTED_BASE_PTR_3:.*]] = llvm.getelementptr %[[BASE_PTR_3]][%[[ARG2]]] : (!llvm.ptr, i64) -> !llvm.ptr, i8
|
||||
// CHECK: llvm.insertvalue %[[SHIFTED_BASE_PTR_3]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -67,10 +67,10 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
|
||||
|
||||
// Test view memory space.
|
||||
// CHECK: llvm.mlir.constant(2048 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr<4>, ptr<4>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr<4>, ptr<4>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%6 = memref.alloc() : memref<2048xi8, 4>
|
||||
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr<4>, ptr<4>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr<4>, ptr<4>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE_PTR_4:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<4>, ptr<4>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[SHIFTED_BASE_PTR_4:.*]] = llvm.getelementptr %[[BASE_PTR_4]][%[[ARG2]]] : (!llvm.ptr<4>, i64) -> !llvm.ptr<4>, i8
|
||||
// CHECK: llvm.insertvalue %[[SHIFTED_BASE_PTR_4]], %{{.*}}[1] : !llvm.struct<(ptr<4>, ptr<4>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -100,7 +100,7 @@ func.func @view(%arg0 : index, %arg1 : index, %arg2 : index) {
|
||||
// CHECK-INTERFACE: %[[ARG1:.*]]: memref<0xi8>)
|
||||
func.func @view_empty_memref(%offset: index, %mem: memref<0xi8>) {
|
||||
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.constant(4 : index) : i64
|
||||
@@ -112,7 +112,7 @@ func.func @view_empty_memref(%offset: index, %mem: memref<0xi8>) {
|
||||
// CHECK: llvm.mlir.constant(4 : index) : i64
|
||||
// CHECK: = llvm.insertvalue %{{.*}}, %{{.*}}[4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
|
||||
// CHECK-INTERFACE: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-INTERFACE: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-INTERFACE: llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK-INTERFACE: llvm.insertvalue %{{.*}}, %{{.*}}[2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-INTERFACE: llvm.mlir.constant(4 : index) : i64
|
||||
@@ -220,7 +220,7 @@ func.func @address_space(%arg0 : memref<32xf32, affine_map<(d0) -> (d0)>, 7>) {
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @transpose
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: llvm.insertvalue {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: llvm.insertvalue {{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
@@ -265,7 +265,7 @@ func.func @get_gv0_memref() {
|
||||
// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ADDR]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<2 x f32>
|
||||
// CHECK: %[[DEADBEEF:.*]] = llvm.mlir.constant(3735928559 : index) : i64
|
||||
// CHECK: %[[DEADBEEFPTR:.*]] = llvm.inttoptr %[[DEADBEEF]] : i64 to !llvm.ptr
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[DEADBEEFPTR]], {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[GEP]], {{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[OFFSET:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -285,7 +285,7 @@ func.func @get_gv2_memref() {
|
||||
// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ADDR]][0, 0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<2 x array<3 x f32>>
|
||||
// CHECK: %[[DEADBEEF:.*]] = llvm.mlir.constant(3735928559 : index) : i64
|
||||
// CHECK: %[[DEADBEEFPTR:.*]] = llvm.inttoptr %[[DEADBEEF]] : i64 to !llvm.ptr
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[DEADBEEFPTR]], {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[GEP]], {{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[OFFSET:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -309,7 +309,7 @@ func.func @get_gv3_memref() {
|
||||
// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ADDR]][0] : (!llvm.ptr) -> !llvm.ptr, f32
|
||||
// CHECK: %[[DEADBEEF:.*]] = llvm.mlir.constant(3735928559 : index) : i64
|
||||
// CHECK: %[[DEADBEEFPTR:.*]] = llvm.inttoptr %[[DEADBEEF]] : i64 to !llvm.ptr
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.insertvalue %[[DEADBEEFPTR]], {{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.insertvalue %[[GEP]], {{.*}}[1] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[OFFSET:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -466,11 +466,11 @@ func.func @generic_atomic_rmw_in_alloca_scope(){
|
||||
func.func @memref_copy_ranked() {
|
||||
%0 = memref.alloc() : memref<2xf32>
|
||||
// CHECK: llvm.mlir.constant(2 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%1 = memref.cast %0 : memref<2xf32> to memref<?xf32>
|
||||
%2 = memref.alloc() : memref<2xf32>
|
||||
// CHECK: llvm.mlir.constant(2 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%3 = memref.cast %2 : memref<2xf32> to memref<?xf32>
|
||||
memref.copy %1, %3 : memref<?xf32> to memref<?xf32>
|
||||
// CHECK: [[ONE:%.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
@@ -550,18 +550,18 @@ func.func @memref_copy_noncontiguous(%in: memref<16x2xi32>, %offset: index) {
|
||||
func.func @memref_copy_unranked() {
|
||||
%0 = memref.alloc() : memref<2xi1>
|
||||
// CHECK: llvm.mlir.constant(2 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%1 = memref.cast %0 : memref<2xi1> to memref<*xi1>
|
||||
%2 = memref.alloc() : memref<2xi1>
|
||||
// CHECK: llvm.mlir.constant(2 : index) : i64
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
|
||||
%3 = memref.cast %2 : memref<2xi1> to memref<*xi1>
|
||||
memref.copy %1, %3 : memref<*xi1> to memref<*xi1>
|
||||
// CHECK: [[ONE:%.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK: [[ALLOCA:%.*]] = llvm.alloca [[ONE]] x !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> : (i64) -> !llvm.ptr
|
||||
// CHECK: llvm.store {{%.*}}, [[ALLOCA]] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, !llvm.ptr
|
||||
// CHECK: [[RANK:%.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK: [[UNDEF:%.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[UNDEF:%.*]] = llvm.mlir.poison : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[INSERT:%.*]] = llvm.insertvalue [[RANK]], [[UNDEF]][0] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[INSERT2:%.*]] = llvm.insertvalue [[ALLOCA]], [[INSERT]][1] : !llvm.struct<(i64, ptr)>
|
||||
// CHECK: [[STACKSAVE:%.*]] = llvm.intr.stacksave : !llvm.ptr
|
||||
@@ -612,7 +612,7 @@ func.func @extract_aligned_pointer_as_index_unranked(%m: memref<*xf32>) -> index
|
||||
// CHECK: %[[MEM_DESC:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : memref<?x?xf32, strided<[?, ?], offset: ?>> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[BASE:.*]] = llvm.extractvalue %[[MEM_DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[ALIGNED_BASE:.*]] = llvm.extractvalue %[[MEM_DESC]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[DESC1:.*]] = llvm.insertvalue %[[ALIGNED_BASE]], %[[DESC0]][1] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[OFF0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
|
||||
@@ -17,7 +17,7 @@ func.func @m16n8k16_fp16(%arg0: vector<4x2xf16>, %arg1: vector<2x2xf16>, %arg2:
|
||||
%d = nvgpu.mma.sync (%arg0, %arg1, %arg2) {mmaShape = [16, 8, 16]} : (vector<4x2xf16>, vector<2x2xf16>, vector<2x2xf16>) -> vector<2x2xf16>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][0] : !llvm.struct<(vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][1] : !llvm.struct<(vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK-DAG: llvm.insertvalue {{%.+}}, {{%.+}}[0] : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK-DAG: llvm.insertvalue {{%.+}}, {{%.+}}[1] : !llvm.array<2 x vector<2xf16>>
|
||||
return %d : vector<2x2xf16>
|
||||
@@ -32,13 +32,13 @@ func.func @m16n8k16_fp16_fp32(%arg0: vector<4x2xf16>, %arg1: vector<2x2xf16>, %a
|
||||
// CHECK-SAME: shape = #nvvm.shape<m = 16, n = 8, k = 16>
|
||||
// CHECK-SAME: (vector<2xf16>, vector<2xf16>, f32) -> !llvm.struct<(f32, f32, f32, f32)>
|
||||
%d = nvgpu.mma.sync (%arg0, %arg1, %arg2) {mmaShape = [16, 8, 16]} : (vector<4x2xf16>, vector<2x2xf16>, vector<2x2xf32>) -> vector<2x2xf32>
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.undef : vector<2xf32>
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.poison : vector<2xf32>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][0] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][1] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK: [[d00:%.+]] = llvm.insertelement {{%.+}}, [[undef]][{{.*}}] : vector<2xf32>
|
||||
// CHECK: [[d01:%.+]] = llvm.insertelement {{%.+}}, [[d00]][{{.*}}] : vector<2xf32>
|
||||
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.undef : vector<2xf32>
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.poison : vector<2xf32>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][2] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][3] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK: [[d10:%.+]] = llvm.insertelement {{%.+}}, [[undef]][{{.*}}] : vector<2xf32>
|
||||
@@ -62,7 +62,7 @@ func.func @m16n8k8_fp16(%arg0: vector<2x2xf16>, %arg1: vector<1x2xf16>, %arg2: v
|
||||
%d = nvgpu.mma.sync (%arg0, %arg1, %arg2) {mmaShape = [16, 8, 8]} : (vector<2x2xf16>, vector<1x2xf16>, vector<2x2xf16>) -> vector<2x2xf16>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][0] : !llvm.struct<(vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][1] : !llvm.struct<(vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK-DAG: llvm.insertvalue {{%.+}}, {{%.+}}[0] : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK-DAG: llvm.insertvalue {{%.+}}, {{%.+}}[1] : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK: return
|
||||
@@ -146,7 +146,7 @@ func.func @m8n8k4_f64(%arg0: vector<1x1xf64>, %arg1: vector<1x1xf64>, %arg2: vec
|
||||
// CHECK: [[d:%.+]] = nvvm.mma.sync A[{{%.+}}] B[{{%.+}}] C[{{%.+}}, {{%.+}}]
|
||||
// CHECK-SAME: shape = #nvvm.shape<m = 8, n = 8, k = 4>
|
||||
%d = nvgpu.mma.sync (%arg0, %arg1, %arg2) {mmaShape = [8, 8, 4]} : (vector<1x1xf64>, vector<1x1xf64>, vector<1x2xf64>) -> vector<1x2xf64>
|
||||
// CHECK: llvm.mlir.undef : vector<2xf64>
|
||||
// CHECK: llvm.mlir.poison : vector<2xf64>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][0] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][1] : !llvm.struct<(f64, f64)>
|
||||
// CHECK-COUNT-2: llvm.insertelement {{.*}} : vector<2xf64>
|
||||
@@ -202,13 +202,13 @@ func.func @m16n8k4_tf32(%arg0: vector<2x1xf32>, %arg1: vector<1x1xf32>, %arg2: v
|
||||
// CHECK-SAME: shape = #nvvm.shape<m = 16, n = 8, k = 4>
|
||||
// CHECK-SAME: -> !llvm.struct<(f32, f32, f32, f32)>
|
||||
%d = nvgpu.mma.sync (%arg0, %arg1, %arg2) {mmaShape = [16, 8, 4], tf32Enabled} : (vector<2x1xf32>, vector<1x1xf32>, vector<2x2xf32>) -> vector<2x2xf32>
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.undef : vector<2xf32>
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.poison : vector<2xf32>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][0] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][1] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK: [[d00:%.+]] = llvm.insertelement {{%.+}}, [[undef]][{{.*}}] : vector<2xf32>
|
||||
// CHECK: [[d01:%.+]] = llvm.insertelement {{%.+}}, [[d00]][{{.*}}] : vector<2xf32>
|
||||
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.undef : vector<2xf32>
|
||||
// CHECK: [[undef:%.+]] = llvm.mlir.poison : vector<2xf32>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][2] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK-DAG: llvm.extractvalue [[d]][3] : !llvm.struct<(f32, f32, f32, f32)>
|
||||
// CHECK: [[d10:%.+]] = llvm.insertelement {{%.+}}, [[undef]][{{.*}}] : vector<2xf32>
|
||||
@@ -277,7 +277,7 @@ func.func @async_cp_zfill_f32_align4(
|
||||
%src: memref<128x128xf32>, %dst: memref<3x16x128xf32, 3>, %i : index, %srcElements : index) {
|
||||
// CHECK-DAG: %[[IDX1:.*]] = builtin.unrealized_conversion_cast %[[IDX]] : index to i64
|
||||
// CHECK-DAG: %[[SRC1:.*]] = builtin.unrealized_conversion_cast %[[SRCELEMENTS]] : index to i64
|
||||
// CHECK-DAG: %[[BASEDST:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[BASEDST:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[S2048:.*]] = llvm.mlir.constant(2048 : index) : i64
|
||||
// CHECK-DAG: %[[LI1:.*]] = llvm.mul %[[IDX1]], %[[S2048]] : i64
|
||||
// CHECK-DAG: %[[S0:.*]] = llvm.mlir.constant(128 : index) : i64
|
||||
@@ -285,7 +285,7 @@ func.func @async_cp_zfill_f32_align4(
|
||||
// CHECK-DAG: %[[FI1:.*]] = llvm.add %[[LI1]], %[[LI]] : i64
|
||||
// CHECK-DAG: %[[FI2:.*]] = llvm.add %[[FI1]], %[[IDX1]] : i64
|
||||
// CHECK-DAG: %[[ADDRESSDST:.*]] = llvm.getelementptr %[[BASEDST]][%[[FI2]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, f32
|
||||
// CHECK-DAG: %[[BASESRC:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[BASESRC:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S2:.*]] = llvm.mlir.constant(128 : index) : i64
|
||||
// CHECK-DAG: %[[FI2:.*]] = llvm.mul %[[IDX1]], %[[S2]] : i64
|
||||
// CHECK-DAG: %[[FI3:.*]] = llvm.add %[[FI2]], %[[IDX1]] : i64
|
||||
@@ -293,7 +293,7 @@ func.func @async_cp_zfill_f32_align4(
|
||||
// CHECK-DAG: %[[CAST2:.*]] = llvm.addrspacecast %[[ADDRESSSRC]] : !llvm.ptr to !llvm.ptr<1>
|
||||
// CHECK-DAG: %[[c1:.*]] = llvm.mlir.constant(3 : i32) : i32
|
||||
// CHECK-DAG: %[[c2:.*]] = llvm.mlir.constant(32 : i32) : i32
|
||||
// CHECK-DAG: %[[c3:.*]] = llvm.trunc %[[SRC1]] : i64 to i32
|
||||
// CHECK-DAG: %[[c3:.*]] = llvm.trunc %[[SRC1]] : i64 to i32
|
||||
// CHECK-DAG: %[[c4:.*]] = llvm.mul %[[c2]], %[[c3]] : i32
|
||||
// CHECK-DAG: %[[c5:.*]] = llvm.lshr %[[c4]], %[[c1]] : i32
|
||||
// CHECK-DAG: nvvm.cp.async.shared.global %[[ADDRESSDST]], %[[CAST2]], 16, cache = cg, %[[c5]]
|
||||
@@ -312,7 +312,7 @@ func.func @async_cp_zfill_f32_align1(
|
||||
%src: memref<128x128xf32>, %dst: memref<3x16x128xf32, 3>, %i : index, %srcElements : index) {
|
||||
// CHECK-DAG: %[[IDX1:.*]] = builtin.unrealized_conversion_cast %[[IDX]] : index to i64
|
||||
// CHECK-DAG: %[[SRC1:.*]] = builtin.unrealized_conversion_cast %[[SRCELEMENTS]] : index to i64
|
||||
// CHECK-DAG: %[[BASEDST:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[BASEDST:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[S2048:.*]] = llvm.mlir.constant(2048 : index) : i64
|
||||
// CHECK-DAG: %[[LI1:.*]] = llvm.mul %[[IDX1]], %[[S2048]] : i64
|
||||
// CHECK-DAG: %[[S0:.*]] = llvm.mlir.constant(128 : index) : i64
|
||||
@@ -320,7 +320,7 @@ func.func @async_cp_zfill_f32_align1(
|
||||
// CHECK-DAG: %[[FI1:.*]] = llvm.add %[[LI1]], %[[LI]] : i64
|
||||
// CHECK-DAG: %[[FI2:.*]] = llvm.add %[[FI1]], %[[IDX1]] : i64
|
||||
// CHECK-DAG: %[[ADDRESSDST:.*]] = llvm.getelementptr %[[BASEDST]][%[[FI2]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, f32
|
||||
// CHECK-DAG: %[[BASESRC:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[BASESRC:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S2:.*]] = llvm.mlir.constant(128 : index) : i64
|
||||
// CHECK-DAG: %[[FI2:.*]] = llvm.mul %[[IDX1]], %[[S2]] : i64
|
||||
// CHECK-DAG: %[[FI3:.*]] = llvm.add %[[FI2]], %[[IDX1]] : i64
|
||||
@@ -328,7 +328,7 @@ func.func @async_cp_zfill_f32_align1(
|
||||
// CHECK-DAG: %[[CAST2:.*]] = llvm.addrspacecast %[[ADDRESSSRC]] : !llvm.ptr to !llvm.ptr<1>
|
||||
// CHECK-DAG: %[[c1:.*]] = llvm.mlir.constant(3 : i32) : i32
|
||||
// CHECK-DAG: %[[c2:.*]] = llvm.mlir.constant(32 : i32) : i32
|
||||
// CHECK-DAG: %[[c3:.*]] = llvm.trunc %[[SRC1]] : i64 to i32
|
||||
// CHECK-DAG: %[[c3:.*]] = llvm.trunc %[[SRC1]] : i64 to i32
|
||||
// CHECK-DAG: %[[c4:.*]] = llvm.mul %[[c2]], %[[c3]] : i32
|
||||
// CHECK-DAG: %[[c5:.*]] = llvm.lshr %[[c4]], %[[c1]] : i32
|
||||
// CHECK-DAG: nvvm.cp.async.shared.global %[[ADDRESSDST]], %[[CAST2]], 4, cache = ca, %[[c5]]
|
||||
@@ -375,7 +375,7 @@ func.func @mma_sp_sync_f16_16832(%arg0: vector<4x2xf16>,
|
||||
|
||||
// CHECK-DAG: llvm.extractvalue %[[d]][0] : !llvm.struct<(vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK-DAG: llvm.extractvalue %[[d]][1] : !llvm.struct<(vector<2xf16>, vector<2xf16>)>
|
||||
// CHECK: llvm.mlir.undef : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK: llvm.mlir.poison : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK: llvm.insertvalue %{{.+}}, %{{.+}}[0] : !llvm.array<2 x vector<2xf16>>
|
||||
// CHECK: llvm.insertvalue %{{.+}}, %{{.+}}[1] : !llvm.array<2 x vector<2xf16>>
|
||||
return %d : vector<2x2xf16>
|
||||
@@ -484,22 +484,22 @@ func.func @mbarrier() {
|
||||
%barrier = nvgpu.mbarrier.create -> !barrierType
|
||||
|
||||
// CHECK: %[[barStr:.+]] = builtin.unrealized_conversion_cast %[[barMemref]] : memref<1xi64, 3> to !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr:.+]] = llvm.getelementptr %[[base]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.init.shared %[[barPtr]]
|
||||
nvgpu.mbarrier.init %barrier[%c0], %num_threads : !barrierType
|
||||
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr2:.+]] = llvm.getelementptr %[[base2]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: %[[token:.+]] = nvvm.mbarrier.arrive.shared %[[barPtr2]]
|
||||
%token = nvgpu.mbarrier.arrive %barrier[%c0] : !barrierType -> !tokenType
|
||||
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr3:.+]] = llvm.getelementptr %[[base3]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.test.wait.shared %[[barPtr3]], %[[token]]
|
||||
%isDone = nvgpu.mbarrier.test.wait %barrier[%c0], %token : !barrierType, !tokenType
|
||||
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @mbarrier_nocomplete
|
||||
@@ -514,22 +514,22 @@ func.func @mbarrier_nocomplete() {
|
||||
%barrier = nvgpu.mbarrier.create -> !barrierType
|
||||
|
||||
// CHECK: %[[barStr:.+]] = builtin.unrealized_conversion_cast %[[barMemref]] : memref<1xi64, 3> to !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr:.+]] = llvm.getelementptr %[[base]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.init.shared %[[barPtr]]
|
||||
nvgpu.mbarrier.init %barrier[%c0], %num_threads : !barrierType
|
||||
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr2:.+]] = llvm.getelementptr %[[base2]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: %[[token:.+]] = nvvm.mbarrier.arrive.nocomplete.shared %[[barPtr2]]
|
||||
%token = nvgpu.mbarrier.arrive.nocomplete %barrier[%c0], %count : !barrierType -> !tokenType
|
||||
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr3:.+]] = llvm.getelementptr %[[base3]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.test.wait.shared %[[barPtr3]], %[[token]]
|
||||
%isDone = nvgpu.mbarrier.test.wait %barrier[%c0], %token : !barrierType, !tokenType
|
||||
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @mbarrier_wait(
|
||||
@@ -542,13 +542,13 @@ func.func @mbarrier_wait(%barriers : !nvgpu.mbarrier.group<memorySpace = #gpu.ad
|
||||
%n = arith.constant 100 : index
|
||||
|
||||
%numBarriers = arith.constant 5 : index
|
||||
|
||||
|
||||
scf.for %i = %c0 to %n step %c1 {
|
||||
// CHECK: %[[c5:.+]] = arith.constant 5 : index
|
||||
// CHECK: scf.for %[[i:.*]] =
|
||||
// CHECK: %[[S2:.+]] = arith.remui %[[i]], %[[c5]] : index
|
||||
// CHECK: %[[S3:.+]] = builtin.unrealized_conversion_cast %[[S2]] : index to i64
|
||||
// CHECK: %[[S4:.+]] = llvm.extractvalue %[[CARG0]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[S4:.+]] = llvm.extractvalue %[[CARG0]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[S5:.+]] = llvm.getelementptr %[[S4]][%[[S3]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.test.wait.shared {{.*}}, %[[CARG1]]
|
||||
%mbarId = arith.remui %i, %numBarriers : index
|
||||
@@ -562,46 +562,46 @@ func.func @mbarrier_txcount() {
|
||||
%num_threads = arith.constant 128 : index
|
||||
// CHECK: %[[c0:.+]] = arith.constant 0 : index
|
||||
// CHECK: %[[mid:.+]] = builtin.unrealized_conversion_cast %[[c0]] : index to i64
|
||||
%c0 = arith.constant 0 : index
|
||||
%c0 = arith.constant 0 : index
|
||||
|
||||
// CHECK: %[[barMemref:.+]] = memref.get_global @__mbarrier{{.*}} : memref<1xi64, 3>
|
||||
%barrier = nvgpu.mbarrier.create -> !barrierType
|
||||
|
||||
// CHECK: %[[barStr:.+]] = builtin.unrealized_conversion_cast %[[barMemref]] : memref<1xi64, 3> to !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr:.+]] = llvm.getelementptr %[[base]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.init.shared %[[barPtr]]
|
||||
nvgpu.mbarrier.init %barrier[%c0], %num_threads : !barrierType
|
||||
|
||||
|
||||
%tidxreg = nvvm.read.ptx.sreg.tid.x : i32
|
||||
%tidx = arith.index_cast %tidxreg : i32 to index
|
||||
%cnd = arith.cmpi eq, %tidx, %c0 : index
|
||||
%cnd = arith.cmpi eq, %tidx, %c0 : index
|
||||
|
||||
scf.if %cnd {
|
||||
%txcount = arith.constant 256 : index
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr2:.+]] = llvm.getelementptr %[[base2]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.arrive.expect_tx.shared %[[barPtr2]]
|
||||
nvgpu.mbarrier.arrive.expect_tx %barrier[%c0], %txcount : !barrierType
|
||||
scf.yield
|
||||
scf.yield
|
||||
} else {
|
||||
%txcount = arith.constant 0 : index
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr2:.+]] = llvm.getelementptr %[[base2]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.arrive.expect_tx.shared %[[barPtr2]]
|
||||
nvgpu.mbarrier.arrive.expect_tx %barrier[%c0], %txcount : !barrierType
|
||||
scf.yield
|
||||
scf.yield
|
||||
}
|
||||
|
||||
|
||||
|
||||
%phase_c0 = arith.constant 0 : i1
|
||||
%ticks = arith.constant 10000000 : index
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr3:.+]] = llvm.getelementptr %[[base3]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.try_wait.parity.shared %[[barPtr3]]
|
||||
nvgpu.mbarrier.try_wait.parity %barrier[%c0], %phase_c0, %ticks : !barrierType
|
||||
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @mbarrier_txcount_pred
|
||||
@@ -611,7 +611,7 @@ func.func @mbarrier_txcount_pred() {
|
||||
// CHECK: %[[mid:.+]] = builtin.unrealized_conversion_cast %[[c0]] : index to i64
|
||||
// CHECK: %[[S2:.+]] = gpu.thread_id x
|
||||
// CHECK: %[[P:.+]] = arith.cmpi eq, %[[S2]], %[[c0]] : index
|
||||
%c0 = arith.constant 0 : index
|
||||
%c0 = arith.constant 0 : index
|
||||
%tidx = gpu.thread_id x
|
||||
%pred = arith.cmpi eq, %tidx, %c0 : index
|
||||
|
||||
@@ -619,25 +619,25 @@ func.func @mbarrier_txcount_pred() {
|
||||
%barrier = nvgpu.mbarrier.create -> !barrierType
|
||||
|
||||
// CHECK: %[[barStr:.+]] = builtin.unrealized_conversion_cast %[[barMemref]] : memref<1xi64, 3> to !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr:.+]] = llvm.getelementptr %[[base]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.init.shared %[[barPtr]], {{.*}}, predicate = %[[P]]
|
||||
nvgpu.mbarrier.init %barrier[%c0], %mine, predicate = %pred : !barrierType
|
||||
|
||||
|
||||
%txcount = arith.constant 256 : index
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base2:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr2:.+]] = llvm.getelementptr %[[base2]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.arrive.expect_tx.shared %[[barPtr2]], {{.*}}, predicate = %[[P]]
|
||||
nvgpu.mbarrier.arrive.expect_tx %barrier[%c0], %txcount, predicate = %pred : !barrierType
|
||||
|
||||
%phase_c0 = arith.constant 0 : i1
|
||||
%ticks = arith.constant 10000000 : index
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[base3:.+]] = llvm.extractvalue %[[barStr]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<1 x i64>, array<1 x i64>)>
|
||||
// CHECK: %[[barPtr3:.+]] = llvm.getelementptr %[[base3]][%[[mid]]] : (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, i64
|
||||
// CHECK: nvvm.mbarrier.try_wait.parity.shared %[[barPtr3]]
|
||||
nvgpu.mbarrier.try_wait.parity %barrier[%c0], %phase_c0, %ticks : !barrierType
|
||||
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @async_tma_load
|
||||
@@ -647,27 +647,27 @@ func.func @mbarrier_txcount_pred() {
|
||||
!tensorMap4d = !nvgpu.tensormap.descriptor<tensor = memref<2x2x32x32xf32,3>, swizzle=swizzle_128b,l2promo = l2promo_128b,oob = zero, interleave = none>
|
||||
!tensorMap5d = !nvgpu.tensormap.descriptor<tensor = memref<2x2x2x32x32xf32,3>, swizzle=none, l2promo = none, oob = zero, interleave = none>
|
||||
!mbarrier = !nvgpu.mbarrier.group<memorySpace = #gpu.address_space<workgroup>>
|
||||
func.func @async_tma_load(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
func.func @async_tma_load(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
%buffer5d: memref<2x2x2x32x32xf32,3>,
|
||||
%mbarrier: !mbarrier) {
|
||||
%c0 = arith.constant 0 : index
|
||||
%crd0 = arith.constant 0 : index
|
||||
%crd1 = arith.constant 0 : index
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap1d[%crd0], %mbarrier[%c0] to %buffer1d : !tensorMap1d, !mbarrier -> memref<128xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap2d[%crd0, %crd1], %mbarrier[%c0] to %buffer2d : !tensorMap2d, !mbarrier -> memref<32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap3d[%crd0, %crd1, %crd0], %mbarrier[%c0] to %buffer3d : !tensorMap3d, !mbarrier -> memref<2x32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap4d[%crd0, %crd1, %crd1, %crd0], %mbarrier[%c0] to %buffer4d : !tensorMap4d, !mbarrier -> memref<2x2x32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap5d[%crd0, %crd1, %crd1, %crd0, %crd0], %mbarrier[%c0] to %buffer5d : !tensorMap5d, !mbarrier -> memref<2x2x2x32x32xf32,3>
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @async_tma_load
|
||||
@@ -678,17 +678,17 @@ func.func @async_tma_load_gpu_address_space(%tensorMap1d: !tensorMap1dgpuspace,
|
||||
%c0 = arith.constant 0 : index
|
||||
%crd0 = arith.constant 0 : index
|
||||
%crd1 = arith.constant 0 : index
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap1d[%crd0], %mbarrier[%c0] to %buffer1d : !tensorMap1dgpuspace, !mbarrier -> memref<128xf32,#gpu.address_space<workgroup>>
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @async_tma_load_pred
|
||||
func.func @async_tma_load_pred(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
func.func @async_tma_load_pred(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
%buffer5d: memref<2x2x2x32x32xf32,3>,
|
||||
%mbarrier: !mbarrier,
|
||||
%p: i1) {
|
||||
@@ -705,61 +705,61 @@ func.func @async_tma_load_pred(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensor
|
||||
nvgpu.tma.async.load %tensorMap4d[%crd0, %crd1, %crd1, %crd0], %mbarrier[%c0] to %buffer4d, predicate = %p : !tensorMap4d, !mbarrier -> memref<2x2x32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}] predicate = %{{.*}}
|
||||
nvgpu.tma.async.load %tensorMap5d[%crd0, %crd1, %crd1, %crd0, %crd0], %mbarrier[%c0] to %buffer5d, predicate = %p : !tensorMap5d, !mbarrier -> memref<2x2x2x32x32xf32,3>
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
func.func @async_tma_load_multicast(
|
||||
%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d,
|
||||
%tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d,
|
||||
%tensorMap5d: !tensorMap5d, %buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>, %buffer3d: memref<2x32x32xf32,3>,
|
||||
%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d,
|
||||
%tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d,
|
||||
%tensorMap5d: !tensorMap5d, %buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>, %buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>, %buffer5d: memref<2x2x2x32x32xf32,3>,
|
||||
%mbarrier: !mbarrier,
|
||||
%multicastMask: i16) {
|
||||
%c0 = arith.constant 0 : index
|
||||
%crd0 = arith.constant 0 : index
|
||||
%crd1 = arith.constant 0 : index
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap1d[%crd0], %mbarrier[%c0] to %buffer1d multicast_mask = %multicastMask : !tensorMap1d, !mbarrier -> memref<128xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap2d[%crd0, %crd1], %mbarrier[%c0] to %buffer2d multicast_mask = %multicastMask : !tensorMap2d, !mbarrier -> memref<32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap3d[%crd0, %crd1, %crd0], %mbarrier[%c0] to %buffer3d multicast_mask = %multicastMask : !tensorMap3d, !mbarrier -> memref<2x32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap4d[%crd0, %crd1, %crd1, %crd0], %mbarrier[%c0] to %buffer4d multicast_mask = %multicastMask : !tensorMap4d, !mbarrier -> memref<2x2x32x32xf32,3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %{{.*}}, %{{.*}}, %{{.*}} box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.load %tensorMap5d[%crd0, %crd1, %crd1, %crd0, %crd0], %mbarrier[%c0] to %buffer5d multicast_mask = %multicastMask : !tensorMap5d, !mbarrier -> memref<2x2x2x32x32xf32,3>
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
func.func @async_tma_store(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
func.func @async_tma_store(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
%buffer5d: memref<2x2x2x32x32xf32,3>) {
|
||||
%c0 = arith.constant 0 : index
|
||||
%crd0 = arith.constant 0 : index
|
||||
%crd1 = arith.constant 0 : index
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}]
|
||||
nvgpu.tma.async.store %buffer1d to %tensorMap1d[%crd0] : memref<128xf32,3> -> !tensorMap1d
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}]
|
||||
nvgpu.tma.async.store %buffer1d to %tensorMap1d[%crd0] : memref<128xf32,3> -> !tensorMap1d
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.store %buffer2d to %tensorMap2d[%crd0, %crd1] : memref<32x32xf32,3> -> !tensorMap2d
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.store %buffer3d to %tensorMap3d[%crd0, %crd1, %crd0] : memref<2x32x32xf32,3> -> !tensorMap3d
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.store %buffer4d to %tensorMap4d[%crd0, %crd1, %crd1, %crd0] : memref<2x2x32x32xf32,3> -> !tensorMap4d
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}]
|
||||
nvgpu.tma.async.store %buffer5d to %tensorMap5d[%crd0, %crd1, %crd1, %crd0, %crd0] : memref<2x2x2x32x32xf32,3> -> !tensorMap5d
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
|
||||
func.func @async_tma_store_predicate(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
func.func @async_tma_store_predicate(%tensorMap1d: !tensorMap1d, %tensorMap2d: !tensorMap2d, %tensorMap3d: !tensorMap3d, %tensorMap4d: !tensorMap4d, %tensorMap5d: !tensorMap5d,
|
||||
%buffer1d: memref<128xf32,3>,
|
||||
%buffer2d: memref<32x32xf32,3>,
|
||||
%buffer3d: memref<2x32x32xf32,3>,
|
||||
%buffer4d: memref<2x2x32x32xf32,3>,
|
||||
%buffer5d: memref<2x2x2x32x32xf32,3>,
|
||||
%p: i1) {
|
||||
%c0 = arith.constant 0 : index
|
||||
@@ -775,7 +775,7 @@ func.func @async_tma_store_predicate(%tensorMap1d: !tensorMap1d, %tensorMap2d: !
|
||||
nvgpu.tma.async.store %buffer4d to %tensorMap4d[%crd0, %crd1, %crd1, %crd0], predicate = %p : memref<2x2x32x32xf32,3> -> !tensorMap4d
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.global.shared.cta %{{.*}} %{{.*}}, box[%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}], predicate = %{{.*}}
|
||||
nvgpu.tma.async.store %buffer5d to %tensorMap5d[%crd0, %crd1, %crd1, %crd0, %crd0], predicate = %p : memref<2x2x2x32x32xf32,3> -> !tensorMap5d
|
||||
func.return
|
||||
func.return
|
||||
}
|
||||
|
||||
func.func @create_tensor_map(%devicePtr2d : memref<64x128xf32>, %devicePtr1d : memref<128xf32>) {
|
||||
@@ -791,7 +791,7 @@ func.func @create_tensor_map(%devicePtr2d : memref<64x128xf32>, %devicePtr1d : m
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @tma_prefetch(
|
||||
// CHECK-LABEL: @tma_prefetch(
|
||||
// CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: !nvgpu.tensormap.descriptor<tensor = memref<128xf32, 3>, swizzle = none, l2promo = none, oob = nan, interleave = none>, %[[arg1:[a-zA-Z0-9_]+]]: i1
|
||||
func.func @tma_prefetch(%tensorMap1d: !tensorMap1d, %p : i1) {
|
||||
// CHECK: %[[S0:.+]] = builtin.unrealized_conversion_cast %[[arg0]] : !nvgpu.tensormap.descriptor<tensor = memref<128xf32, 3>, swizzle = none, l2promo = none, oob = nan, interleave = none> to !llvm.ptr
|
||||
@@ -818,7 +818,7 @@ module @mymodule {
|
||||
%rhsShmem = memref.subview %rhsShmem3[0, 0, 0][1, 64, 64][1, 1, 1] : memref<1x64x64xf16, strided<[4096, 64, 1], offset: 8192>, 3> to memref<64x64xf16, strided<[64, 1], offset: 8192>, 3>
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global
|
||||
nvgpu.tma.async.load %lhsTensorMap[%c0, %c0], %mbarrier[%c0] to %lhsShmem : !lhsTensorMap, !barrierType -> memref<128x64xf16,3>
|
||||
// CHECK: %[[desc:.+]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[desc:.+]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[c8192:.+]] = llvm.mlir.constant(8192 : index) : i64
|
||||
// CHECK: %[[shmemOfset:.+]] = llvm.getelementptr %[[desc]][%[[c8192]]] : (!llvm.ptr<3>, i64)
|
||||
// CHECK: nvvm.cp.async.bulk.tensor.shared.cluster.global %[[shmemOfset]], %{{.*}}, %{{.*}}, box[%{{.*}}, %{{.*}}]
|
||||
@@ -838,7 +838,7 @@ func.func @create_wgmma_descriptor(%tensorMap : !tensorMap) -> !nvgpu.warpgroup.
|
||||
// CHECK: %[[S1:.+]] = builtin.unrealized_conversion_cast %[[Sre]] : memref<128x64xf16, 3> to !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[c64:.+]] = llvm.mlir.constant(64 : i64) : i64
|
||||
// CHECK: %[[c1024:.+]] = llvm.mlir.constant(1024 : i64) : i64
|
||||
// CHECK: %[[S2:.+]] = llvm.extractvalue %[[S1]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[S2:.+]] = llvm.extractvalue %[[S1]][1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[S3:.+]] = llvm.ptrtoint %[[S2]] : !llvm.ptr<3> to i64
|
||||
// CHECK: %[[S4:.+]] = llvm.mlir.constant(46 : i64) : i64
|
||||
// CHECK: %[[S5:.+]] = llvm.shl %[[S3]], %[[S4]] : i64
|
||||
@@ -862,25 +862,25 @@ func.func @create_wgmma_descriptor(%tensorMap : !tensorMap) -> !nvgpu.warpgroup.
|
||||
// CHECK: %[[S25:.+]] = llvm.mlir.constant(0 : i64) : i64
|
||||
// CHECK: %[[S26:.+]] = llvm.shl %[[S7]], %[[S25]] : i64
|
||||
// CHECK: %[[S27:.+]] = llvm.or %[[S24]], %[[S26]] : i64
|
||||
// CHECK: %[[ret:.+]] = builtin.unrealized_conversion_cast %[[S27]] : i64 to !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>
|
||||
// CHECK: %[[ret:.+]] = builtin.unrealized_conversion_cast %[[S27]] : i64 to !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>
|
||||
// CHECK: return %[[ret]]
|
||||
%descA = nvgpu.warpgroup.generate.descriptor %lhsShmem, %tensorMap : memref<128x64xf16,3>, !tensorMap -> !nvgpu.warpgroup.descriptor<tensor=memref<128x64xf16,3>>
|
||||
func.return %descA : !nvgpu.warpgroup.descriptor<tensor=memref<128x64xf16,3>>
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @warpgroup_mma_128_128_64(
|
||||
// CHECK-LABEL: @warpgroup_mma_128_128_64(
|
||||
// CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>, %[[arg1:[a-zA-Z0-9_]+]]: !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>, %[[arg2:[a-zA-Z0-9_]+]]: !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>)
|
||||
func.func @warpgroup_mma_128_128_64(
|
||||
%descA: !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
%descB: !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
%acc: !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>)
|
||||
%descA: !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
%descB: !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
%acc: !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>)
|
||||
{
|
||||
// CHECK-DAG: %[[S0:.+]] = builtin.unrealized_conversion_cast %[[arg0]] : !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>> to i64
|
||||
// CHECK-DAG: %[[S1:.+]] = builtin.unrealized_conversion_cast %[[arg1]] : !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>> to i64
|
||||
// CHECK-DAG: %[[ARG:.+]] = builtin.unrealized_conversion_cast %[[arg2]] : !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>> to !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: nvvm.wgmma.fence.aligned
|
||||
// CHECK: %[[UD:.+]] = llvm.mlir.undef : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S2:.+]] = llvm.extractvalue %[[ARG]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[UD:.+]] = llvm.mlir.poison : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S2:.+]] = llvm.extractvalue %[[ARG]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S4:.+]] = nvvm.wgmma.mma_async %[[S0]], %[[S1]], %[[S2]], <m = 64, n = 128, k = 16>, D[<f32>, <one>, <wrapped>], A[<f16>, <one>, <row>], B[<f16>, <one>, <row>] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)> -> !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S5:.+]] = llvm.mlir.constant(2 : i32) : i64
|
||||
// CHECK: %[[S6:.+]] = llvm.add %[[S0]], %[[S5]] : i64
|
||||
@@ -897,7 +897,7 @@ func.func @warpgroup_mma_128_128_64(
|
||||
// CHECK: %[[S17:.+]] = llvm.mlir.constant(384 : i32) : i64
|
||||
// CHECK: %[[S18:.+]] = llvm.add %[[S1]], %[[S17]] : i64
|
||||
// CHECK: %[[S19:.+]] = nvvm.wgmma.mma_async %[[S16]], %[[S18]], %[[S14]], <m = 64, n = 128, k = 16>, D[<f32>, <one>, <wrapped>], A[<f16>, <one>, <row>], B[<f16>, <one>, <row>] : !llvm.struct
|
||||
// CHECK: %[[S3:.+]] = llvm.extractvalue %[[ARG]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S3:.+]] = llvm.extractvalue %[[ARG]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S21:.+]] = llvm.mlir.constant(512 : i32) : i64
|
||||
// CHECK: %[[S22:.+]] = llvm.add %[[S0]], %[[S21]] : i64
|
||||
// CHECK: %[[S23:.+]] = nvvm.wgmma.mma_async %[[S22]], %[[S1]], %[[S3]], <m = 64, n = 128, k = 16>, D[<f32>, <one>, <wrapped>], A[<f16>, <one>, <row>], B[<f16>, <one>, <row>] : !llvm.struct
|
||||
@@ -916,26 +916,26 @@ func.func @warpgroup_mma_128_128_64(
|
||||
// CHECK: %[[S36:.+]] = llvm.mlir.constant(384 : i32) : i64
|
||||
// CHECK: %[[S37:.+]] = llvm.add %[[S1]], %[[S36]] : i64
|
||||
// CHECK: %[[S38:.+]] = nvvm.wgmma.mma_async %[[S35]], %[[S37]], %[[S33]], <m = 64, n = 128, k = 16>, D[<f32>, <one>, <wrapped>], A[<f16>, <one>, <row>], B[<f16>, <one>, <row>] : !llvm.struct
|
||||
// CHECK: %[[S40:.+]] = llvm.insertvalue %[[S19]], %[[UD]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S41:.+]] = llvm.insertvalue %[[S38]], %[[S40]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S40:.+]] = llvm.insertvalue %[[S19]], %[[UD]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S41:.+]] = llvm.insertvalue %[[S38]], %[[S40]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: nvvm.wgmma.commit.group.sync.aligned
|
||||
// CHECK: nvvm.wgmma.wait.group.sync.aligned 1
|
||||
%wgmmaResult = nvgpu.warpgroup.mma %descA, %descB, %acc {transposeB}:
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
->
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
// CHECK: nvvm.wgmma.wait.group.sync.aligned 1
|
||||
%wgmmaResult = nvgpu.warpgroup.mma %descA, %descB, %acc {transposeB}:
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
->
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @warpgroup_mma_store(
|
||||
// CHECK-LABEL: @warpgroup_mma_store(
|
||||
// CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>, %[[arg2:[a-zA-Z0-9_]+]]: memref<128x128xf32, 3>)
|
||||
func.func @warpgroup_mma_store(
|
||||
%result : !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>,
|
||||
%result : !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>,
|
||||
%matrixD: memref<128x128xf32,3>) {
|
||||
// CHECK: %[[S0:.+]] = builtin.unrealized_conversion_cast %[[arg0]] : !nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>> to !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[EX1:.+]] = llvm.extractvalue %[[S0]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[EX1:.+]] = llvm.extractvalue %[[S0]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S6:.+]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[S5:.+]] = llvm.mlir.constant(2 : i32) : i32
|
||||
// CHECK: %[[S2:.+]] = llvm.mlir.constant(4 : i32) : i32
|
||||
@@ -982,7 +982,7 @@ func.func @warpgroup_mma_store(
|
||||
// CHECK: memref.store %[[S35]], %[[arg2]][%[[S31]], %[[S32]]] : memref<128x128xf32, 3>
|
||||
// CHECK: memref.store %[[S36]], %[[arg2]][%[[S31]], %[[S34]]] : memref<128x128xf32, 3>
|
||||
|
||||
// ### Store {d4, d5} of each thread ###
|
||||
// ### Store {d4, d5} of each thread ###
|
||||
|
||||
// CHECK: %[[S37:.+]] = llvm.mlir.constant(2 : i32) : i32
|
||||
// CHECK: %[[S38:.+]] = llvm.mul %[[S37]], %[[S4]] : i32
|
||||
@@ -996,7 +996,7 @@ func.func @warpgroup_mma_store(
|
||||
// CHECK: memref.store %[[S44]], %[[arg2]][%[[S40]], %[[S41]]] : memref<128x128xf32, 3>
|
||||
// CHECK: memref.store %[[S45]], %[[arg2]][%[[S40]], %[[S43]]] : memref<128x128xf32, 3>
|
||||
|
||||
// ### Store {d6, d7} of each thread ###
|
||||
// ### Store {d6, d7} of each thread ###
|
||||
|
||||
// CHECK: %[[S46:.+]] = llvm.mlir.constant(3 : i32) : i32
|
||||
// CHECK: %[[S47:.+]] = llvm.mul %[[S46]], %[[S4]] : i32
|
||||
@@ -1015,8 +1015,8 @@ func.func @warpgroup_mma_store(
|
||||
// CHECK: %[[c1:.+]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[c2:.+]] = llvm.mlir.constant(2 : i32) : i32
|
||||
|
||||
// ### Store {d64, d65} of each thread ###
|
||||
// CHECK: %[[EX2:.+]] = llvm.extractvalue %[[S0]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// ### Store {d64, d65} of each thread ###
|
||||
// CHECK: %[[EX2:.+]] = llvm.extractvalue %[[S0]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S315:.+]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[S312:.+]] = llvm.mlir.constant(2 : i32) : i32
|
||||
// CHECK: %[[S311:.+]] = llvm.mlir.constant(4 : i32) : i32
|
||||
@@ -1043,83 +1043,83 @@ func.func @warpgroup_mma_store(
|
||||
// CHECK: %[[S334:.+]] = arith.index_cast %[[S332]] : i32 to index
|
||||
// CHECK: %[[S335:.+]] = llvm.add %[[S332]], %[[S315]] : i32
|
||||
// CHECK: %[[S336:.+]] = arith.index_cast %[[S335]] : i32 to index
|
||||
// CHECK: %[[S337:.+]] = llvm.extractvalue %[[EX2]][0]
|
||||
// CHECK: %[[S338:.+]] = llvm.extractvalue %[[EX2]][1]
|
||||
// CHECK: %[[S337:.+]] = llvm.extractvalue %[[EX2]][0]
|
||||
// CHECK: %[[S338:.+]] = llvm.extractvalue %[[EX2]][1]
|
||||
// CHECK: memref.store %[[S337]], %[[arg2]][%[[S333]], %[[S334]]] : memref<128x128xf32, 3>
|
||||
// CHECK: memref.store %[[S338]], %[[arg2]][%[[S333]], %[[S336]]] : memref<128x128xf32, 3>
|
||||
|
||||
// Pattern continues similarly 31x times until {... d126, d127}
|
||||
|
||||
nvgpu.warpgroup.mma.store %result, %matrixD :
|
||||
!nvgpu.warpgroup.accumulator< fragmented = vector<128x128xf32>>
|
||||
nvgpu.warpgroup.mma.store %result, %matrixD :
|
||||
!nvgpu.warpgroup.accumulator< fragmented = vector<128x128xf32>>
|
||||
to memref<128x128xf32,3>
|
||||
return
|
||||
return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @warpgroup_mma_store_multiple
|
||||
func.func @warpgroup_mma_store_multiple(
|
||||
%shmem_m64n8k : memref<64x8xf32>,
|
||||
%shmem_m64n16k : memref<64x16xf32>,
|
||||
%shmem_m64n24k : memref<64x24xf32>,
|
||||
%shmem_m64n32k : memref<64x32xf32>,
|
||||
%shmem_m64n40k : memref<64x40xf32>,
|
||||
%shmem_m64n48k : memref<64x48xf32>,
|
||||
%shmem_m64n56k : memref<64x56xf32>,
|
||||
%shmem_m64n64k : memref<64x64xf32>,
|
||||
%shmem_m64n72k : memref<64x72xf32>,
|
||||
%shmem_m64n80k : memref<64x80xf32>,
|
||||
%shmem_m64n88k : memref<64x88xf32>,
|
||||
%shmem_m64n96k : memref<64x96xf32>,
|
||||
%shmem_m64n104k : memref<64x104xf32>,
|
||||
%shmem_m64n112k : memref<64x112xf32>,
|
||||
%shmem_m64n120k : memref<64x120xf32>,
|
||||
%shmem_m64n128k : memref<64x128xf32>,
|
||||
%shmem_m64n136k : memref<64x136xf32>,
|
||||
%shmem_m64n144k : memref<64x144xf32>,
|
||||
%shmem_m64n152k : memref<64x152xf32>,
|
||||
%shmem_m64n160k : memref<64x160xf32>,
|
||||
%shmem_m64n168k : memref<64x168xf32>,
|
||||
%shmem_m64n176k : memref<64x176xf32>,
|
||||
%shmem_m64n184k : memref<64x184xf32>,
|
||||
%shmem_m64n192k : memref<64x192xf32>,
|
||||
%shmem_m64n200k : memref<64x200xf32>,
|
||||
%shmem_m64n208k : memref<64x208xf32>,
|
||||
%shmem_m64n216k : memref<64x216xf32>,
|
||||
%shmem_m64n224k : memref<64x224xf32>,
|
||||
%shmem_m64n232k : memref<64x232xf32>,
|
||||
%shmem_m64n240k : memref<64x240xf32>,
|
||||
%shmem_m64n248k : memref<64x248xf32>,
|
||||
%shmem_m64n256k : memref<64x256xf32>,
|
||||
%res_m64n16k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x16xf32>>,
|
||||
%res_m64n24k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x24xf32>>,
|
||||
%res_m64n32k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x32xf32>>,
|
||||
%res_m64n40k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x40xf32>>,
|
||||
%res_m64n48k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x48xf32>>,
|
||||
%res_m64n56k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x56xf32>>,
|
||||
%res_m64n64k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x64xf32>>,
|
||||
%res_m64n72k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x72xf32>>,
|
||||
%res_m64n80k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x80xf32>>,
|
||||
%res_m64n88k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x88xf32>>,
|
||||
%res_m64n96k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x96xf32>>,
|
||||
%res_m64n104k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x104xf32>>,
|
||||
%res_m64n112k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x112xf32>>,
|
||||
%res_m64n120k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x120xf32>>,
|
||||
%res_m64n128k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x128xf32>>,
|
||||
%res_m64n136k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x136xf32>>,
|
||||
%res_m64n144k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x144xf32>>,
|
||||
%res_m64n152k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x152xf32>>,
|
||||
%res_m64n160k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x160xf32>>,
|
||||
%res_m64n168k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x168xf32>>,
|
||||
%res_m64n176k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x176xf32>>,
|
||||
%res_m64n184k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x184xf32>>,
|
||||
%res_m64n192k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x192xf32>>,
|
||||
%res_m64n200k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x200xf32>>,
|
||||
%res_m64n208k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x208xf32>>,
|
||||
%res_m64n216k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x216xf32>>,
|
||||
%res_m64n224k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x224xf32>>,
|
||||
%res_m64n232k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x232xf32>>,
|
||||
%res_m64n240k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x240xf32>>,
|
||||
%res_m64n248k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x248xf32>>,
|
||||
%shmem_m64n8k : memref<64x8xf32>,
|
||||
%shmem_m64n16k : memref<64x16xf32>,
|
||||
%shmem_m64n24k : memref<64x24xf32>,
|
||||
%shmem_m64n32k : memref<64x32xf32>,
|
||||
%shmem_m64n40k : memref<64x40xf32>,
|
||||
%shmem_m64n48k : memref<64x48xf32>,
|
||||
%shmem_m64n56k : memref<64x56xf32>,
|
||||
%shmem_m64n64k : memref<64x64xf32>,
|
||||
%shmem_m64n72k : memref<64x72xf32>,
|
||||
%shmem_m64n80k : memref<64x80xf32>,
|
||||
%shmem_m64n88k : memref<64x88xf32>,
|
||||
%shmem_m64n96k : memref<64x96xf32>,
|
||||
%shmem_m64n104k : memref<64x104xf32>,
|
||||
%shmem_m64n112k : memref<64x112xf32>,
|
||||
%shmem_m64n120k : memref<64x120xf32>,
|
||||
%shmem_m64n128k : memref<64x128xf32>,
|
||||
%shmem_m64n136k : memref<64x136xf32>,
|
||||
%shmem_m64n144k : memref<64x144xf32>,
|
||||
%shmem_m64n152k : memref<64x152xf32>,
|
||||
%shmem_m64n160k : memref<64x160xf32>,
|
||||
%shmem_m64n168k : memref<64x168xf32>,
|
||||
%shmem_m64n176k : memref<64x176xf32>,
|
||||
%shmem_m64n184k : memref<64x184xf32>,
|
||||
%shmem_m64n192k : memref<64x192xf32>,
|
||||
%shmem_m64n200k : memref<64x200xf32>,
|
||||
%shmem_m64n208k : memref<64x208xf32>,
|
||||
%shmem_m64n216k : memref<64x216xf32>,
|
||||
%shmem_m64n224k : memref<64x224xf32>,
|
||||
%shmem_m64n232k : memref<64x232xf32>,
|
||||
%shmem_m64n240k : memref<64x240xf32>,
|
||||
%shmem_m64n248k : memref<64x248xf32>,
|
||||
%shmem_m64n256k : memref<64x256xf32>,
|
||||
%res_m64n16k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x16xf32>>,
|
||||
%res_m64n24k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x24xf32>>,
|
||||
%res_m64n32k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x32xf32>>,
|
||||
%res_m64n40k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x40xf32>>,
|
||||
%res_m64n48k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x48xf32>>,
|
||||
%res_m64n56k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x56xf32>>,
|
||||
%res_m64n64k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x64xf32>>,
|
||||
%res_m64n72k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x72xf32>>,
|
||||
%res_m64n80k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x80xf32>>,
|
||||
%res_m64n88k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x88xf32>>,
|
||||
%res_m64n96k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x96xf32>>,
|
||||
%res_m64n104k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x104xf32>>,
|
||||
%res_m64n112k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x112xf32>>,
|
||||
%res_m64n120k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x120xf32>>,
|
||||
%res_m64n128k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x128xf32>>,
|
||||
%res_m64n136k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x136xf32>>,
|
||||
%res_m64n144k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x144xf32>>,
|
||||
%res_m64n152k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x152xf32>>,
|
||||
%res_m64n160k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x160xf32>>,
|
||||
%res_m64n168k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x168xf32>>,
|
||||
%res_m64n176k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x176xf32>>,
|
||||
%res_m64n184k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x184xf32>>,
|
||||
%res_m64n192k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x192xf32>>,
|
||||
%res_m64n200k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x200xf32>>,
|
||||
%res_m64n208k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x208xf32>>,
|
||||
%res_m64n216k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x216xf32>>,
|
||||
%res_m64n224k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x224xf32>>,
|
||||
%res_m64n232k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x232xf32>>,
|
||||
%res_m64n240k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x240xf32>>,
|
||||
%res_m64n248k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x248xf32>>,
|
||||
%res_m64n256k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x256xf32>>) {
|
||||
// CHECK-COUNT-8: memref.store %{{.*}}, %{{.*}}[%{{.*}}, %{{.*}}] : memref<64x16xf32>
|
||||
// CHECK-COUNT-12: memref.store %{{.*}}, %{{.*}}[%{{.*}}, %{{.*}}] : memref<64x24xf32>
|
||||
@@ -1183,13 +1183,13 @@ func.func @warpgroup_mma_store_multiple(
|
||||
nvgpu.warpgroup.mma.store %res_m64n240k, %shmem_m64n240k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x240xf32>> to memref<64x240xf32>
|
||||
nvgpu.warpgroup.mma.store %res_m64n248k, %shmem_m64n248k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x248xf32>> to memref<64x248xf32>
|
||||
nvgpu.warpgroup.mma.store %res_m64n256k, %shmem_m64n256k : !nvgpu.warpgroup.accumulator<fragmented = vector<64x256xf32>> to memref<64x256xf32>
|
||||
return
|
||||
return
|
||||
}
|
||||
|
||||
func.func @warpgroup_mma_init() {
|
||||
//CHECK: %[[S1:.+]] = llvm.mlir.constant(0.000000e+00 : f32) : f3
|
||||
//CHECK: %[[S0:.+]] = llvm.mlir.undef : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
//CHECK: %[[EX:.+]] = llvm.extractvalue %[[S0]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
//CHECK: %[[S0:.+]] = llvm.mlir.poison : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
//CHECK: %[[EX:.+]] = llvm.extractvalue %[[S0]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
//CHECK: %[[S2:.+]] = llvm.insertvalue %[[S1]], %[[EX]][0] : !llvm.struct
|
||||
//CHECK: %[[S3:.+]] = llvm.insertvalue %[[S1]], %[[S2]][1] : !llvm.struct
|
||||
//CHECK: %[[S4:.+]] = llvm.insertvalue %[[S1]], %[[S3]][2] : !llvm.struct
|
||||
@@ -1255,50 +1255,50 @@ func.func @warpgroup_mma_init() {
|
||||
//CHECK: %[[S64:.+]] = llvm.insertvalue %[[S1]], %[[S63]][62] : !llvm.struct
|
||||
//CHECK: %[[S65:.+]] = llvm.insertvalue %[[S1]], %[[S64]][63] : !llvm.struct
|
||||
%matrixC = nvgpu.warpgroup.mma.init.accumulator -> !nvgpu.warpgroup.accumulator< fragmented = vector<128x128xf32>>
|
||||
return
|
||||
return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @warpgroup_matrix_multiply_m128n128k64(
|
||||
// CHECK-LABEL: @warpgroup_matrix_multiply_m128n128k64(
|
||||
// CHECK-SAME: %[[arg0:[a-zA-Z0-9_]+]]: !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>, %[[arg1:[a-zA-Z0-9_]+]]: !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>, %[[arg2:[a-zA-Z0-9_]+]]: memref<128x128xf32, 3>)
|
||||
func.func @warpgroup_matrix_multiply_m128n128k64(
|
||||
%descA: !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
%descA: !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
%descB: !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
%shmemD: memref<128x128xf32, 3>)
|
||||
%shmemD: memref<128x128xf32, 3>)
|
||||
{
|
||||
// Init
|
||||
%matrixC = nvgpu.warpgroup.mma.init.accumulator ->
|
||||
%matrixC = nvgpu.warpgroup.mma.init.accumulator ->
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
|
||||
// GEMM
|
||||
%matrixD = nvgpu.warpgroup.mma %descA, %descB, %matrixC {transposeB}:
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
->
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
%matrixD = nvgpu.warpgroup.mma %descA, %descB, %matrixC {transposeB}:
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>>,
|
||||
!nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>>,
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
->
|
||||
!nvgpu.warpgroup.accumulator<fragmented = vector<128x128xf32>>
|
||||
|
||||
|
||||
// Epilogue
|
||||
nvgpu.warpgroup.mma.store %matrixD, %shmemD :
|
||||
!nvgpu.warpgroup.accumulator< fragmented = vector<128x128xf32>>
|
||||
// Epilogue
|
||||
nvgpu.warpgroup.mma.store %matrixD, %shmemD :
|
||||
!nvgpu.warpgroup.accumulator< fragmented = vector<128x128xf32>>
|
||||
to memref<128x128xf32,3>
|
||||
|
||||
|
||||
// CHECK-DAG: %[[S0:.+]] = builtin.unrealized_conversion_cast %[[arg0]] : !nvgpu.warpgroup.descriptor<tensor = memref<128x64xf16, 3>> to i64
|
||||
// CHECK-DAG: %[[S1:.+]] = builtin.unrealized_conversion_cast %[[arg1]] : !nvgpu.warpgroup.descriptor<tensor = memref<64x128xf16, 3>> to i64
|
||||
// CHECK: %[[S3:.+]] = llvm.mlir.constant(0.000000e+00 : f32) : f32
|
||||
// CHECK: %[[S4:.+]] = llvm.mlir.undef : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S5:.+]] = llvm.extractvalue %[[S4]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S6:.+]] = llvm.insertvalue %[[S3]], %[[S5]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S68:.+]] = llvm.insertvalue %[[S3]], %{{.*}}[63] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S69:.+]] = llvm.extractvalue %[[S4]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S71:.+]] = llvm.insertvalue %[[S3]], %[[S69]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S134:.+]] = llvm.insertvalue %[[S3]], %{{.*}}[63] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S135:.+]] = llvm.insertvalue %[[S68]], %[[S4]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S136:.+]] = llvm.insertvalue %[[S134]], %[[S135]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S4:.+]] = llvm.mlir.poison : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S5:.+]] = llvm.extractvalue %[[S4]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S6:.+]] = llvm.insertvalue %[[S3]], %[[S5]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S68:.+]] = llvm.insertvalue %[[S3]], %{{.*}}[63] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S69:.+]] = llvm.extractvalue %[[S4]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S71:.+]] = llvm.insertvalue %[[S3]], %[[S69]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S134:.+]] = llvm.insertvalue %[[S3]], %{{.*}}[63] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S135:.+]] = llvm.insertvalue %[[S68]], %[[S4]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S136:.+]] = llvm.insertvalue %[[S134]], %[[S135]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: nvvm.wgmma.fence.aligned
|
||||
// CHECK: %[[S137:.+]] = llvm.mlir.undef : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S138:.+]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S137:.+]] = llvm.mlir.poison : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S138:.+]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S139:.+]] = nvvm.wgmma.mma_async %[[S0]], %[[S1]], %[[S138]], <m = 64, n = 128, k = 16>, D[<f32>, <one>, <wrapped>], A[<f16>, <one>, <row>], B[<f16>, <one>, <row>] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)> -> !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: nvvm.wgmma.mma_async
|
||||
// CHECK: nvvm.wgmma.mma_async
|
||||
@@ -1307,27 +1307,27 @@ func.func @warpgroup_matrix_multiply_m128n128k64(
|
||||
// CHECK: nvvm.wgmma.mma_async
|
||||
// CHECK: nvvm.wgmma.mma_async
|
||||
// CHECK: %[[S173:.+]] = nvvm.wgmma.mma_async
|
||||
// CHECK: %[[S174:.+]] = llvm.insertvalue %[[S154]], %[[S137]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S175:.+]] = llvm.insertvalue %[[S173]], %[[S174]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S174:.+]] = llvm.insertvalue %[[S154]], %[[S137]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S175:.+]] = llvm.insertvalue %[[S173]], %[[S174]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: nvvm.wgmma.commit.group.sync.aligned
|
||||
// CHECK: nvvm.wgmma.wait.group.sync.aligned 1
|
||||
// CHECK: %[[S176:.+]] = llvm.extractvalue %[[S175]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S193:.+]] = llvm.extractvalue %[[S176]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S194:.+]] = llvm.extractvalue %[[S176]][1] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S176:.+]] = llvm.extractvalue %[[S175]][0] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S193:.+]] = llvm.extractvalue %[[S176]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S194:.+]] = llvm.extractvalue %[[S176]][1] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: memref.store %[[S193]], %[[arg2]][%{{.*}}, %{{.*}}] : memref<128x128xf32, 3>
|
||||
// CHECK: memref.store %[[S194]], %[[arg2]][%{{.*}}, %{{.*}}] : memref<128x128xf32, 3>
|
||||
// CHECK: %[[S485:.+]] = llvm.extractvalue %[[S175]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S503:.+]] = llvm.extractvalue %[[S485]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S504:.+]] = llvm.extractvalue %[[S485]][1] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S485:.+]] = llvm.extractvalue %[[S175]][1] : !llvm.struct<(struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>, struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>)>
|
||||
// CHECK: %[[S503:.+]] = llvm.extractvalue %[[S485]][0] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: %[[S504:.+]] = llvm.extractvalue %[[S485]][1] : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>
|
||||
// CHECK: memref.store %[[S503]], %[[arg2]][%{{.*}}, %{{.*}}] : memref<128x128xf32, 3>
|
||||
// CHECK: memref.store %[[S504]], %[[arg2]][%{{.*}}, %{{.*}}] : memref<128x128xf32, 3>
|
||||
return
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
module attributes {transform.with_named_sequence} {
|
||||
transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
|
||||
%0 = transform.structured.match ops{["func.func"]} in %arg1
|
||||
%0 = transform.structured.match ops{["func.func"]} in %arg1
|
||||
: (!transform.any_op) -> !transform.any_op
|
||||
transform.apply_conversion_patterns to %0 {
|
||||
transform.apply_conversion_patterns.nvgpu.nvgpu_to_nvvm
|
||||
@@ -1344,7 +1344,7 @@ module attributes {transform.with_named_sequence} {
|
||||
func.func @rcp_approx_ftz_f32(%in: vector<32x16xf32>) {
|
||||
// CHECK: %[[IN_LLVM:.*]] = builtin.unrealized_conversion_cast %[[IN]] : vector<32x16xf32> to !llvm.array<32 x vector<16xf32>>
|
||||
// CHECK: %[[IN1DVEC:.*]] = llvm.extractvalue %[[IN_LLVM]][0] : !llvm.array<32 x vector<16xf32>>
|
||||
// CHECK: %[[OUT1DVEC:.*]] = llvm.mlir.undef : vector<16xf32>
|
||||
// CHECK: %[[OUT1DVEC:.*]] = llvm.mlir.poison : vector<16xf32>
|
||||
// CHECK: %[[IDX_0:.+]] = llvm.mlir.constant(0 : i64) : i64
|
||||
// CHECK: %[[ELEM_0:.*]] = llvm.extractelement %[[IN1DVEC]][%[[IDX_0]] : i64]
|
||||
// CHECK: %[[ELEM_RCP0:.*]] = nvvm.rcp.approx.ftz.f %[[ELEM_0]] : f32
|
||||
|
||||
@@ -92,12 +92,12 @@ spirv.func @bitfield_insert_scalar_greater_bit_width(%base: i16, %insert: i16, %
|
||||
// CHECK-LABEL: @bitfield_insert_vector
|
||||
// CHECK-SAME: %[[BASE:.*]]: vector<2xi32>, %[[INSERT:.*]]: vector<2xi32>, %[[OFFSET:.*]]: i32, %[[COUNT:.*]]: i32
|
||||
spirv.func @bitfield_insert_vector(%base: vector<2xi32>, %insert: vector<2xi32>, %offset: i32, %count: i32) "None" {
|
||||
// CHECK: %[[OFFSET_V0:.*]] = llvm.mlir.undef : vector<2xi32>
|
||||
// CHECK: %[[OFFSET_V0:.*]] = llvm.mlir.poison : vector<2xi32>
|
||||
// CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[OFFSET_V1:.*]] = llvm.insertelement %[[OFFSET]], %[[OFFSET_V0]][%[[ZERO]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[OFFSET_V2:.*]] = llvm.insertelement %[[OFFSET]], %[[OFFSET_V1]][%[[ONE]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[COUNT_V0:.*]] = llvm.mlir.undef : vector<2xi32>
|
||||
// CHECK: %[[COUNT_V0:.*]] = llvm.mlir.poison : vector<2xi32>
|
||||
// CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[COUNT_V1:.*]] = llvm.insertelement %[[COUNT]], %[[COUNT_V0]][%[[ZERO]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
|
||||
@@ -164,12 +164,12 @@ spirv.func @bitfield_sextract_scalar_greater_bit_width(%base: i32, %offset: i64,
|
||||
// CHECK-LABEL: @bitfield_sextract_vector
|
||||
// CHECK-SAME: %[[BASE:.*]]: vector<2xi32>, %[[OFFSET:.*]]: i32, %[[COUNT:.*]]: i32
|
||||
spirv.func @bitfield_sextract_vector(%base: vector<2xi32>, %offset: i32, %count: i32) "None" {
|
||||
// CHECK: %[[OFFSET_V0:.*]] = llvm.mlir.undef : vector<2xi32>
|
||||
// CHECK: %[[OFFSET_V0:.*]] = llvm.mlir.poison : vector<2xi32>
|
||||
// CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[OFFSET_V1:.*]] = llvm.insertelement %[[OFFSET]], %[[OFFSET_V0]][%[[ZERO]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[OFFSET_V2:.*]] = llvm.insertelement %[[OFFSET]], %[[OFFSET_V1]][%[[ONE]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[COUNT_V0:.*]] = llvm.mlir.undef : vector<2xi32>
|
||||
// CHECK: %[[COUNT_V0:.*]] = llvm.mlir.poison : vector<2xi32>
|
||||
// CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[COUNT_V1:.*]] = llvm.insertelement %[[COUNT]], %[[COUNT_V0]][%[[ZERO]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
|
||||
@@ -230,12 +230,12 @@ spirv.func @bitfield_uextract_scalar_greater_bit_width(%base: i8, %offset: i16,
|
||||
// CHECK-LABEL: @bitfield_uextract_vector
|
||||
// CHECK-SAME: %[[BASE:.*]]: vector<2xi32>, %[[OFFSET:.*]]: i32, %[[COUNT:.*]]: i32
|
||||
spirv.func @bitfield_uextract_vector(%base: vector<2xi32>, %offset: i32, %count: i32) "None" {
|
||||
// CHECK: %[[OFFSET_V0:.*]] = llvm.mlir.undef : vector<2xi32>
|
||||
// CHECK: %[[OFFSET_V0:.*]] = llvm.mlir.poison : vector<2xi32>
|
||||
// CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[OFFSET_V1:.*]] = llvm.insertelement %[[OFFSET]], %[[OFFSET_V0]][%[[ZERO]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
|
||||
// CHECK: %[[OFFSET_V2:.*]] = llvm.insertelement %[[OFFSET]], %[[OFFSET_V1]][%[[ONE]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[COUNT_V0:.*]] = llvm.mlir.undef : vector<2xi32>
|
||||
// CHECK: %[[COUNT_V0:.*]] = llvm.mlir.poison : vector<2xi32>
|
||||
// CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK: %[[COUNT_V1:.*]] = llvm.insertelement %[[COUNT]], %[[COUNT_V0]][%[[ZERO]] : i32] : vector<2xi32>
|
||||
// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i32
|
||||
|
||||
@@ -70,7 +70,7 @@ spirv.func @vector_shuffle_same_size(%vector1: vector<2xf32>, %vector2: vector<2
|
||||
}
|
||||
|
||||
spirv.func @vector_shuffle_different_size(%vector1: vector<3xf32>, %vector2: vector<2xf32>) -> vector<3xf32> "None" {
|
||||
// CHECK: %[[UNDEF:.*]] = llvm.mlir.undef : vector<3xf32>
|
||||
// CHECK: %[[UNDEF:.*]] = llvm.mlir.poison : vector<3xf32>
|
||||
// CHECK-NEXT: %[[C0_0:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK-NEXT: %[[C0_1:.*]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK-NEXT: %[[EXT0:.*]] = llvm.extractelement %arg0[%[[C0_1]] : i32] : vector<3xf32>
|
||||
@@ -90,7 +90,7 @@ spirv.func @vector_shuffle_different_size(%vector1: vector<3xf32>, %vector2: vec
|
||||
|
||||
// CHECK: module {
|
||||
// CHECK-NEXT: llvm.mlir.global external constant @{{.*}}() {addr_space = 0 : i32} : !llvm.struct<(i32)> {
|
||||
// CHECK-NEXT: %[[UNDEF:.*]] = llvm.mlir.undef : !llvm.struct<(i32)>
|
||||
// CHECK-NEXT: %[[UNDEF:.*]] = llvm.mlir.poison : !llvm.struct<(i32)>
|
||||
// CHECK-NEXT: %[[VAL:.*]] = llvm.mlir.constant(31 : i32) : i32
|
||||
// CHECK-NEXT: %[[RET:.*]] = llvm.insertvalue %[[VAL]], %[[UNDEF]][0] : !llvm.struct<(i32)>
|
||||
// CHECK-NEXT: llvm.return %[[RET]] : !llvm.struct<(i32)>
|
||||
@@ -109,7 +109,7 @@ spirv.module Logical OpenCL {
|
||||
|
||||
// CHECK: module {
|
||||
// CHECK-NEXT: llvm.mlir.global external constant @{{.*}}() {addr_space = 0 : i32} : !llvm.struct<(i32, array<3 x i32>)> {
|
||||
// CHECK-NEXT: %[[UNDEF:.*]] = llvm.mlir.undef : !llvm.struct<(i32, array<3 x i32>)>
|
||||
// CHECK-NEXT: %[[UNDEF:.*]] = llvm.mlir.poison : !llvm.struct<(i32, array<3 x i32>)>
|
||||
// CHECK-NEXT: %[[EM:.*]] = llvm.mlir.constant(18 : i32) : i32
|
||||
// CHECK-NEXT: %[[T0:.*]] = llvm.insertvalue %[[EM]], %[[UNDEF]][0] : !llvm.struct<(i32, array<3 x i32>)>
|
||||
// CHECK-NEXT: %[[C0:.*]] = llvm.mlir.constant(32 : i32) : i32
|
||||
|
||||
@@ -1122,7 +1122,7 @@ func.func @shuffle_1D(%arg0: vector<2xf32>, %arg1: vector<3xf32>) -> vector<5xf3
|
||||
// CHECK-LABEL: @shuffle_1D(
|
||||
// CHECK-SAME: %[[A:.*]]: vector<2xf32>,
|
||||
// CHECK-SAME: %[[B:.*]]: vector<3xf32>)
|
||||
// CHECK: %[[U0:.*]] = llvm.mlir.undef : vector<5xf32>
|
||||
// CHECK: %[[U0:.*]] = llvm.mlir.poison : vector<5xf32>
|
||||
// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : index) : i64
|
||||
// CHECK: %[[E1:.*]] = llvm.extractelement %[[B]][%[[C2]] : i64] : vector<3xf32>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : index) : i64
|
||||
@@ -1156,7 +1156,7 @@ func.func @shuffle_2D(%a: vector<1x4xf32>, %b: vector<2x4xf32>) -> vector<3x4xf3
|
||||
// CHECK-SAME: %[[B:.*]]: vector<2x4xf32>)
|
||||
// CHECK-DAG: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<1x4xf32> to !llvm.array<1 x vector<4xf32>>
|
||||
// CHECK-DAG: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[B]] : vector<2x4xf32> to !llvm.array<2 x vector<4xf32>>
|
||||
// CHECK: %[[U0:.*]] = llvm.mlir.undef : !llvm.array<3 x vector<4xf32>>
|
||||
// CHECK: %[[U0:.*]] = llvm.mlir.poison : !llvm.array<3 x vector<4xf32>>
|
||||
// CHECK: %[[E1:.*]] = llvm.extractvalue %[[VAL_1]][0] : !llvm.array<2 x vector<4xf32>>
|
||||
// CHECK: %[[I1:.*]] = llvm.insertvalue %[[E1]], %[[U0]][0] : !llvm.array<3 x vector<4xf32>>
|
||||
// CHECK: %[[E2:.*]] = llvm.extractvalue %[[VAL_0]][0] : !llvm.array<1 x vector<4xf32>>
|
||||
@@ -1747,7 +1747,7 @@ func.func @type_cast_f32(%arg0: memref<8x8x8xf32>) -> memref<vector<8x8x8xf32>>
|
||||
return %0 : memref<vector<8x8x8xf32>>
|
||||
}
|
||||
// CHECK-LABEL: @type_cast_f32
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[allocated:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[allocated]], {{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>
|
||||
// CHECK: %[[aligned:.*]] = llvm.extractvalue {{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
|
||||
@@ -1778,7 +1778,7 @@ func.func @type_cast_non_zero_addrspace(%arg0: memref<8x8x8xf32, 3>) -> memref<v
|
||||
return %0 : memref<vector<8x8x8xf32>, 3>
|
||||
}
|
||||
// CHECK-LABEL: @type_cast_non_zero_addrspace
|
||||
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64)>
|
||||
// CHECK: llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64)>
|
||||
// CHECK: %[[allocated:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
// CHECK: llvm.insertvalue %[[allocated]], {{.*}}[0] : !llvm.struct<(ptr<3>, ptr<3>, i64)>
|
||||
// CHECK: %[[aligned:.*]] = llvm.extractvalue {{.*}}[1] : !llvm.struct<(ptr<3>, ptr<3>, i64, array<3 x i64>, array<3 x i64>)>
|
||||
@@ -2019,7 +2019,7 @@ func.func @extract_strided_slice_f32_1d_from_2d(%arg0: vector<4x8xf32>) -> vecto
|
||||
// CHECK-LABEL: @extract_strided_slice_f32_1d_from_2d(
|
||||
// CHECK-SAME: %[[ARG:.*]]: vector<4x8xf32>)
|
||||
// CHECK: %[[A:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x8xf32> to !llvm.array<4 x vector<8xf32>>
|
||||
// CHECK: %[[T0:.*]] = llvm.mlir.undef : !llvm.array<2 x vector<8xf32>>
|
||||
// CHECK: %[[T0:.*]] = llvm.mlir.poison : !llvm.array<2 x vector<8xf32>>
|
||||
// CHECK: %[[T1:.*]] = llvm.extractvalue %[[A]][2] : !llvm.array<4 x vector<8xf32>>
|
||||
// CHECK: %[[T2:.*]] = llvm.insertvalue %[[T1]], %[[T0]][0] : !llvm.array<2 x vector<8xf32>>
|
||||
// CHECK: %[[T3:.*]] = llvm.extractvalue %[[A]][3] : !llvm.array<4 x vector<8xf32>>
|
||||
@@ -3422,7 +3422,7 @@ func.func @store_0d(%memref : memref<200x100xf32>, %i : index, %j : index) {
|
||||
// CHECK: %[[CAST_MEMREF:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<200x100xf32> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[CST:.*]] = arith.constant dense<1.100000e+01> : vector<f32>
|
||||
// CHECK: %[[VAL:.*]] = builtin.unrealized_conversion_cast %[[CST]] : vector<f32> to vector<1xf32>
|
||||
// CHECK: %[[REF:.*]] = llvm.extractvalue %[[CAST_MEMREF]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[REF:.*]] = llvm.extractvalue %[[CAST_MEMREF]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK: %[[C100:.*]] = llvm.mlir.constant(100 : index) : i64
|
||||
// CHECK: %[[MUL:.*]] = llvm.mul %[[I]], %[[C100]] : i64
|
||||
// CHECK: %[[ADD:.*]] = llvm.add %[[MUL]], %[[J]] : i64
|
||||
@@ -3898,9 +3898,9 @@ func.func @splat_0d(%elt: f32) -> vector<f32> {
|
||||
%v = vector.splat %elt : vector<f32>
|
||||
return %v : vector<f32>
|
||||
}
|
||||
// CHECK-NEXT: %[[UNDEF:[0-9]+]] = llvm.mlir.undef : vector<1xf32>
|
||||
// CHECK-NEXT: %[[POISON:[0-9]+]] = llvm.mlir.poison : vector<1xf32>
|
||||
// CHECK-NEXT: %[[ZERO:[0-9]+]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[UNDEF]][%[[ZERO]] : i32] : vector<1xf32>
|
||||
// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[POISON]][%[[ZERO]] : i32] : vector<1xf32>
|
||||
// CHECK-NEXT: %[[VCAST:[0-9]+]] = builtin.unrealized_conversion_cast %[[V]] : vector<1xf32> to vector<f32>
|
||||
// CHECK-NEXT: return %[[VCAST]] : vector<f32>
|
||||
|
||||
@@ -3914,10 +3914,10 @@ func.func @splat(%vec: vector<4xf32>, %elt: f32) -> vector<4xf32> {
|
||||
%r = arith.mulf %vec, %vb : vector<4xf32>
|
||||
return %r : vector<4xf32>
|
||||
}
|
||||
// CHECK-NEXT: %[[UNDEF:[0-9]+]] = llvm.mlir.undef : vector<4xf32>
|
||||
// CHECK-NEXT: %[[POISON:[0-9]+]] = llvm.mlir.poison : vector<4xf32>
|
||||
// CHECK-NEXT: %[[ZERO:[0-9]+]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[UNDEF]][%[[ZERO]] : i32] : vector<4xf32>
|
||||
// CHECK-NEXT: %[[SPLAT:[0-9]+]] = llvm.shufflevector %[[V]], %[[UNDEF]] [0, 0, 0, 0]
|
||||
// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[POISON]][%[[ZERO]] : i32] : vector<4xf32>
|
||||
// CHECK-NEXT: %[[SPLAT:[0-9]+]] = llvm.shufflevector %[[V]], %[[POISON]] [0, 0, 0, 0]
|
||||
// CHECK-NEXT: %[[SCALE:[0-9]+]] = arith.mulf %[[VEC]], %[[SPLAT]] : vector<4xf32>
|
||||
// CHECK-NEXT: return %[[SCALE]] : vector<4xf32>
|
||||
|
||||
@@ -3931,10 +3931,10 @@ func.func @splat_scalable(%vec: vector<[4]xf32>, %elt: f32) -> vector<[4]xf32> {
|
||||
%r = arith.mulf %vec, %vb : vector<[4]xf32>
|
||||
return %r : vector<[4]xf32>
|
||||
}
|
||||
// CHECK-NEXT: %[[UNDEF:[0-9]+]] = llvm.mlir.undef : vector<[4]xf32>
|
||||
// CHECK-NEXT: %[[POISON:[0-9]+]] = llvm.mlir.poison : vector<[4]xf32>
|
||||
// CHECK-NEXT: %[[ZERO:[0-9]+]] = llvm.mlir.constant(0 : i32) : i32
|
||||
// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[UNDEF]][%[[ZERO]] : i32] : vector<[4]xf32>
|
||||
// CHECK-NEXT: %[[SPLAT:[0-9]+]] = llvm.shufflevector %[[V]], %[[UNDEF]] [0, 0, 0, 0]
|
||||
// CHECK-NEXT: %[[V:[0-9]+]] = llvm.insertelement %[[ELT]], %[[POISON]][%[[ZERO]] : i32] : vector<[4]xf32>
|
||||
// CHECK-NEXT: %[[SPLAT:[0-9]+]] = llvm.shufflevector %[[V]], %[[POISON]] [0, 0, 0, 0]
|
||||
// CHECK-NEXT: %[[SCALE:[0-9]+]] = arith.mulf %[[VEC]], %[[SPLAT]] : vector<[4]xf32>
|
||||
// CHECK-NEXT: return %[[SCALE]] : vector<[4]xf32>
|
||||
|
||||
@@ -4085,9 +4085,9 @@ func.func @deinterleave_2d_scalable(%arg: vector<2x[8]xf32>) -> (vector<2x[4]xf3
|
||||
|
||||
// CHECK-LABEL: func.func @from_elements_1d(
|
||||
// CHECK-SAME: %[[ARG_0:.*]]: f32, %[[ARG_1:.*]]: f32)
|
||||
// CHECK: %[[UNDEF:.*]] = llvm.mlir.undef : vector<3xf32>
|
||||
// CHECK: %[[POISON:.*]] = llvm.mlir.poison : vector<3xf32>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i64
|
||||
// CHECK: %[[INSERT0:.*]] = llvm.insertelement %[[ARG_0]], %[[UNDEF]][%[[C0]] : i64] : vector<3xf32>
|
||||
// CHECK: %[[INSERT0:.*]] = llvm.insertelement %[[ARG_0]], %[[POISON]][%[[C0]] : i64] : vector<3xf32>
|
||||
// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i64) : i64
|
||||
// CHECK: %[[INSERT1:.*]] = llvm.insertelement %[[ARG_1]], %[[INSERT0]][%[[C1]] : i64] : vector<3xf32>
|
||||
// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : i64) : i64
|
||||
@@ -4102,9 +4102,9 @@ func.func @from_elements_1d(%arg0: f32, %arg1: f32) -> vector<3xf32> {
|
||||
|
||||
// CHECK-LABEL: func.func @from_elements_0d(
|
||||
// CHECK-SAME: %[[ARG_0:.*]]: f32)
|
||||
// CHECK: %[[UNDEF:.*]] = llvm.mlir.undef : vector<1xf32>
|
||||
// CHECK: %[[POISON:.*]] = llvm.mlir.poison : vector<1xf32>
|
||||
// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i64
|
||||
// CHECK: %[[INSERT0:.*]] = llvm.insertelement %[[ARG_0]], %[[UNDEF]][%[[C0]] : i64] : vector<1xf32>
|
||||
// CHECK: %[[INSERT0:.*]] = llvm.insertelement %[[ARG_0]], %[[POISON]][%[[C0]] : i64] : vector<1xf32>
|
||||
// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[INSERT0]] : vector<1xf32> to vector<f32>
|
||||
// CHECK: return %[[CAST]]
|
||||
func.func @from_elements_0d(%arg0: f32) -> vector<f32> {
|
||||
|
||||
@@ -22,7 +22,7 @@ gpu.module @modules {
|
||||
|
||||
// CHECK-DAG: %[[S0:.+]] = llvm.mlir.constant(32 : index) : i64
|
||||
// CHECK-DAG: %[[S1:.+]] = llvm.mlir.constant(64 : index) : i64
|
||||
// CHECK-DAG: %[[S2:.+]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S2:.+]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S3:.+]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK-DAG: %[[S4:.+]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK-DAG: %[[S5:.+]] = llvm.mlir.addressof @__dynamic_shmem__3 : !llvm.ptr<3>
|
||||
@@ -56,7 +56,7 @@ gpu.module @modules {
|
||||
"test.use.shared.memory"(%0) : (memref<32x64xf32, #gpu.address_space<workgroup>>) -> ()
|
||||
// CHECK-DAG: %[[S0:.+]] = llvm.mlir.constant(32 : index) : i64
|
||||
// CHECK-DAG: %[[S1:.+]] = llvm.mlir.constant(64 : index) : i64
|
||||
// CHECK-DAG: %[[S2:.+]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S2:.+]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S3:.+]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK-DAG: %[[S4:.+]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK-DAG: %[[S5:.+]] = llvm.mlir.addressof @__dynamic_shmem__3 : !llvm.ptr<3>
|
||||
@@ -82,7 +82,7 @@ gpu.module @modules {
|
||||
"test.use.shared.memory"(%0) : (memref<32x64xf32, #gpu.address_space<workgroup>>) -> ()
|
||||
// CHECK-DAG: %[[S0:.+]] = llvm.mlir.constant(32 : index) : i64
|
||||
// CHECK-DAG: %[[S1:.+]] = llvm.mlir.constant(64 : index) : i64
|
||||
// CHECK-DAG: %[[S2:.+]] = llvm.mlir.undef : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S2:.+]] = llvm.mlir.poison : !llvm.struct<(ptr<3>, ptr<3>, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[S3:.+]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK-DAG: %[[S4:.+]] = llvm.mlir.constant(0 : index) : i64
|
||||
// CHECK-DAG: %[[S5:.+]] = llvm.mlir.addressof @__dynamic_shmem__3 : !llvm.ptr<3>
|
||||
|
||||
@@ -30,7 +30,7 @@ func.func @subview(%0 : memref<64x4xf32, strided<[4, 1], offset: 0>>, %arg0 : in
|
||||
// CHECK-DAG: %[[STRIDE0:.*]] = llvm.mlir.constant(4 : index) : i64
|
||||
// CHECK-DAG: %[[DESCSTRIDE0:.*]] = llvm.mul %[[ARG0]], %[[STRIDE0]] overflow<nsw> : i64
|
||||
// CHECK-DAG: %[[OFF2:.*]] = llvm.add %[[DESCSTRIDE0]], %[[ARG1]] : i64
|
||||
// CHECK-DAG: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
|
||||
// Base address and algined address.
|
||||
// CHECK-DAG: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -59,7 +59,7 @@ module @named_inclusion_in_named attributes { transform.with_named_sequence } {
|
||||
transform.named_sequence private @lower_to_cpu(!transform.any_op {transform.consumed}) -> !transform.any_op
|
||||
|
||||
transform.named_sequence @__transform_main(%toplevel_module: !transform.any_op {transform.consumed}) {
|
||||
%m2 = transform.include @lower_to_cpu failures(suppress) (%toplevel_module)
|
||||
%m2 = transform.include @lower_to_cpu failures(suppress) (%toplevel_module)
|
||||
: (!transform.any_op) -> (!transform.any_op)
|
||||
transform.yield
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ func.func @subview(%0 : memref<64x4xf32, strided<[4, 1], offset: 0>>, %arg0 : in
|
||||
// CHECK-DAG: %[[STRIDE0:.*]] = llvm.mlir.constant(4 : index) : i64
|
||||
// CHECK-DAG: %[[DESCSTRIDE0:.*]] = llvm.mul %[[ARG0]], %[[STRIDE0]] overflow<nsw> : i64
|
||||
// CHECK-DAG: %[[OFF2:.*]] = llvm.add %[[DESCSTRIDE0]], %[[ARG1]] : i64
|
||||
// CHECK-DAG: %[[DESC:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
// CHECK-DAG: %[[DESC:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
|
||||
// Base address and algined address.
|
||||
// CHECK-DAG: %[[DESC0:.*]] = llvm.insertvalue %[[BASE]], %[[DESC]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
|
||||
@@ -57,7 +57,7 @@ module @named_inclusion_in_named attributes { transform.with_named_sequence } {
|
||||
|
||||
transform.named_sequence @entry_point(
|
||||
%toplevel_module : !transform.any_op {transform.readonly}) {
|
||||
transform.include @lower_to_llvm failures(suppress) (%toplevel_module)
|
||||
transform.include @lower_to_llvm failures(suppress) (%toplevel_module)
|
||||
: (!transform.any_op) -> (!transform.any_op)
|
||||
transform.yield
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#CSR = #sparse_tensor.encoding<{map = (d0, d1) -> (d0 : dense, d1 : compressed)}>
|
||||
|
||||
// CHECK-LABEL: func.func @sparse_metadata_init() -> !llvm.struct<(array<2 x i64>, array<3 x i64>)> {
|
||||
// CHECK-DAG: %[[STRUCT:.*]] = llvm.mlir.undef : !llvm.struct<(array<2 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[STRUCT:.*]] = llvm.mlir.poison : !llvm.struct<(array<2 x i64>, array<3 x i64>)>
|
||||
// CHECK-DAG: %[[CST0:.*]] = arith.constant 0 : i64
|
||||
// CHECK: %[[VAL_1:.*]] = llvm.insertvalue %[[CST0]], %[[STRUCT]][1, 0] : !llvm.struct<(array<2 x i64>, array<3 x i64>)>
|
||||
// CHECK: %[[VAL_2:.*]] = llvm.insertvalue %[[CST0]], %[[VAL_1]][1, 1] : !llvm.struct<(array<2 x i64>, array<3 x i64>)>
|
||||
|
||||
@@ -379,7 +379,7 @@ module attributes { transform.with_named_sequence } {
|
||||
// The core computation, at the LLVM dialect level, must correspond to five
|
||||
// immediately adjacent fma on vector<64xf32>.
|
||||
|
||||
// CHECK: %[[R0:.+]] = llvm.mlir.undef : !llvm.array<5 x vector<64xf32>>
|
||||
// CHECK: %[[R0:.+]] = llvm.mlir.poison : !llvm.array<5 x vector<64xf32>>
|
||||
|
||||
// CHECK: %[[V:.+]] = llvm.load %{{.*}} : !llvm.ptr -> !llvm.array<5 x vector<64xf32>>
|
||||
// CHECK-NEXT: %[[LINE0:.+]] = llvm.extractvalue %[[V]][0] : !llvm.array<5 x vector<64xf32>>
|
||||
|
||||
Reference in New Issue
Block a user