1// RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file | mlir-opt -allow-unregistered-dialect | FileCheck %s 2 3// CHECK-LABEL: @primitive 4func.func @primitive() { 5 // CHECK: !llvm.void 6 "some.op"() : () -> !llvm.void 7 // CHECK: !llvm.ppc_fp128 8 "some.op"() : () -> !llvm.ppc_fp128 9 // CHECK: !llvm.token 10 "some.op"() : () -> !llvm.token 11 // CHECK: !llvm.label 12 "some.op"() : () -> !llvm.label 13 // CHECK: !llvm.metadata 14 "some.op"() : () -> !llvm.metadata 15 return 16} 17 18// CHECK-LABEL: @func 19func.func @func() { 20 // CHECK: !llvm.func<void ()> 21 "some.op"() : () -> !llvm.func<void ()> 22 // CHECK: !llvm.func<void (i32)> 23 "some.op"() : () -> !llvm.func<void (i32)> 24 // CHECK: !llvm.func<i32 ()> 25 "some.op"() : () -> !llvm.func<i32 ()> 26 // CHECK: !llvm.func<i32 (f16, bf16, f32, f64)> 27 "some.op"() : () -> !llvm.func<i32 (f16, bf16, f32, f64)> 28 // CHECK: !llvm.func<i32 (i32, i32)> 29 "some.op"() : () -> !llvm.func<i32 (i32, i32)> 30 // CHECK: !llvm.func<void (...)> 31 "some.op"() : () -> !llvm.func<void (...)> 32 // CHECK: !llvm.func<void (i32, i32, ...)> 33 "some.op"() : () -> !llvm.func<void (i32, i32, ...)> 34 return 35} 36 37// CHECK-LABEL: @integer 38func.func @integer() { 39 // CHECK: i1 40 "some.op"() : () -> i1 41 // CHECK: i8 42 "some.op"() : () -> i8 43 // CHECK: i16 44 "some.op"() : () -> i16 45 // CHECK: i32 46 "some.op"() : () -> i32 47 // CHECK: i64 48 "some.op"() : () -> i64 49 // CHECK: i57 50 "some.op"() : () -> i57 51 // CHECK: i129 52 "some.op"() : () -> i129 53 return 54} 55 56// CHECK-LABEL: @ptr 57func.func @ptr() { 58 // CHECK: !llvm.ptr 59 "some.op"() : () -> !llvm.ptr 60 // CHECK: !llvm.ptr 61 "some.op"() : () -> !llvm.ptr<0> 62 // CHECK: !llvm.ptr<42> 63 "some.op"() : () -> !llvm.ptr<42> 64 // CHECK: !llvm.ptr<9> 65 "some.op"() : () -> !llvm.ptr<9> 66 return 67} 68 69// CHECK-LABEL: @vec 70func.func @vec() { 71 // CHECK: vector<4xi32> 72 "some.op"() : () -> vector<4xi32> 73 // CHECK: vector<4xf32> 74 "some.op"() : () -> vector<4xf32> 75 // CHECK: !llvm.vec<? x 4 x i32> 76 "some.op"() : () -> !llvm.vec<? x 4 x i32> 77 // CHECK: !llvm.vec<? x 8 x f16> 78 "some.op"() : () -> !llvm.vec<? x 8 x f16> 79 // CHECK: !llvm.vec<4 x ptr> 80 "some.op"() : () -> !llvm.vec<4 x ptr> 81 return 82} 83 84// CHECK-LABEL: @array 85func.func @array() { 86 // CHECK: !llvm.array<10 x i32> 87 "some.op"() : () -> !llvm.array<10 x i32> 88 // CHECK: !llvm.array<8 x f32> 89 "some.op"() : () -> !llvm.array<8 x f32> 90 // CHECK: !llvm.array<10 x ptr<4>> 91 "some.op"() : () -> !llvm.array<10 x ptr<4>> 92 // CHECK: !llvm.array<10 x array<4 x f32>> 93 "some.op"() : () -> !llvm.array<10 x array<4 x f32>> 94 // CHECK: !llvm.array<10 x array<4 x vector<8xf32>>> 95 "some.op"() : () -> !llvm.array<10 x array<4 x vector<8xf32>>> 96 // CHECK: !llvm.array<10 x array<4 x vector<[8]xf32>>> 97 "some.op"() : () -> !llvm.array<10 x array<4 x vector<[8]xf32>>> 98 return 99} 100 101// CHECK-LABEL: @literal_struct 102func.func @literal_struct() { 103 // CHECK: !llvm.struct<()> 104 "some.op"() : () -> !llvm.struct<()> 105 // CHECK: !llvm.struct<(i32)> 106 "some.op"() : () -> !llvm.struct<(i32)> 107 // CHECK: !llvm.struct<(f32, i32)> 108 "some.op"() : () -> !llvm.struct<(f32, i32)> 109 // CHECK: !llvm.struct<(struct<(i32)>)> 110 "some.op"() : () -> !llvm.struct<(struct<(i32)>)> 111 // CHECK: !llvm.struct<(i32, struct<(i32)>, f32)> 112 "some.op"() : () -> !llvm.struct<(i32, struct<(i32)>, f32)> 113 114 // CHECK: !llvm.struct<packed ()> 115 "some.op"() : () -> !llvm.struct<packed ()> 116 // CHECK: !llvm.struct<packed (i32)> 117 "some.op"() : () -> !llvm.struct<packed (i32)> 118 // CHECK: !llvm.struct<packed (f32, i32)> 119 "some.op"() : () -> !llvm.struct<packed (f32, i32)> 120 // CHECK: !llvm.struct<packed (f32, i32)> 121 "some.op"() : () -> !llvm.struct<packed (f32, i32)> 122 // CHECK: !llvm.struct<packed (struct<(i32)>)> 123 "some.op"() : () -> !llvm.struct<packed (struct<(i32)>)> 124 // CHECK: !llvm.struct<packed (i32, struct<(i32, i1)>, f32)> 125 "some.op"() : () -> !llvm.struct<packed (i32, struct<(i32, i1)>, f32)> 126 127 // CHECK: !llvm.struct<(struct<packed (i32)>)> 128 "some.op"() : () -> !llvm.struct<(struct<packed (i32)>)> 129 // CHECK: !llvm.struct<packed (struct<(i32)>)> 130 "some.op"() : () -> !llvm.struct<packed (struct<(i32)>)> 131 return 132} 133 134// CHECK-LABEL: @identified_struct 135func.func @identified_struct() { 136 // CHECK: !llvm.struct<"empty", ()> 137 "some.op"() : () -> !llvm.struct<"empty", ()> 138 // CHECK: !llvm.struct<"opaque", opaque> 139 "some.op"() : () -> !llvm.struct<"opaque", opaque> 140 // CHECK: !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr)> 141 "some.op"() : () -> !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr)> 142 // CHECK: !llvm.struct<"unpacked", (i32)> 143 "some.op"() : () -> !llvm.struct<"unpacked", (i32)> 144 // CHECK: !llvm.struct<"packed", packed (i32)> 145 "some.op"() : () -> !llvm.struct<"packed", packed (i32)> 146 // CHECK: !llvm.struct<"name with spaces and !^$@$#", packed (i32)> 147 "some.op"() : () -> !llvm.struct<"name with spaces and !^$@$#", packed (i32)> 148 // CHECK: !llvm.struct<"outer", (struct<"nested", ()>)> 149 "some.op"() : () -> !llvm.struct<"outer", (struct<"nested", ()>)> 150 // CHECK: !llvm.struct<"referring-another", (ptr)> 151 "some.op"() : () -> !llvm.struct<"referring-another", (ptr)> 152 // CHECK: !llvm.struct<"struct-of-arrays", (array<10 x i32>)> 153 "some.op"() : () -> !llvm.struct<"struct-of-arrays", (array<10 x i32>)> 154 // CHECK: !llvm.array<10 x struct<"array-of-structs", (i32)>> 155 "some.op"() : () -> !llvm.array<10 x struct<"array-of-structs", (i32)>> 156 return 157} 158 159func.func @verbose() { 160 // CHECK: !llvm.struct<(i64, struct<(f32)>)> 161 "some.op"() : () -> !llvm.struct<(i64, !llvm.struct<(f32)>)> 162 return 163} 164 165// ----- 166 167// Check that type aliases can be used inside LLVM dialect types. Note that 168// currently they are _not_ printed back as this would require 169// DialectAsmPrinter to have a mechanism for querying the presence and 170// usability of an alias outside of its `printType` method. 171 172!baz = i64 173!qux = !llvm.struct<(!baz)> 174 175// CHECK: aliases 176llvm.func @aliases() { 177 // CHECK: !llvm.struct<(i32, f32, struct<(i64)>)> 178 "some.op"() : () -> !llvm.struct<(i32, f32, !qux)> 179 llvm.return 180} 181 182// ----- 183 184// CHECK-LABEL: ext_target 185llvm.func @ext_target() { 186 // CHECK: !llvm.target<"target1", i32, 1> 187 %0 = "some.op"() : () -> !llvm.target<"target1", i32, 1> 188 // CHECK: !llvm.target<"target2"> 189 %1 = "some.op"() : () -> !llvm.target<"target2"> 190 // CHECK: !llvm.target<"target3", i32, i64, f64> 191 %2 = "some.op"() : () -> !llvm.target<"target3", i32, i64, f64> 192 // CHECK: !llvm.target<"target4", 1, 0, 42> 193 %3 = "some.op"() : () -> !llvm.target<"target4", 1, 0, 42> 194 // CHECK: !llvm.target<"target5", i32, f64, 0, 5> 195 %4 = "some.op"() : () -> !llvm.target<"target5", i32, f64, 0, 5> 196 llvm.return 197} 198