diff --git a/mlir/include/mlir/Conversion/Passes.td b/mlir/include/mlir/Conversion/Passes.td --- a/mlir/include/mlir/Conversion/Passes.td +++ b/mlir/include/mlir/Conversion/Passes.td @@ -383,6 +383,12 @@ dialect, emitting C wrappers. }]; + let options = [ + Option<"useOpaquePointers", "use-opaque-pointers", "bool", + /*default=*/"false", "Generate LLVM IR using opaque pointers " + "instead of typed pointers"> + ]; + let dependentDialects = ["LLVM::LLVMDialect"]; } @@ -839,6 +845,12 @@ for more details. }]; let dependentDialects = ["LLVM::LLVMDialect"]; + + let options = [ + Option<"useOpaquePointers", "use-opaque-pointers", "bool", + /*default=*/"false", "Generate LLVM IR using opaque pointers " + "instead of typed pointers"> + ]; } //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp b/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp --- a/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp @@ -262,7 +262,9 @@ // Copy the data from src operand pointer to dst global variable. Save // src, dst and size so that we can copy data back after emulating the // kernel call. - Value dst = rewriter.create(loc, dstGlobal); + Value dst = rewriter.create( + loc, typeConverter->convertType(spirvGlobal.getType()), + dstGlobal.getSymName()); copy(loc, dst, src, sizeBytes, rewriter); CopyInfo info; @@ -302,6 +304,8 @@ // Specify options to lower to LLVM and pull in the conversion patterns. LowerToLLVMOptions options(module.getContext()); + options.useOpaquePointers = useOpaquePointers; + auto *context = module.getContext(); RewritePatternSet patterns(context); LLVMTypeConverter typeConverter(context, options); diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp --- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp @@ -263,9 +263,9 @@ /// Converts SPIR-V pointer type to LLVM pointer. Pointer's storage class is not /// modelled at the moment. static Type convertPointerType(spirv::PointerType type, - TypeConverter &converter) { + LLVMTypeConverter &converter) { auto pointeeType = converter.convertType(type.getPointeeType()); - return LLVM::LLVMPointerType::get(pointeeType); + return converter.getPointerType(pointeeType); } /// Converts SPIR-V runtime array to LLVM array. Since LLVM allows indexing over @@ -317,8 +317,13 @@ Value zero = rewriter.create( op.getLoc(), llvmIndexType, rewriter.getIntegerAttr(indexType, 0)); indices.insert(indices.begin(), zero); - rewriter.replaceOpWithNewOp(op, dstType, adaptor.getBasePtr(), - indices); + rewriter.replaceOpWithNewOp( + op, dstType, + typeConverter.convertType(op.getBasePtr() + .getType() + .cast() + .getPointeeType()), + adaptor.getBasePtr(), indices); return success(); } }; @@ -1266,16 +1271,46 @@ Location loc = varOp.getLoc(); Value size = createI32ConstantOf(loc, rewriter, 1); if (!init) { - rewriter.replaceOpWithNewOp(varOp, dstType, size); + rewriter.replaceOpWithNewOp( + varOp, dstType, typeConverter.convertType(pointerTo), size); return success(); } - Value allocated = rewriter.create(loc, dstType, size); + Value allocated = rewriter.create( + loc, dstType, typeConverter.convertType(pointerTo), size); rewriter.create(loc, adaptor.getInitializer(), allocated); rewriter.replaceOp(varOp, allocated); return success(); } }; +//===----------------------------------------------------------------------===// +// BitcastOp conversion +//===----------------------------------------------------------------------===// + +class BitcastConversionPattern + : public SPIRVToLLVMConversion { +public: + using SPIRVToLLVMConversion::SPIRVToLLVMConversion; + + LogicalResult + matchAndRewrite(spirv::BitcastOp bitcastOp, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto dstType = typeConverter.convertType(bitcastOp.getType()); + if (!dstType) + return failure(); + + if (typeConverter.useOpaquePointers() && + dstType.isa()) { + rewriter.replaceOp(bitcastOp, adaptor.getOperand()); + return success(); + } + + rewriter.replaceOpWithNewOp( + bitcastOp, dstType, adaptor.getOperands(), bitcastOp->getAttrs()); + return success(); + } +}; + //===----------------------------------------------------------------------===// // FuncOp conversion //===----------------------------------------------------------------------===// @@ -1471,7 +1506,7 @@ NotPattern, // Cast ops - DirectConversionPattern, + BitcastConversionPattern, DirectConversionPattern, DirectConversionPattern, DirectConversionPattern, diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp --- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp @@ -39,7 +39,11 @@ void ConvertSPIRVToLLVMPass::runOnOperation() { MLIRContext *context = &getContext(); ModuleOp module = getOperation(); - LLVMTypeConverter converter(&getContext()); + + LowerToLLVMOptions options(&getContext()); + options.useOpaquePointers = useOpaquePointers; + + LLVMTypeConverter converter(&getContext(), options); // Encode global variable's descriptor set and binding if they exist. encodeBindAttribute(module); diff --git a/mlir/test/Conversion/SPIRVToLLVM/arithmetic-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/arithmetic-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/arithmetic-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/arithmetic-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.IAdd diff --git a/mlir/test/Conversion/SPIRVToLLVM/bitwise-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/bitwise-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/bitwise-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/bitwise-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.BitCount diff --git a/mlir/test/Conversion/SPIRVToLLVM/cast-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/cast-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/cast-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/cast-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.Bitcast @@ -41,7 +41,7 @@ // CHECK-LABEL: @bitcast_pointer spirv.func @bitcast_pointer(%arg0: !spirv.ptr) "None" { - // CHECK: llvm.bitcast %{{.*}} : !llvm.ptr to !llvm.ptr + // CHECK-NOT: llvm.bitcast %0 = spirv.Bitcast %arg0 : !spirv.ptr to !spirv.ptr spirv.Return } diff --git a/mlir/test/Conversion/SPIRVToLLVM/comparison-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/comparison-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/comparison-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/comparison-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.IEqual diff --git a/mlir/test/Conversion/SPIRVToLLVM/constant-op-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/constant-op-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/constant-op-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/constant-op-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.Constant diff --git a/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm -split-input-file -verify-diagnostics %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' -split-input-file -verify-diagnostics %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.Branch diff --git a/mlir/test/Conversion/SPIRVToLLVM/func-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/func-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/func-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/func-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.Return diff --git a/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.GL.Ceil diff --git a/mlir/test/Conversion/SPIRVToLLVM/logical-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/logical-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/logical-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/logical-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.LogicalEqual diff --git a/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls.mlir b/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt --lower-host-to-llvm %s -split-input-file | FileCheck %s +// RUN: mlir-opt --lower-host-to-llvm='use-opaque-pointers=1' %s -split-input-file | FileCheck %s module attributes {gpu.container_module, spirv.target_env = #spirv.target_env<#spirv.vce, #spirv.resource_limits>} { @@ -13,13 +13,13 @@ // CHECK: spirv.ExecutionMode @__spv__foo_bar "LocalSize", 1, 1, 1 // CHECK-LABEL: @main - // CHECK: %[[SRC:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - // CHECK-NEXT: %[[DEST:.*]] = llvm.mlir.addressof @__spv__foo_bar_arg_0_descriptor_set0_binding0 : !llvm.ptr)>> + // CHECK: %[[SRC:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> + // CHECK-NEXT: %[[DEST:.*]] = llvm.mlir.addressof @__spv__foo_bar_arg_0_descriptor_set0_binding0 : !llvm.ptr // CHECK-NEXT: llvm.mlir.constant(false) : i1 - // CHECK-NEXT: "llvm.intr.memcpy"(%[[DEST]], %[[SRC]], %[[SIZE:.*]], %{{.*}}) : (!llvm.ptr)>>, !llvm.ptr, i64, i1) -> () + // CHECK-NEXT: "llvm.intr.memcpy"(%[[DEST]], %[[SRC]], %[[SIZE:.*]], %{{.*}}) : (!llvm.ptr, !llvm.ptr, i64, i1) -> () // CHECK-NEXT: llvm.call @__spv__foo_bar() : () -> () // CHECK-NEXT: llvm.mlir.constant(false) : i1 - // CHECK-NEXT: "llvm.intr.memcpy"(%[[SRC]], %[[DEST]], %[[SIZE]], %{{.*}}) : (!llvm.ptr, !llvm.ptr)>>, i64, i1) -> () + // CHECK-NEXT: "llvm.intr.memcpy"(%[[SRC]], %[[DEST]], %[[SIZE]], %{{.*}}) : (!llvm.ptr, !llvm.ptr, i64, i1) -> () spirv.module @__spv__foo Logical GLSL450 requires #spirv.vce { spirv.GlobalVariable @bar_arg_0 bind(0, 0) : !spirv.ptr [0])>, StorageBuffer> diff --git a/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls_fail.mlir b/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls_fail.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls_fail.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/lower-host-to-llvm-calls_fail.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt --lower-host-to-llvm %s -verify-diagnostics +// RUN: mlir-opt --lower-host-to-llvm='use-opaque-pointers=1' %s -verify-diagnostics module { // expected-error @+1 {{The module must contain exactly one entry point function}} diff --git a/mlir/test/Conversion/SPIRVToLLVM/memory-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/memory-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/memory-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/memory-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.AccessChain @@ -10,7 +10,7 @@ %0 = spirv.Constant 1: i32 %1 = spirv.Variable : !spirv.ptr)>, Function> // CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32 - // CHECK: llvm.getelementptr %{{.*}}[%[[ZERO]], 1, %[[ONE]]] : (!llvm.ptr)>>, i32, i32) -> !llvm.ptr + // CHECK: llvm.getelementptr %{{.*}}[%[[ZERO]], 1, %[[ONE]]] : (!llvm.ptr, i32, i32) -> !llvm.ptr, !llvm.struct)> %2 = spirv.AccessChain %1[%0, %0] : !spirv.ptr)>, Function>, i32, i32 spirv.Return } @@ -19,7 +19,7 @@ spirv.func @access_chain_array(%arg0 : i32) "None" { %0 = spirv.Variable : !spirv.ptr>, Function> // CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i32 - // CHECK: llvm.getelementptr %{{.*}}[%[[ZERO]], %{{.*}}] : (!llvm.ptr>>, i32, i32) -> !llvm.ptr> + // CHECK: llvm.getelementptr %{{.*}}[%[[ZERO]], %{{.*}}] : (!llvm.ptr, i32, i32) -> !llvm.ptr, !llvm.array<4 x array<4 x f32>> %1 = spirv.AccessChain %0[%arg0] : !spirv.ptr>, Function>, i32 %2 = spirv.Load "Function" %1 ["Volatile"] : !spirv.array<4xf32> spirv.Return @@ -37,7 +37,7 @@ spirv.module Logical GLSL450 { // CHECK: llvm.mlir.global private @struct() {addr_space = 0 : i32} : !llvm.struct)> // CHECK-LABEL: @func - // CHECK: llvm.mlir.addressof @struct : !llvm.ptr)>> + // CHECK: llvm.mlir.addressof @struct : !llvm.ptr spirv.GlobalVariable @struct : !spirv.ptr)>, Private> spirv.func @func() "None" { %0 = spirv.mlir.addressof @struct : !spirv.ptr)>, Private> @@ -48,7 +48,7 @@ spirv.module Logical GLSL450 { // CHECK: llvm.mlir.global external @bar_descriptor_set0_binding0() {addr_space = 0 : i32} : i32 // CHECK-LABEL: @foo - // CHECK: llvm.mlir.addressof @bar_descriptor_set0_binding0 : !llvm.ptr + // CHECK: llvm.mlir.addressof @bar_descriptor_set0_binding0 : !llvm.ptr spirv.GlobalVariable @bar bind(0, 0) : !spirv.ptr spirv.func @foo() "None" { %0 = spirv.mlir.addressof @bar : !spirv.ptr @@ -59,7 +59,7 @@ spirv.module @name Logical GLSL450 { // CHECK: llvm.mlir.global external @name_bar_descriptor_set0_binding0() {addr_space = 0 : i32} : i32 // CHECK-LABEL: @foo - // CHECK: llvm.mlir.addressof @name_bar_descriptor_set0_binding0 : !llvm.ptr + // CHECK: llvm.mlir.addressof @name_bar_descriptor_set0_binding0 : !llvm.ptr spirv.GlobalVariable @bar bind(0, 0) : !spirv.ptr spirv.func @foo() "None" { %0 = spirv.mlir.addressof @bar : !spirv.ptr @@ -94,7 +94,7 @@ // CHECK-LABEL: @load spirv.func @load() "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.load %{{.*}} : !llvm.ptr + // CHECK: llvm.load %{{.*}} : !llvm.ptr -> f32 %1 = spirv.Load "Function" %0 : f32 spirv.Return } @@ -102,7 +102,7 @@ // CHECK-LABEL: @load_none spirv.func @load_none() "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.load %{{.*}} : !llvm.ptr + // CHECK: llvm.load %{{.*}} : !llvm.ptr -> f32 %1 = spirv.Load "Function" %0 ["None"] : f32 spirv.Return } @@ -110,7 +110,7 @@ // CHECK-LABEL: @load_with_alignment spirv.func @load_with_alignment() "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.load %{{.*}} {alignment = 4 : i64} : !llvm.ptr + // CHECK: llvm.load %{{.*}} {alignment = 4 : i64} : !llvm.ptr -> f32 %1 = spirv.Load "Function" %0 ["Aligned", 4] : f32 spirv.Return } @@ -118,7 +118,7 @@ // CHECK-LABEL: @load_volatile spirv.func @load_volatile() "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.load volatile %{{.*}} : !llvm.ptr + // CHECK: llvm.load volatile %{{.*}} : !llvm.ptr -> f32 %1 = spirv.Load "Function" %0 ["Volatile"] : f32 spirv.Return } @@ -126,7 +126,7 @@ // CHECK-LABEL: @load_nontemporal spirv.func @load_nontemporal() "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.load %{{.*}} {nontemporal} : !llvm.ptr + // CHECK: llvm.load %{{.*}} {nontemporal} : !llvm.ptr -> f32 %1 = spirv.Load "Function" %0 ["Nontemporal"] : f32 spirv.Return } @@ -138,7 +138,7 @@ // CHECK-LABEL: @store spirv.func @store(%arg0 : f32) "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.store %{{.*}}, %{{.*}} : !llvm.ptr + // CHECK: llvm.store %{{.*}}, %{{.*}} : f32, !llvm.ptr spirv.Store "Function" %0, %arg0 : f32 spirv.Return } @@ -146,7 +146,7 @@ // CHECK-LABEL: @store_composite spirv.func @store_composite(%arg0 : !spirv.struct<(f64)>) "None" { %0 = spirv.Variable : !spirv.ptr, Function> - // CHECK: llvm.store %{{.*}}, %{{.*}} : !llvm.ptr> + // CHECK: llvm.store %{{.*}}, %{{.*}} : !llvm.struct, !llvm.ptr spirv.Store "Function" %0, %arg0 : !spirv.struct<(f64)> spirv.Return } @@ -154,7 +154,7 @@ // CHECK-LABEL: @store_with_alignment spirv.func @store_with_alignment(%arg0 : f32) "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 4 : i64} : !llvm.ptr + // CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 4 : i64} : f32, !llvm.ptr spirv.Store "Function" %0, %arg0 ["Aligned", 4] : f32 spirv.Return } @@ -162,7 +162,7 @@ // CHECK-LABEL: @store_volatile spirv.func @store_volatile(%arg0 : f32) "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.store volatile %{{.*}}, %{{.*}} : !llvm.ptr + // CHECK: llvm.store volatile %{{.*}}, %{{.*}} : f32, !llvm.ptr spirv.Store "Function" %0, %arg0 ["Volatile"] : f32 spirv.Return } @@ -170,7 +170,7 @@ // CHECK-LABEL: @store_nontemporal spirv.func @store_nontemporal(%arg0 : f32) "None" { %0 = spirv.Variable : !spirv.ptr - // CHECK: llvm.store %{{.*}}, %{{.*}} {nontemporal} : !llvm.ptr + // CHECK: llvm.store %{{.*}}, %{{.*}} {nontemporal} : f32, !llvm.ptr spirv.Store "Function" %0, %arg0 ["Nontemporal"] : f32 spirv.Return } @@ -182,10 +182,10 @@ // CHECK-LABEL: @variable_scalar spirv.func @variable_scalar() "None" { // CHECK: %[[SIZE1:.*]] = llvm.mlir.constant(1 : i32) : i32 - // CHECK: llvm.alloca %[[SIZE1]] x f32 : (i32) -> !llvm.ptr + // CHECK: llvm.alloca %[[SIZE1]] x f32 : (i32) -> !llvm.ptr %0 = spirv.Variable : !spirv.ptr // CHECK: %[[SIZE2:.*]] = llvm.mlir.constant(1 : i32) : i32 - // CHECK: llvm.alloca %[[SIZE2]] x i8 : (i32) -> !llvm.ptr + // CHECK: llvm.alloca %[[SIZE2]] x i8 : (i32) -> !llvm.ptr %1 = spirv.Variable : !spirv.ptr spirv.Return } @@ -194,8 +194,8 @@ spirv.func @variable_scalar_with_initialization() "None" { // CHECK: %[[VALUE:.*]] = llvm.mlir.constant(0 : i64) : i64 // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32 - // CHECK: %[[ALLOCATED:.*]] = llvm.alloca %[[SIZE]] x i64 : (i32) -> !llvm.ptr - // CHECK: llvm.store %[[VALUE]], %[[ALLOCATED]] : !llvm.ptr + // CHECK: %[[ALLOCATED:.*]] = llvm.alloca %[[SIZE]] x i64 : (i32) -> !llvm.ptr + // CHECK: llvm.store %[[VALUE]], %[[ALLOCATED]] : i64, !llvm.ptr %c = spirv.Constant 0 : i64 %0 = spirv.Variable init(%c) : !spirv.ptr spirv.Return @@ -204,7 +204,7 @@ // CHECK-LABEL: @variable_vector spirv.func @variable_vector() "None" { // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32 - // CHECK: llvm.alloca %[[SIZE]] x vector<3xf32> : (i32) -> !llvm.ptr> + // CHECK: llvm.alloca %[[SIZE]] x vector<3xf32> : (i32) -> !llvm.ptr %0 = spirv.Variable : !spirv.ptr, Function> spirv.Return } @@ -213,8 +213,8 @@ spirv.func @variable_vector_with_initialization() "None" { // CHECK: %[[VALUE:.*]] = llvm.mlir.constant(dense : vector<3xi1>) : vector<3xi1> // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32 - // CHECK: %[[ALLOCATED:.*]] = llvm.alloca %[[SIZE]] x vector<3xi1> : (i32) -> !llvm.ptr> - // CHECK: llvm.store %[[VALUE]], %[[ALLOCATED]] : !llvm.ptr> + // CHECK: %[[ALLOCATED:.*]] = llvm.alloca %[[SIZE]] x vector<3xi1> : (i32) -> !llvm.ptr + // CHECK: llvm.store %[[VALUE]], %[[ALLOCATED]] : vector<3xi1>, !llvm.ptr %c = spirv.Constant dense : vector<3xi1> %0 = spirv.Variable init(%c) : !spirv.ptr, Function> spirv.Return @@ -223,7 +223,7 @@ // CHECK-LABEL: @variable_array spirv.func @variable_array() "None" { // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32 - // CHECK: llvm.alloca %[[SIZE]] x !llvm.array<10 x i32> : (i32) -> !llvm.ptr> + // CHECK: llvm.alloca %[[SIZE]] x !llvm.array<10 x i32> : (i32) -> !llvm.ptr %0 = spirv.Variable : !spirv.ptr, Function> spirv.Return } diff --git a/mlir/test/Conversion/SPIRVToLLVM/misc-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/misc-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/misc-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/misc-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.CompositeExtract diff --git a/mlir/test/Conversion/SPIRVToLLVM/module-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/module-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/module-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/module-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.module diff --git a/mlir/test/Conversion/SPIRVToLLVM/shift-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/shift-ops-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/shift-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/shift-ops-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-spirv-to-llvm='use-opaque-pointers=1' %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.ShiftRightArithmetic diff --git a/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm-invalid.mlir b/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm-invalid.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm-invalid.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm-invalid.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt %s -convert-spirv-to-llvm -verify-diagnostics -split-input-file +// RUN: mlir-opt %s -convert-spirv-to-llvm='use-opaque-pointers=1' -verify-diagnostics -split-input-file // expected-error@+1 {{failed to legalize operation 'spirv.func' that was explicitly marked illegal}} spirv.func @array_with_unnatural_stride(%arg: !spirv.array<4 x f32, stride=8>) -> () "None" { diff --git a/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm.mlir --- a/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/spirv-types-to-llvm.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -split-input-file -convert-spirv-to-llvm -verify-diagnostics %s | FileCheck %s +// RUN: mlir-opt -split-input-file -convert-spirv-to-llvm='use-opaque-pointers=1' -verify-diagnostics %s | FileCheck %s //===----------------------------------------------------------------------===// // Array type @@ -14,10 +14,10 @@ // Pointer type //===----------------------------------------------------------------------===// -// CHECK-LABEL: @pointer_scalar(!llvm.ptr, !llvm.ptr) +// CHECK-LABEL: @pointer_scalar(!llvm.ptr, !llvm.ptr) spirv.func @pointer_scalar(!spirv.ptr, !spirv.ptr) "None" -// CHECK-LABEL: @pointer_vector(!llvm.ptr>) +// CHECK-LABEL: @pointer_vector(!llvm.ptr) spirv.func @pointer_vector(!spirv.ptr, Function>) "None" //===----------------------------------------------------------------------===// diff --git a/mlir/test/Conversion/SPIRVToLLVM/typed-pointers.mlir b/mlir/test/Conversion/SPIRVToLLVM/typed-pointers.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Conversion/SPIRVToLLVM/typed-pointers.mlir @@ -0,0 +1,18 @@ +// RUN: mlir-opt -split-input-file -convert-spirv-to-llvm='use-opaque-pointers=0' %s | FileCheck %s + +//===----------------------------------------------------------------------===// +// Pointer type +//===----------------------------------------------------------------------===// + +// CHECK-LABEL: @pointer_scalar(!llvm.ptr, !llvm.ptr) +spirv.func @pointer_scalar(!spirv.ptr, !spirv.ptr) "None" + +// CHECK-LABEL: @pointer_vector(!llvm.ptr>) +spirv.func @pointer_vector(!spirv.ptr, Function>) "None" + +// CHECK-LABEL: @bitcast_pointer +spirv.func @bitcast_pointer(%arg0: !spirv.ptr) "None" { + // CHECK: llvm.bitcast %{{.*}} : !llvm.ptr to !llvm.ptr + %0 = spirv.Bitcast %arg0 : !spirv.ptr to !spirv.ptr + spirv.Return +}