blob: 9a53f56ce70e8ead41f61d80a44f2090d9f3b329 [file] [log] [blame]
// 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
}