| // RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file | mlir-opt -allow-unregistered-dialect | FileCheck %s |
| |
| // CHECK-LABEL: @primitive |
| func @primitive() { |
| // CHECK: !llvm.void |
| "some.op"() : () -> !llvm.void |
| // CHECK: !llvm.ppc_fp128 |
| "some.op"() : () -> !llvm.ppc_fp128 |
| // CHECK: !llvm.x86_mmx |
| "some.op"() : () -> !llvm.x86_mmx |
| // CHECK: !llvm.token |
| "some.op"() : () -> !llvm.token |
| // CHECK: !llvm.label |
| "some.op"() : () -> !llvm.label |
| // CHECK: !llvm.metadata |
| "some.op"() : () -> !llvm.metadata |
| return |
| } |
| |
| // CHECK-LABEL: @func |
| func @func() { |
| // CHECK: !llvm.func<void ()> |
| "some.op"() : () -> !llvm.func<void ()> |
| // CHECK: !llvm.func<void (i32)> |
| "some.op"() : () -> !llvm.func<void (i32)> |
| // CHECK: !llvm.func<i32 ()> |
| "some.op"() : () -> !llvm.func<i32 ()> |
| // CHECK: !llvm.func<i32 (f16, bf16, f32, f64)> |
| "some.op"() : () -> !llvm.func<i32 (f16, bf16, f32, f64)> |
| // CHECK: !llvm.func<i32 (i32, i32)> |
| "some.op"() : () -> !llvm.func<i32 (i32, i32)> |
| // CHECK: !llvm.func<void (...)> |
| "some.op"() : () -> !llvm.func<void (...)> |
| // CHECK: !llvm.func<void (i32, i32, ...)> |
| "some.op"() : () -> !llvm.func<void (i32, i32, ...)> |
| return |
| } |
| |
| // CHECK-LABEL: @integer |
| func @integer() { |
| // CHECK: i1 |
| "some.op"() : () -> i1 |
| // CHECK: i8 |
| "some.op"() : () -> i8 |
| // CHECK: i16 |
| "some.op"() : () -> i16 |
| // CHECK: i32 |
| "some.op"() : () -> i32 |
| // CHECK: i64 |
| "some.op"() : () -> i64 |
| // CHECK: i57 |
| "some.op"() : () -> i57 |
| // CHECK: i129 |
| "some.op"() : () -> i129 |
| return |
| } |
| |
| // CHECK-LABEL: @ptr |
| func @ptr() { |
| // CHECK: !llvm.ptr<i8> |
| "some.op"() : () -> !llvm.ptr<i8> |
| // CHECK: !llvm.ptr<f32> |
| "some.op"() : () -> !llvm.ptr<f32> |
| // CHECK: !llvm.ptr<ptr<i8>> |
| "some.op"() : () -> !llvm.ptr<ptr<i8>> |
| // CHECK: !llvm.ptr<ptr<ptr<ptr<ptr<i8>>>>> |
| "some.op"() : () -> !llvm.ptr<ptr<ptr<ptr<ptr<i8>>>>> |
| // CHECK: !llvm.ptr<i8> |
| "some.op"() : () -> !llvm.ptr<i8, 0> |
| // CHECK: !llvm.ptr<i8, 1> |
| "some.op"() : () -> !llvm.ptr<i8, 1> |
| // CHECK: !llvm.ptr<i8, 42> |
| "some.op"() : () -> !llvm.ptr<i8, 42> |
| // CHECK: !llvm.ptr<ptr<i8, 42>, 9> |
| "some.op"() : () -> !llvm.ptr<ptr<i8, 42>, 9> |
| return |
| } |
| |
| // CHECK-LABEL: @vec |
| func @vec() { |
| // CHECK: vector<4xi32> |
| "some.op"() : () -> vector<4xi32> |
| // CHECK: vector<4xf32> |
| "some.op"() : () -> vector<4xf32> |
| // CHECK: !llvm.vec<? x 4 x i32> |
| "some.op"() : () -> !llvm.vec<? x 4 x i32> |
| // CHECK: !llvm.vec<? x 8 x f16> |
| "some.op"() : () -> !llvm.vec<? x 8 x f16> |
| // CHECK: !llvm.vec<4 x ptr<i8>> |
| "some.op"() : () -> !llvm.vec<4 x ptr<i8>> |
| return |
| } |
| |
| // CHECK-LABEL: @array |
| func @array() { |
| // CHECK: !llvm.array<10 x i32> |
| "some.op"() : () -> !llvm.array<10 x i32> |
| // CHECK: !llvm.array<8 x f32> |
| "some.op"() : () -> !llvm.array<8 x f32> |
| // CHECK: !llvm.array<10 x ptr<i32, 4>> |
| "some.op"() : () -> !llvm.array<10 x ptr<i32, 4>> |
| // CHECK: !llvm.array<10 x array<4 x f32>> |
| "some.op"() : () -> !llvm.array<10 x array<4 x f32>> |
| return |
| } |
| |
| // CHECK-LABEL: @literal_struct |
| func @literal_struct() { |
| // CHECK: !llvm.struct<()> |
| "some.op"() : () -> !llvm.struct<()> |
| // CHECK: !llvm.struct<(i32)> |
| "some.op"() : () -> !llvm.struct<(i32)> |
| // CHECK: !llvm.struct<(f32, i32)> |
| "some.op"() : () -> !llvm.struct<(f32, i32)> |
| // CHECK: !llvm.struct<(struct<(i32)>)> |
| "some.op"() : () -> !llvm.struct<(struct<(i32)>)> |
| // CHECK: !llvm.struct<(i32, struct<(i32)>, f32)> |
| "some.op"() : () -> !llvm.struct<(i32, struct<(i32)>, f32)> |
| |
| // CHECK: !llvm.struct<packed ()> |
| "some.op"() : () -> !llvm.struct<packed ()> |
| // CHECK: !llvm.struct<packed (i32)> |
| "some.op"() : () -> !llvm.struct<packed (i32)> |
| // CHECK: !llvm.struct<packed (f32, i32)> |
| "some.op"() : () -> !llvm.struct<packed (f32, i32)> |
| // CHECK: !llvm.struct<packed (f32, i32)> |
| "some.op"() : () -> !llvm.struct<packed (f32, i32)> |
| // CHECK: !llvm.struct<packed (struct<(i32)>)> |
| "some.op"() : () -> !llvm.struct<packed (struct<(i32)>)> |
| // CHECK: !llvm.struct<packed (i32, struct<(i32, i1)>, f32)> |
| "some.op"() : () -> !llvm.struct<packed (i32, struct<(i32, i1)>, f32)> |
| |
| // CHECK: !llvm.struct<(struct<packed (i32)>)> |
| "some.op"() : () -> !llvm.struct<(struct<packed (i32)>)> |
| // CHECK: !llvm.struct<packed (struct<(i32)>)> |
| "some.op"() : () -> !llvm.struct<packed (struct<(i32)>)> |
| return |
| } |
| |
| // CHECK-LABEL: @identified_struct |
| func @identified_struct() { |
| // CHECK: !llvm.struct<"empty", ()> |
| "some.op"() : () -> !llvm.struct<"empty", ()> |
| // CHECK: !llvm.struct<"opaque", opaque> |
| "some.op"() : () -> !llvm.struct<"opaque", opaque> |
| // CHECK: !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr<func<void ()>>)> |
| "some.op"() : () -> !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr<func<void ()>>)> |
| // CHECK: !llvm.struct<"self-recursive", (ptr<struct<"self-recursive">>)> |
| "some.op"() : () -> !llvm.struct<"self-recursive", (ptr<struct<"self-recursive">>)> |
| // CHECK: !llvm.struct<"unpacked", (i32)> |
| "some.op"() : () -> !llvm.struct<"unpacked", (i32)> |
| // CHECK: !llvm.struct<"packed", packed (i32)> |
| "some.op"() : () -> !llvm.struct<"packed", packed (i32)> |
| // CHECK: !llvm.struct<"name with spaces and !^$@$#", packed (i32)> |
| "some.op"() : () -> !llvm.struct<"name with spaces and !^$@$#", packed (i32)> |
| |
| // CHECK: !llvm.struct<"mutually-a", (ptr<struct<"mutually-b", (ptr<struct<"mutually-a">, 3>)>>)> |
| "some.op"() : () -> !llvm.struct<"mutually-a", (ptr<struct<"mutually-b", (ptr<struct<"mutually-a">, 3>)>>)> |
| // CHECK: !llvm.struct<"mutually-b", (ptr<struct<"mutually-a", (ptr<struct<"mutually-b">>)>, 3>)> |
| "some.op"() : () -> !llvm.struct<"mutually-b", (ptr<struct<"mutually-a", (ptr<struct<"mutually-b">>)>, 3>)> |
| // CHECK: !llvm.struct<"referring-another", (ptr<struct<"unpacked", (i32)>>)> |
| "some.op"() : () -> !llvm.struct<"referring-another", (ptr<struct<"unpacked", (i32)>>)> |
| |
| // CHECK: !llvm.struct<"struct-of-arrays", (array<10 x i32>)> |
| "some.op"() : () -> !llvm.struct<"struct-of-arrays", (array<10 x i32>)> |
| // CHECK: !llvm.array<10 x struct<"array-of-structs", (i32)>> |
| "some.op"() : () -> !llvm.array<10 x struct<"array-of-structs", (i32)>> |
| // CHECK: !llvm.ptr<struct<"ptr-to-struct", (i8)>> |
| "some.op"() : () -> !llvm.ptr<struct<"ptr-to-struct", (i8)>> |
| return |
| } |
| |
| func @verbose() { |
| // CHECK: !llvm.struct<(i64, struct<(f32)>)> |
| "some.op"() : () -> !llvm.struct<(i64, !llvm.struct<(f32)>)> |
| return |
| } |
| |
| // CHECK-LABEL: @ptr_elem_interface |
| // CHECK-COUNT-3: !llvm.ptr<!test.smpla> |
| func @ptr_elem_interface(%arg0: !llvm.ptr<!test.smpla>) { |
| %0 = llvm.load %arg0 : !llvm.ptr<!test.smpla> |
| llvm.store %0, %arg0 : !llvm.ptr<!test.smpla> |
| return |
| } |
| |
| // ----- |
| |
| // Check that type aliases can be used inside LLVM dialect types. Note that |
| // currently they are _not_ printed back as this would require |
| // DialectAsmPrinter to have a mechanism for querying the presence and |
| // usability of an alias outside of its `printType` method. |
| |
| !baz = type i64 |
| !qux = type !llvm.struct<(!baz)> |
| |
| !rec = type !llvm.struct<"a", (ptr<struct<"a">>)> |
| |
| // CHECK: aliases |
| llvm.func @aliases() { |
| // CHECK: !llvm.struct<(i32, f32, struct<(i64)>)> |
| "some.op"() : () -> !llvm.struct<(i32, f32, !qux)> |
| // CHECK: !llvm.struct<"a", (ptr<struct<"a">>)> |
| "some.op"() : () -> !rec |
| llvm.return |
| } |