xref: /llvm-project/mlir/test/IR/parser.mlir (revision 07c157a43534744bff8b9cf03a5ec8d19717ba72)
1bab5bcf8SMehdi Amini// RUN: mlir-opt -allow-unregistered-dialect %s | FileCheck %s
2b89b3cdbSRahul Kayaith// RUN: mlir-opt -allow-unregistered-dialect %s | mlir-opt -allow-unregistered-dialect | FileCheck %s
3b89b3cdbSRahul Kayaith// RUN: mlir-opt -allow-unregistered-dialect -mlir-print-op-generic %s | FileCheck %s -check-prefix GENERIC
4b89b3cdbSRahul Kayaith// RUN: mlir-opt -allow-unregistered-dialect %s | mlir-opt -allow-unregistered-dialect -mlir-print-op-generic | FileCheck %s -check-prefix GENERIC
59b9f7ff5SChris Lattner
6c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0, d1, d2, d3, d4)[s0] -> (d0, d1, d2, d4, d3)>
7c8496d29SRiver Riddle#map = affine_map<(d0, d1, d2, d3, d4)[s0] -> (d0, d1, d2, d4, d3)>
8fa75d621SMLIR Team
9c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0) -> (d0)>
104268e4f4SRiver Riddle#map1 = affine_map<(d0) -> (d0)>
11fa75d621SMLIR Team
12c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
134268e4f4SRiver Riddle#map2 = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
14fa75d621SMLIR Team
15c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0, d1, d2) -> (d1, d0, d2)>
164268e4f4SRiver Riddle#map3 = affine_map<(d0, d1, d2) -> (d1, d0, d2)>
17fa75d621SMLIR Team
18c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<()[s0] -> (0, s0 - 1)>
194268e4f4SRiver Riddle#inline_map_minmax_loop1 = affine_map<()[s0] -> (0, s0 - 1)>
20d32a28c5STatiana Shpeisman
21c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<()[s0] -> (100, s0 + 1)>
224268e4f4SRiver Riddle#inline_map_minmax_loop2 = affine_map<()[s0] -> (100, s0 + 1)>
23d32a28c5STatiana Shpeisman
24c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0, d1)[s0] -> (d0 + d1 + s0)>
254268e4f4SRiver Riddle#bound_map1 = affine_map<(i, j)[s] -> (i + j + s)>
26d32a28c5STatiana Shpeisman
27c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0, d1) -> (d0 + d1)>
284268e4f4SRiver Riddle#inline_map_loop_bounds2 = affine_map<(d0, d1) -> (d0 + d1)>
29d32a28c5STatiana Shpeisman
30c8496d29SRiver Riddle// CHECK-DAG: #map{{[0-9]*}} = affine_map<(d0)[s0] -> (d0 + s0, d0 - s0)>
314268e4f4SRiver Riddle#bound_map2 = affine_map<(i)[s] -> (i + s, i - s)>
32d32a28c5STatiana Shpeisman
3319f14b72SAlex Zinenko// All maps appear in arbitrary order before all sets, in arbitrary order.
34074cb429SSmit Hinsu// CHECK-NOT: Placeholder
3519f14b72SAlex Zinenko
36c8496d29SRiver Riddle// CHECK-DAG: #set{{[0-9]*}} = affine_set<(d0)[s0, s1] : (d0 >= 0, -d0 + s0 >= 0, s0 - 5 == 0, -d0 + s1 + 1 >= 0)>
374268e4f4SRiver Riddle#set0 = affine_set<(i)[N, M] : (i >= 0, -i + N >= 0, N - 5 == 0, -i + M + 1 >= 0)>
388a663870SUday Bondhugula
39c8496d29SRiver Riddle// CHECK-DAG: #set{{[0-9]*}} = affine_set<(d0, d1)[s0] : (d0 >= 0, d1 >= 0)>
404268e4f4SRiver Riddle#set1 = affine_set<(d0, d1)[s0] : (d0 >= 0, d1 >= 0)>
41ea65c695SUday Bondhugula
42c8496d29SRiver Riddle// CHECK-DAG: #set{{[0-9]*}} = affine_set<(d0) : (d0 - 1 == 0)>
434268e4f4SRiver Riddle#set2 = affine_set<(d0) : (d0 - 1 == 0)>
44ea65c695SUday Bondhugula
4595371ce9SMehdi Amini// CHECK-DAG: [[$SET_TRUE:#set[0-9]+]] = affine_set<() : (0 == 0)>
4638f8dc67SRiver Riddle
47c8496d29SRiver Riddle// CHECK-DAG: #set{{[0-9]*}} = affine_set<(d0)[s0] : (d0 - 2 >= 0, -d0 + 4 >= 0)>
488a663870SUday Bondhugula
49b7382ed3SRahul Joshi// CHECK: func private @foo(i32, i64) -> f32
506a99d290SRiver Riddlefunc.func private @foo(i32, i64) -> f32
519b9f7ff5SChris Lattner
52b7382ed3SRahul Joshi// CHECK: func private @bar()
536a99d290SRiver Riddlefunc.func private @bar() -> ()
549b9f7ff5SChris Lattner
55b7382ed3SRahul Joshi// CHECK: func private @baz() -> (i1, index, f32)
566a99d290SRiver Riddlefunc.func private @baz() -> (i1, index, f32)
579b9f7ff5SChris Lattner
58b7382ed3SRahul Joshi// CHECK: func private @missingReturn()
596a99d290SRiver Riddlefunc.func private @missingReturn()
6023b784a1SChris Lattner
61a44e6303SChris Lattner// CHECK: func private @int_types(i0, i1, i2, i4, i7, i87) -> (i1, index, i19)
626a99d290SRiver Riddlefunc.func private @int_types(i0, i1, i2, i4, i7, i87) -> (i1, index, i19)
636af866c5SChris Lattner
64b7382ed3SRahul Joshi// CHECK: func private @sint_types(si2, si4) -> (si7, si1023)
656a99d290SRiver Riddlefunc.func private @sint_types(si2, si4) -> (si7, si1023)
6635b68527SLei Zhang
67b7382ed3SRahul Joshi// CHECK: func private @uint_types(ui2, ui4) -> (ui7, ui1023)
686a99d290SRiver Riddlefunc.func private @uint_types(ui2, ui4) -> (ui7, ui1023)
6935b68527SLei Zhang
70cf0173deSValentin Clement// CHECK: func private @float_types(f80, f128)
716a99d290SRiver Riddlefunc.func private @float_types(f80, f128)
7223b784a1SChris Lattner
73ddf2d62cSMichal Terepeta// CHECK: func private @vectors(vector<f32>, vector<1xf32>, vector<2x4xf32>)
746a99d290SRiver Riddlefunc.func private @vectors(vector<f32>, vector<1 x f32>, vector<2x4xf32>)
7523b784a1SChris Lattner
76b7382ed3SRahul Joshi// CHECK: func private @tensors(tensor<*xf32>, tensor<*xvector<2x4xf32>>, tensor<1x?x4x?x?xi32>, tensor<i8>)
776a99d290SRiver Riddlefunc.func private @tensors(tensor<* x f32>, tensor<* x vector<2x4xf32>>,
78c77f39f5SChris Lattner                 tensor<1x?x4x?x?xi32>, tensor<i8>)
7923b784a1SChris Lattner
807714b405SAart Bik// CHECK: func private @tensor_encoding(tensor<16x32xf64, "sparse">)
816a99d290SRiver Riddlefunc.func private @tensor_encoding(tensor<16x32xf64, "sparse">)
827714b405SAart Bik
8371699961SRiver Riddle// CHECK: func private @large_shape_dimension(tensor<9223372036854775807xf32>)
846a99d290SRiver Riddlefunc.func private @large_shape_dimension(tensor<9223372036854775807xf32>)
8571699961SRiver Riddle
86c8496d29SRiver Riddle// CHECK: func private @functions((memref<1x?x4x?x?xi32, #map>, memref<8xi8>) -> (), () -> ())
87c8496d29SRiver Riddlefunc.func private @functions((memref<1x?x4x?x?xi32, #map, 0>, memref<8xi8, #map1, 0>) -> (), ()->())
8880b6bd24SChris Lattner
89b7382ed3SRahul Joshi// CHECK: func private @memrefs2(memref<2x4x8xi8, 1>)
906a99d290SRiver Riddlefunc.func private @memrefs2(memref<2x4x8xi8, #map2, 1>)
918e8114a9SMLIR Team
92b7382ed3SRahul Joshi// CHECK: func private @memrefs3(memref<2x4x8xi8>)
936a99d290SRiver Riddlefunc.func private @memrefs3(memref<2x4x8xi8, affine_map<(d0, d1, d2) -> (d0, d1, d2)>>)
948e8114a9SMLIR Team
95b7382ed3SRahul Joshi// CHECK: func private @memrefs_drop_triv_id_inline(memref<2xi8>)
966a99d290SRiver Riddlefunc.func private @memrefs_drop_triv_id_inline(memref<2xi8, affine_map<(d0) -> (d0)>>)
97aae372ecSAlex Zinenko
98b7382ed3SRahul Joshi// CHECK: func private @memrefs_drop_triv_id_inline0(memref<2xi8>)
996a99d290SRiver Riddlefunc.func private @memrefs_drop_triv_id_inline0(memref<2xi8, affine_map<(d0) -> (d0)>, 0>)
100aae372ecSAlex Zinenko
101b7382ed3SRahul Joshi// CHECK: func private @memrefs_drop_triv_id_inline1(memref<2xi8, 1>)
1026a99d290SRiver Riddlefunc.func private @memrefs_drop_triv_id_inline1(memref<2xi8, affine_map<(d0) -> (d0)>, 1>)
103aae372ecSAlex Zinenko
104f3bf5c05SVladislav Vinogradov// Test memref with custom memory space
105f3bf5c05SVladislav Vinogradov
106f3bf5c05SVladislav Vinogradov// CHECK: func private @memrefs_nomap_nospace(memref<5x6x7xf32>)
1076a99d290SRiver Riddlefunc.func private @memrefs_nomap_nospace(memref<5x6x7xf32>)
108f3bf5c05SVladislav Vinogradov
109c8496d29SRiver Riddle// CHECK: func private @memrefs_map_nospace(memref<5x6x7xf32, #map{{[0-9]*}}>)
1106a99d290SRiver Riddlefunc.func private @memrefs_map_nospace(memref<5x6x7xf32, #map3>)
111f3bf5c05SVladislav Vinogradov
112f3bf5c05SVladislav Vinogradov// CHECK: func private @memrefs_nomap_intspace(memref<5x6x7xf32, 3>)
1136a99d290SRiver Riddlefunc.func private @memrefs_nomap_intspace(memref<5x6x7xf32, 3>)
114f3bf5c05SVladislav Vinogradov
115c8496d29SRiver Riddle// CHECK: func private @memrefs_map_intspace(memref<5x6x7xf32, #map{{[0-9]*}}, 5>)
1166a99d290SRiver Riddlefunc.func private @memrefs_map_intspace(memref<5x6x7xf32, #map3, 5>)
117f3bf5c05SVladislav Vinogradov
118f3bf5c05SVladislav Vinogradov// CHECK: func private @memrefs_nomap_strspace(memref<5x6x7xf32, "local">)
1196a99d290SRiver Riddlefunc.func private @memrefs_nomap_strspace(memref<5x6x7xf32, "local">)
120f3bf5c05SVladislav Vinogradov
121c8496d29SRiver Riddle// CHECK: func private @memrefs_map_strspace(memref<5x6x7xf32, #map{{[0-9]*}}, "private">)
1226a99d290SRiver Riddlefunc.func private @memrefs_map_strspace(memref<5x6x7xf32, #map3, "private">)
123f3bf5c05SVladislav Vinogradov
124f3bf5c05SVladislav Vinogradov// CHECK: func private @memrefs_nomap_dictspace(memref<5x6x7xf32, {memSpace = "special", subIndex = 1 : i64}>)
1256a99d290SRiver Riddlefunc.func private @memrefs_nomap_dictspace(memref<5x6x7xf32, {memSpace = "special", subIndex = 1}>)
126f3bf5c05SVladislav Vinogradov
127c8496d29SRiver Riddle// CHECK: func private @memrefs_map_dictspace(memref<5x6x7xf32, #map{{[0-9]*}}, {memSpace = "special", subIndex = 3 : i64}>)
1286a99d290SRiver Riddlefunc.func private @memrefs_map_dictspace(memref<5x6x7xf32, #map3, {memSpace = "special", subIndex = 3}>)
1290fb905c0SChris Lattner
130b7382ed3SRahul Joshi// CHECK: func private @complex_types(complex<i1>) -> complex<f32>
1316a99d290SRiver Riddlefunc.func private @complex_types(complex<i1>) -> complex<f32>
1320fb905c0SChris Lattner
133b7382ed3SRahul Joshi// CHECK: func private @memref_with_index_elems(memref<1x?xindex>)
1346a99d290SRiver Riddlefunc.func private @memref_with_index_elems(memref<1x?xindex>)
135e12db3edSStephan Herhut
136b7382ed3SRahul Joshi// CHECK: func private @memref_with_complex_elems(memref<1x?xcomplex<f32>>)
1376a99d290SRiver Riddlefunc.func private @memref_with_complex_elems(memref<1x?xcomplex<f32>>)
1387e5d8a34SAlexander Belyaev
139b7382ed3SRahul Joshi// CHECK: func private @memref_with_vector_elems(memref<1x?xvector<10xf32>>)
1406a99d290SRiver Riddlefunc.func private @memref_with_vector_elems(memref<1x?xvector<10xf32>>)
1417e5d8a34SAlexander Belyaev
142ada9aa5aSAlex Zinenko// CHECK: func private @memref_with_custom_elem(memref<1x?x!test.memref_element>)
1436a99d290SRiver Riddlefunc.func private @memref_with_custom_elem(memref<1x?x!test.memref_element>)
144ada9aa5aSAlex Zinenko
145c59ce1f6SAlex Zinenko// CHECK: func private @memref_of_memref(memref<1xmemref<1xf64>>)
1466a99d290SRiver Riddlefunc.func private @memref_of_memref(memref<1xmemref<1xf64>>)
147c59ce1f6SAlex Zinenko
148c59ce1f6SAlex Zinenko// CHECK: func private @memref_of_unranked_memref(memref<1xmemref<*xf32>>)
1496a99d290SRiver Riddlefunc.func private @memref_of_unranked_memref(memref<1xmemref<*xf32>>)
150c59ce1f6SAlex Zinenko
151c59ce1f6SAlex Zinenko// CHECK: func private @unranked_memref_of_memref(memref<*xmemref<1xf32>>)
1526a99d290SRiver Riddlefunc.func private @unranked_memref_of_memref(memref<*xmemref<1xf32>>)
153c59ce1f6SAlex Zinenko
154c59ce1f6SAlex Zinenko// CHECK: func private @unranked_memref_of_unranked_memref(memref<*xmemref<*xi32>>)
1556a99d290SRiver Riddlefunc.func private @unranked_memref_of_unranked_memref(memref<*xmemref<*xi32>>)
156c59ce1f6SAlex Zinenko
157b7382ed3SRahul Joshi// CHECK: func private @unranked_memref_with_complex_elems(memref<*xcomplex<f32>>)
1586a99d290SRiver Riddlefunc.func private @unranked_memref_with_complex_elems(memref<*xcomplex<f32>>)
1597e5d8a34SAlexander Belyaev
160b7382ed3SRahul Joshi// CHECK: func private @unranked_memref_with_index_elems(memref<*xindex>)
1616a99d290SRiver Riddlefunc.func private @unranked_memref_with_index_elems(memref<*xindex>)
162b0d76f45SSean Silva
163b7382ed3SRahul Joshi// CHECK: func private @unranked_memref_with_vector_elems(memref<*xvector<10xf32>>)
1646a99d290SRiver Riddlefunc.func private @unranked_memref_with_vector_elems(memref<*xvector<10xf32>>)
165b0d76f45SSean Silva
16689bc449cSRiver Riddle// CHECK-LABEL: func @simpleCFG(%{{.*}}: i32, %{{.*}}: f32) -> i1 {
1676a99d290SRiver Riddlefunc.func @simpleCFG(%arg0: i32, %f: f32) -> i1 {
16889bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo"() : () -> i64
16972c24e3eSChris Lattner  %1 = "foo"() : ()->i64
17089bc449cSRiver Riddle  // CHECK: "bar"(%{{.*}}) : (i64) -> (i1, i1, i1)
17101140bd1SRiver Riddle  %2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
17289bc449cSRiver Riddle  // CHECK: return %{{.*}}#1
17321ede32fSChris Lattner  return %2#1 : i1
174b3fa7d0eSChris Lattner// CHECK: }
175b3fa7d0eSChris Lattner}
17680b6bd24SChris Lattner
17789bc449cSRiver Riddle// CHECK-LABEL: func @simpleCFGUsingBBArgs(%{{.*}}: i32, %{{.*}}: i64) {
1786a99d290SRiver Riddlefunc.func @simpleCFGUsingBBArgs(i32, i64) {
17937579ae8SChris Lattner^bb42 (%arg0: i32, %f: i64):
18089bc449cSRiver Riddle  // CHECK: "bar"(%{{.*}}) : (i64) -> (i1, i1, i1)
18101140bd1SRiver Riddle  %2:3 = "bar"(%f) : (i64) -> (i1,i1,i1)
1826472f5fbSJames Molloy  // CHECK: return{{$}}
1834144c302SJames Molloy  return
1844144c302SJames Molloy// CHECK: }
1854144c302SJames Molloy}
1864144c302SJames Molloy
187aea31f62SUday Bondhugula// CHECK-LABEL: func @block_label_empty_list
1886a99d290SRiver Riddlefunc.func @block_label_empty_list() {
189aea31f62SUday Bondhugula^bb0():
190aea31f62SUday Bondhugula  return
191aea31f62SUday Bondhugula}
192aea31f62SUday Bondhugula
193bbf362b7SChris Lattner// CHECK-LABEL: func @multiblock() {
1946a99d290SRiver Riddlefunc.func @multiblock() {
195c4f35a66SChris Lattner  return     // CHECK:   return
19637579ae8SChris Lattner^bb1:         // CHECK: ^bb1:   // no predecessors
197ace01605SRiver Riddle  cf.br ^bb4     // CHECK:   cf.br ^bb3
19837579ae8SChris Lattner^bb2:         // CHECK: ^bb2:   // pred: ^bb2
199ace01605SRiver Riddle  cf.br ^bb2     // CHECK:   cf.br ^bb2
20037579ae8SChris Lattner^bb4:         // CHECK: ^bb3:   // pred: ^bb1
201c4f35a66SChris Lattner  return     // CHECK:   return
202c4f35a66SChris Lattner}            // CHECK: }
2033609599aSTatiana Shpeisman
204bbf362b7SChris Lattner// CHECK-LABEL: func @emptyMLF() {
2056a99d290SRiver Riddlefunc.func @emptyMLF() {
206c4f35a66SChris Lattner  return     // CHECK:  return
207c4f35a66SChris Lattner}            // CHECK: }
2083609599aSTatiana Shpeisman
20989bc449cSRiver Riddle// CHECK-LABEL: func @func_with_one_arg(%{{.*}}: i1) -> i2 {
2106a99d290SRiver Riddlefunc.func @func_with_one_arg(%c : i1) -> i2 {
21189bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo"(%{{.*}}) : (i1) -> i2
212a0a6414cSTatiana Shpeisman  %b = "foo"(%c) : (i1) -> (i2)
21389bc449cSRiver Riddle  return %b : i2   // CHECK: return %{{.*}} : i2
2144e289a47STatiana Shpeisman} // CHECK: }
215a0a6414cSTatiana Shpeisman
21689bc449cSRiver Riddle// CHECK-LABEL: func @func_with_two_args(%{{.*}}: f16, %{{.*}}: i8) -> (i1, i32) {
2176a99d290SRiver Riddlefunc.func @func_with_two_args(%a : f16, %b : i8) -> (i1, i32) {
21889bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "foo"(%{{.*}}, %{{.*}}) : (f16, i8) -> (i1, i32)
21901140bd1SRiver Riddle  %c:2 = "foo"(%a, %b) : (f16, i8)->(i1, i32)
22089bc449cSRiver Riddle  return %c#0, %c#1 : i1, i32  // CHECK: return %{{.*}}#0, %{{.*}}#1 : i1, i32
2214e289a47STatiana Shpeisman} // CHECK: }
2226ada91dbSTatiana Shpeisman
22340d5d09fSAlex Zinenko// CHECK-LABEL: func @second_order_func() -> (() -> ()) {
2246a99d290SRiver Riddlefunc.func @second_order_func() -> (() -> ()) {
22589bc449cSRiver Riddle// CHECK-NEXT: %{{.*}} = constant @emptyMLF : () -> ()
22640d5d09fSAlex Zinenko  %c = constant @emptyMLF : () -> ()
22789bc449cSRiver Riddle// CHECK-NEXT: return %{{.*}} : () -> ()
22840d5d09fSAlex Zinenko  return %c : () -> ()
22940d5d09fSAlex Zinenko}
23040d5d09fSAlex Zinenko
23140d5d09fSAlex Zinenko// CHECK-LABEL: func @third_order_func() -> (() -> (() -> ())) {
2326a99d290SRiver Riddlefunc.func @third_order_func() -> (() -> (() -> ())) {
23389bc449cSRiver Riddle// CHECK-NEXT:  %{{.*}} = constant @second_order_func : () -> (() -> ())
23440d5d09fSAlex Zinenko  %c = constant @second_order_func : () -> (() -> ())
23589bc449cSRiver Riddle// CHECK-NEXT:  return %{{.*}} : () -> (() -> ())
23640d5d09fSAlex Zinenko  return %c : () -> (() -> ())
23740d5d09fSAlex Zinenko}
23840d5d09fSAlex Zinenko
23989bc449cSRiver Riddle// CHECK-LABEL: func @identity_functor(%{{.*}}: () -> ()) -> (() -> ())  {
2406a99d290SRiver Riddlefunc.func @identity_functor(%a : () -> ()) -> (() -> ())  {
24189bc449cSRiver Riddle// CHECK-NEXT: return %{{.*}} : () -> ()
24240d5d09fSAlex Zinenko  return %a : () -> ()
24340d5d09fSAlex Zinenko}
24440d5d09fSAlex Zinenko
245bbf362b7SChris Lattner// CHECK-LABEL: func @func_ops_in_loop() {
2466a99d290SRiver Riddlefunc.func @func_ops_in_loop() {
24789bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo"() : () -> i64
2489ebd3c7dSTatiana Shpeisman  %a = "foo"() : ()->i64
24989bc449cSRiver Riddle  // CHECK: affine.for %{{.*}} = 1 to 10 {
250832567b3SRiver Riddle  affine.for %i = 1 to 10 {
25189bc449cSRiver Riddle    // CHECK: %{{.*}} = "doo"() : () -> f32
2529ebd3c7dSTatiana Shpeisman    %b = "doo"() : ()->f32
25389bc449cSRiver Riddle    // CHECK: "bar"(%{{.*}}, %{{.*}}) : (i64, f32) -> ()
2549ebd3c7dSTatiana Shpeisman    "bar"(%a, %b) : (i64, f32) -> ()
2559ebd3c7dSTatiana Shpeisman  // CHECK: }
2569ebd3c7dSTatiana Shpeisman  }
2579ebd3c7dSTatiana Shpeisman  // CHECK: return
2589ebd3c7dSTatiana Shpeisman  return
2599ebd3c7dSTatiana Shpeisman  // CHECK: }
2609ebd3c7dSTatiana Shpeisman}
2619ebd3c7dSTatiana Shpeisman
2629ebd3c7dSTatiana Shpeisman
263bbf362b7SChris Lattner// CHECK-LABEL: func @loops() {
2646a99d290SRiver Riddlefunc.func @loops() {
26589bc449cSRiver Riddle  // CHECK: affine.for %{{.*}} = 1 to 100 step 2 {
266832567b3SRiver Riddle  affine.for %i = 1 to 100 step 2 {
26789bc449cSRiver Riddle    // CHECK: affine.for %{{.*}} = 1 to 200 {
268832567b3SRiver Riddle    affine.for %j = 1 to 200 {
269c4f35a66SChris Lattner    }        // CHECK:     }
270c4f35a66SChris Lattner  }          // CHECK:   }
271c4f35a66SChris Lattner  return     // CHECK:   return
272c4f35a66SChris Lattner}            // CHECK: }
273177ce721STatiana Shpeisman
274bbf362b7SChris Lattner// CHECK-LABEL: func @complex_loops() {
2756a99d290SRiver Riddlefunc.func @complex_loops() {
27689bc449cSRiver Riddle  affine.for %i1 = 1 to 100 {      // CHECK:   affine.for %{{.*}} = 1 to 100 {
27789bc449cSRiver Riddle    affine.for %j1 = 1 to 100 {    // CHECK:     affine.for %{{.*}} = 1 to 100 {
27889bc449cSRiver Riddle       // CHECK: "foo"(%{{.*}}, %{{.*}}) : (index, index) -> ()
279d2d89cbcSChris Lattner       "foo"(%i1, %j1) : (index,index) -> ()
280c8b0273fSTatiana Shpeisman    }                       // CHECK:     }
281c8b0273fSTatiana Shpeisman    "boo"() : () -> ()      // CHECK:     "boo"() : () -> ()
28289bc449cSRiver Riddle    affine.for %j2 = 1 to 10 {     // CHECK:     affine.for %{{.*}} = 1 to 10 {
28389bc449cSRiver Riddle      affine.for %k2 = 1 to 10 {   // CHECK:       affine.for %{{.*}} = 1 to 10 {
284c8b0273fSTatiana Shpeisman        "goo"() : () -> ()  // CHECK:         "goo"() : () -> ()
285c8b0273fSTatiana Shpeisman      }                     // CHECK:       }
286c8b0273fSTatiana Shpeisman    }                       // CHECK:     }
287c8b0273fSTatiana Shpeisman  }                         // CHECK:   }
288c8b0273fSTatiana Shpeisman  return                    // CHECK:   return
289c8b0273fSTatiana Shpeisman}                           // CHECK: }
290c8b0273fSTatiana Shpeisman
29189bc449cSRiver Riddle// CHECK: func @triang_loop(%{{.*}}: index, %{{.*}}: memref<?x?xi32>) {
2926a99d290SRiver Riddlefunc.func @triang_loop(%arg0: index, %arg1: memref<?x?xi32>) {
293a54f4eaeSMogball  %c = arith.constant 0 : i32       // CHECK: %{{.*}} = arith.constant 0 : i32
29489bc449cSRiver Riddle  affine.for %i0 = 1 to %arg0 {      // CHECK: affine.for %{{.*}} = 1 to %{{.*}} {
295c8496d29SRiver Riddle    affine.for %i1 = affine_map<(d0)[]->(d0)>(%i0)[] to %arg0 {  // CHECK:   affine.for %{{.*}} = #map{{[0-9]*}}(%{{.*}}) to %{{.*}} {
296e2310704SJulian Gross      memref.store %c, %arg1[%i0, %i1] : memref<?x?xi32>  // CHECK: memref.store %{{.*}}, %{{.*}}[%{{.*}}, %{{.*}}]
297d32a28c5STatiana Shpeisman    }          // CHECK:     }
298d32a28c5STatiana Shpeisman  }            // CHECK:   }
299d32a28c5STatiana Shpeisman  return       // CHECK:   return
300d32a28c5STatiana Shpeisman}              // CHECK: }
301d32a28c5STatiana Shpeisman
30289bc449cSRiver Riddle// CHECK: func @minmax_loop(%{{.*}}: index, %{{.*}}: index, %{{.*}}: memref<100xf32>) {
3036a99d290SRiver Riddlefunc.func @minmax_loop(%arg0: index, %arg1: index, %arg2: memref<100xf32>) {
30489bc449cSRiver Riddle  // CHECK: affine.for %{{.*}} = max #map{{.*}}()[%{{.*}}] to min #map{{.*}}()[%{{.*}}] {
3054268e4f4SRiver Riddle  affine.for %i0 = max affine_map<()[s]->(0,s-1)>()[%arg0] to min affine_map<()[s]->(100,s+1)>()[%arg1] {
30689bc449cSRiver Riddle    // CHECK: "foo"(%{{.*}}, %{{.*}}) : (memref<100xf32>, index) -> ()
307d2d89cbcSChris Lattner    "foo"(%arg2, %i0) : (memref<100xf32>, index) -> ()
308d32a28c5STatiana Shpeisman  }      // CHECK:   }
309d32a28c5STatiana Shpeisman  return // CHECK:   return
310d32a28c5STatiana Shpeisman}        // CHECK: }
311d32a28c5STatiana Shpeisman
31289bc449cSRiver Riddle// CHECK-LABEL: func @loop_bounds(%{{.*}}: index) {
3136a99d290SRiver Riddlefunc.func @loop_bounds(%N : index) {
31489bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo"(%{{.*}}) : (index) -> index
315d2d89cbcSChris Lattner  %s = "foo"(%N) : (index) -> index
31689bc449cSRiver Riddle  // CHECK: affine.for %{{.*}} = %{{.*}} to %{{.*}}
317832567b3SRiver Riddle  affine.for %i = %s to %N {
318c8496d29SRiver Riddle    // CHECK: affine.for %{{.*}} = #map{{[0-9]*}}(%{{.*}}) to 0
3194268e4f4SRiver Riddle    affine.for %j = affine_map<(d0)[]->(d0)>(%i)[] to 0 step 1 {
32089bc449cSRiver Riddle       // CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}]
3214268e4f4SRiver Riddle       %w1 = affine.apply affine_map<(d0, d1)[s0] -> (d0+d1)> (%i, %j) [%s]
32289bc449cSRiver Riddle       // CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}]
3234268e4f4SRiver Riddle       %w2 = affine.apply affine_map<(d0, d1)[s0] -> (s0+1)> (%i, %j) [%s]
32489bc449cSRiver Riddle       // CHECK: affine.for %{{.*}} = #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}] to #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}] {
3254268e4f4SRiver Riddle       affine.for %k = #bound_map1 (%w1, %i)[%N] to affine_map<(i, j)[s] -> (i + j + s)> (%w2, %j)[%s] {
32689bc449cSRiver Riddle          // CHECK: "foo"(%{{.*}}, %{{.*}}, %{{.*}}) : (index, index, index) -> ()
327d2d89cbcSChris Lattner          "foo"(%i, %j, %k) : (index, index, index)->()
328a54f4eaeSMogball          // CHECK: %{{.*}} = arith.constant 30 : index
329a54f4eaeSMogball          %c = arith.constant 30 : index
33089bc449cSRiver Riddle          // CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})
3314268e4f4SRiver Riddle          %u = affine.apply affine_map<(d0, d1)->(d0+d1)> (%N, %c)
33289bc449cSRiver Riddle          // CHECK: affine.for %{{.*}} = max #map{{.*}}(%{{.*}})[%{{.*}}] to min #map{{.*}}(%{{.*}})[%{{.*}}] {
333832567b3SRiver Riddle          affine.for %l = max #bound_map2(%i)[%u] to min #bound_map2(%k)[%c] {
33489bc449cSRiver Riddle            // CHECK: "bar"(%{{.*}}) : (index) -> ()
335d2d89cbcSChris Lattner            "bar"(%l) : (index) -> ()
336d32a28c5STatiana Shpeisman          } // CHECK:           }
337d32a28c5STatiana Shpeisman       }    // CHECK:         }
338d32a28c5STatiana Shpeisman     }      // CHECK:       }
339d32a28c5STatiana Shpeisman  }         // CHECK:     }
340d32a28c5STatiana Shpeisman  return    // CHECK:   return
341d32a28c5STatiana Shpeisman}           // CHECK: }
342d32a28c5STatiana Shpeisman
34389bc449cSRiver Riddle// CHECK-LABEL: func @ifinst(%{{.*}}: index) {
3446a99d290SRiver Riddlefunc.func @ifinst(%N: index) {
345*a5985ca5Sklensy  %c = arith.constant 200 : index // CHECK:  %{{.*}} = arith.constant 200
346*a5985ca5Sklensy  affine.for %i = 1 to 10 {           // CHECK:  affine.for %{{.*}} = 1 to 10 {
347*a5985ca5Sklensy    affine.if #set0(%i)[%N, %c] {     // CHECK:    affine.if #set(%{{.*}})[%{{.*}}, %{{.*}}] {
348a54f4eaeSMogball      %x = arith.constant 1 : i32
349a54f4eaeSMogball       // CHECK: %{{.*}} = arith.constant 1 : i32
35089bc449cSRiver Riddle      %y = "add"(%x, %i) : (i32, index) -> i32 // CHECK: %{{.*}} = "add"(%{{.*}}, %{{.*}}) : (i32, index) -> i32
35189bc449cSRiver Riddle      %z = "mul"(%y, %y) : (i32, i32) -> i32 // CHECK: %{{.*}} = "mul"(%{{.*}}, %{{.*}}) : (i32, i32) -> i32
35275553832SRiver Riddle    } else { // CHECK } else {
353*a5985ca5Sklensy      affine.if affine_set<(i)[N] : (i - 2 >= 0, 4 - i >= 0)>(%i)[%N]  {      // CHECK: affine.if #set1(%{{.*}})[%{{.*}}] {
354a54f4eaeSMogball        // CHECK: %{{.*}} = arith.constant 1 : index
355a54f4eaeSMogball        %u = arith.constant 1 : index
35689bc449cSRiver Riddle        // CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}]
3574268e4f4SRiver Riddle        %w = affine.apply affine_map<(d0,d1)[s0] -> (d0+d1+s0)> (%i, %i) [%u]
358c4f35a66SChris Lattner      } else {            // CHECK     } else {
359a54f4eaeSMogball        %v = arith.constant 3 : i32 // %c3_i32 = arith.constant 3 : i32
36075553832SRiver Riddle      }
361*a5985ca5Sklensy    }       // CHECK:    }
362*a5985ca5Sklensy  }         // CHECK:  }
363*a5985ca5Sklensy  return    // CHECK:  return
364*a5985ca5Sklensy}           // CHECK:}
365b0dabbd6SChris Lattner
36689bc449cSRiver Riddle// CHECK-LABEL: func @simple_ifinst(%{{.*}}: index) {
3676a99d290SRiver Riddlefunc.func @simple_ifinst(%N: index) {
368*a5985ca5Sklensy  %c = arith.constant 200 : index // CHECK:  %{{.*}} = arith.constant 200
369*a5985ca5Sklensy  affine.for %i = 1 to 10 {           // CHECK:  affine.for %{{.*}} = 1 to 10 {
370*a5985ca5Sklensy    affine.if #set0(%i)[%N, %c] {     // CHECK:    affine.if #set(%{{.*}})[%{{.*}}, %{{.*}}] {
371a54f4eaeSMogball      %x = arith.constant 1 : i32
372a54f4eaeSMogball       // CHECK: %{{.*}} = arith.constant 1 : i32
37389bc449cSRiver Riddle      %y = "add"(%x, %i) : (i32, index) -> i32 // CHECK: %{{.*}} = "add"(%{{.*}}, %{{.*}}) : (i32, index) -> i32
37489bc449cSRiver Riddle      %z = "mul"(%y, %y) : (i32, i32) -> i32 // CHECK: %{{.*}} = "mul"(%{{.*}}, %{{.*}}) : (i32, i32) -> i32
375*a5985ca5Sklensy    }       // CHECK:    }
376*a5985ca5Sklensy  }         // CHECK:  }
377*a5985ca5Sklensy  return    // CHECK:  return
378*a5985ca5Sklensy}           // CHECK:}
3798a663870SUday Bondhugula
380bbf362b7SChris Lattner// CHECK-LABEL: func @attributes() {
3816a99d290SRiver Riddlefunc.func @attributes() {
382c4f35a66SChris Lattner  // CHECK: "foo"()
383b3fa7d0eSChris Lattner  "foo"(){} : ()->()
384b0dabbd6SChris Lattner
385679a3b41SRiver Riddle  // CHECK: "foo"() {a = 1 : i64, b = -423 : i64, c = [true, false], d = 1.600000e+01 : f64}  : () -> ()
386679a3b41SRiver Riddle  "foo"() {a = 1, b = -423, c = [true, false], d = 16.0 } : () -> ()
387b0dabbd6SChris Lattner
388c8496d29SRiver Riddle  // CHECK: "foo"() {map1 = #map{{[0-9]*}}}
389679a3b41SRiver Riddle  "foo"() {map1 = #map1} : () -> ()
390f1e03961SMLIR Team
391c8496d29SRiver Riddle  // CHECK: "foo"() {map2 = #map{{[0-9]*}}}
3924268e4f4SRiver Riddle  "foo"() {map2 = affine_map<(d0, d1, d2) -> (d0, d1, d2)>} : () -> ()
393f1e03961SMLIR Team
394c8496d29SRiver Riddle  // CHECK: "foo"() {map12 = [#map{{[0-9]*}}, #map{{[0-9]*}}]}
395679a3b41SRiver Riddle  "foo"() {map12 = [#map1, #map2]} : () -> ()
396f1e03961SMLIR Team
397c8496d29SRiver Riddle  // CHECK: "foo"() {set1 = #set{{[0-9]*}}}
398679a3b41SRiver Riddle  "foo"() {set1 = #set1} : () -> ()
399ea65c695SUday Bondhugula
400c8496d29SRiver Riddle  // CHECK: "foo"() {set2 = #set{{[0-9]*}}}
4014268e4f4SRiver Riddle  "foo"() {set2 = affine_set<(d0, d1, d2) : (d0 >= 0, d1 >= 0, d2 - d1 == 0)>} : () -> ()
402ea65c695SUday Bondhugula
403c8496d29SRiver Riddle  // CHECK: "foo"() {set12 = [#set{{[0-9]*}}, #set{{[0-9]*}}]}
404679a3b41SRiver Riddle  "foo"() {set12 = [#set1, #set2]} : () -> ()
405ea65c695SUday Bondhugula
406679a3b41SRiver Riddle  // CHECK: "foo"() {dictionary = {bool = true, fn = @ifinst}}
407679a3b41SRiver Riddle  "foo"() {dictionary = {bool = true, fn = @ifinst}} : () -> ()
40894541563SRiver Riddle
40994541563SRiver Riddle  // Check that the dictionary attribute elements are sorted.
410679a3b41SRiver Riddle  // CHECK: "foo"() {dictionary = {bar = false, bool = true, fn = @ifinst}}
411679a3b41SRiver Riddle  "foo"() {dictionary = {fn = @ifinst, bar = false, bool = true}} : () -> ()
41294541563SRiver Riddle
413679a3b41SRiver Riddle  // CHECK: "foo"() {d = 1.000000e-09 : f64, func = [], i123 = 7 : i64, if = "foo"} : () -> ()
414679a3b41SRiver Riddle  "foo"() {if = "foo", func = [], i123 = 7, d = 1.e-9} : () -> ()
415b0dabbd6SChris Lattner
416679a3b41SRiver Riddle  // CHECK: "foo"() {fn = @attributes, if = @ifinst} : () -> ()
417679a3b41SRiver Riddle  "foo"() {fn = @attributes, if = @ifinst} : () -> ()
4183fa22b88SAlex Zinenko
419679a3b41SRiver Riddle  // CHECK: "foo"() {int = 0 : i42} : () -> ()
420679a3b41SRiver Riddle  "foo"() {int = 0 : i42} : () -> ()
4211928e20aSChris Lattner  return
4221928e20aSChris Lattner}
423b0dabbd6SChris Lattner
424bbf362b7SChris Lattner// CHECK-LABEL: func @ssa_values() -> (i16, i8) {
4256a99d290SRiver Riddlefunc.func @ssa_values() -> (i16, i8) {
42689bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "foo"() : () -> (i1, i17)
42701140bd1SRiver Riddle  %0:2 = "foo"() : () -> (i1, i17)
428ace01605SRiver Riddle  cf.br ^bb2
4293d2a2463SChris Lattner
43037579ae8SChris Lattner^bb1:       // CHECK: ^bb1: // pred: ^bb2
43189bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "baz"(%{{.*}}#1, %{{.*}}#0, %{{.*}}#1) : (f32, i11, i17) -> (i16, i8)
43201140bd1SRiver Riddle  %1:2 = "baz"(%2#1, %2#0, %0#1) : (f32, i11, i17) -> (i16, i8)
433e402dcc4SChris Lattner
43489bc449cSRiver Riddle  // CHECK: return %{{.*}}#0, %{{.*}}#1 : i16, i8
4354331e5feSChris Lattner  return %1#0, %1#1 : i16, i8
4363d2a2463SChris Lattner
43737579ae8SChris Lattner^bb2:       // CHECK: ^bb2:  // pred: ^bb0
43889bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "bar"(%{{.*}}#0, %{{.*}}#1) : (i1, i17) -> (i11, f32)
43901140bd1SRiver Riddle  %2:2 = "bar"(%0#0, %0#1) : (i1, i17) -> (i11, f32)
440ace01605SRiver Riddle  cf.br ^bb1
4413d2a2463SChris Lattner}
44221ede32fSChris Lattner
443bbf362b7SChris Lattner// CHECK-LABEL: func @bbargs() -> (i16, i8) {
4446a99d290SRiver Riddlefunc.func @bbargs() -> (i16, i8) {
44589bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "foo"() : () -> (i1, i17)
44601140bd1SRiver Riddle  %0:2 = "foo"() : () -> (i1, i17)
447ace01605SRiver Riddle  cf.br ^bb1(%0#1, %0#0 : i17, i1)
44821ede32fSChris Lattner
44989bc449cSRiver Riddle^bb1(%x: i17, %y: i1):       // CHECK: ^bb1(%{{.*}}: i17, %{{.*}}: i1):
45089bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "baz"(%{{.*}}, %{{.*}}, %{{.*}}#1) : (i17, i1, i17) -> (i16, i8)
45101140bd1SRiver Riddle  %1:2 = "baz"(%x, %y, %0#1) : (i17, i1, i17) -> (i16, i8)
4524331e5feSChris Lattner  return %1#0, %1#1 : i16, i8
45321ede32fSChris Lattner}
454f7f70ee6SJames Molloy
4556ce30becSAlex Zinenko// CHECK-LABEL: func @verbose_terminators() -> (i1, i17)
4566a99d290SRiver Riddlefunc.func @verbose_terminators() -> (i1, i17) {
45701140bd1SRiver Riddle  %0:2 = "foo"() : () -> (i1, i17)
458ace01605SRiver Riddle// CHECK:  cf.br ^bb1(%{{.*}}#0, %{{.*}}#1 : i1, i17)
459ace01605SRiver Riddle  "cf.br"(%0#0, %0#1)[^bb1] : (i1, i17) -> ()
4606ce30becSAlex Zinenko
4616ce30becSAlex Zinenko^bb1(%x : i1, %y : i17):
462ace01605SRiver Riddle// CHECK:  cf.cond_br %{{.*}}, ^bb2(%{{.*}} : i17), ^bb3(%{{.*}}, %{{.*}} : i1, i17)
463363b6559SMehdi Amini  "cf.cond_br"(%x, %y, %x, %y) [^bb2, ^bb3] {operandSegmentSizes = array<i32: 1, 1, 2>} : (i1, i17, i1, i17) -> ()
4646ce30becSAlex Zinenko
4656ce30becSAlex Zinenko^bb2(%a : i17):
466a54f4eaeSMogball  %true = arith.constant true
46789bc449cSRiver Riddle// CHECK:  return %{{.*}}, %{{.*}} : i1, i17
46823aa5a74SRiver Riddle  "func.return"(%true, %a) : (i1, i17) -> ()
4696ce30becSAlex Zinenko
4706ce30becSAlex Zinenko^bb3(%b : i1, %c : i17):
47189bc449cSRiver Riddle// CHECK:  return %{{.*}}, %{{.*}} : i1, i17
47223aa5a74SRiver Riddle  "func.return"(%b, %c) : (i1, i17) -> ()
4736ce30becSAlex Zinenko}
4746ce30becSAlex Zinenko
475bbf362b7SChris Lattner// CHECK-LABEL: func @condbr_simple
4766a99d290SRiver Riddlefunc.func @condbr_simple() -> (i32) {
477f7f70ee6SJames Molloy  %cond = "foo"() : () -> i1
478f7f70ee6SJames Molloy  %a = "bar"() : () -> i32
479f7f70ee6SJames Molloy  %b = "bar"() : () -> i64
480ace01605SRiver Riddle  // CHECK: cf.cond_br %{{.*}}, ^bb1(%{{.*}} : i32), ^bb2(%{{.*}} : i64)
481ace01605SRiver Riddle  cf.cond_br %cond, ^bb1(%a : i32), ^bb2(%b : i64)
482f7f70ee6SJames Molloy
48337579ae8SChris Lattner// CHECK: ^bb1({{.*}}: i32): // pred: ^bb0
48437579ae8SChris Lattner^bb1(%x : i32):
485ace01605SRiver Riddle  cf.br ^bb2(%b: i64)
486f7f70ee6SJames Molloy
48737579ae8SChris Lattner// CHECK: ^bb2({{.*}}: i64): // 2 preds: ^bb0, ^bb1
48837579ae8SChris Lattner^bb2(%y : i64):
489f7f70ee6SJames Molloy  %z = "foo"() : () -> i32
490f7f70ee6SJames Molloy  return %z : i32
491f7f70ee6SJames Molloy}
492f7f70ee6SJames Molloy
493bbf362b7SChris Lattner// CHECK-LABEL: func @condbr_moarargs
4946a99d290SRiver Riddlefunc.func @condbr_moarargs() -> (i32) {
495f7f70ee6SJames Molloy  %cond = "foo"() : () -> i1
496f7f70ee6SJames Molloy  %a = "bar"() : () -> i32
497f7f70ee6SJames Molloy  %b = "bar"() : () -> i64
498ace01605SRiver Riddle  // CHECK: cf.cond_br %{{.*}}, ^bb1(%{{.*}}, %{{.*}} : i32, i64), ^bb2(%{{.*}}, %{{.*}}, %{{.*}} : i64, i32, i32)
499ace01605SRiver Riddle  cf.cond_br %cond, ^bb1(%a, %b : i32, i64), ^bb2(%b, %a, %a : i64, i32, i32)
500f7f70ee6SJames Molloy
50137579ae8SChris Lattner^bb1(%x : i32, %y : i64):
502f7f70ee6SJames Molloy  return %x : i32
503f7f70ee6SJames Molloy
50437579ae8SChris Lattner^bb2(%x2 : i64, %y2 : i32, %z2 : i32):
505f7f70ee6SJames Molloy  %z = "foo"() : () -> i32
506f7f70ee6SJames Molloy  return %z : i32
507f7f70ee6SJames Molloy}
5088eaf3827SChris Lattner
5098eaf3827SChris Lattner
5108eaf3827SChris Lattner// Test pretty printing of constant names.
511bbf362b7SChris Lattner// CHECK-LABEL: func @constants
5126a99d290SRiver Riddlefunc.func @constants() -> (i32, i23, i23, i1, i1) {
513a54f4eaeSMogball  // CHECK: %{{.*}} = arith.constant 42 : i32
514a54f4eaeSMogball  %x = arith.constant 42 : i32
515a54f4eaeSMogball  // CHECK: %{{.*}} = arith.constant 17 : i23
516a54f4eaeSMogball  %y = arith.constant 17 : i23
5178eaf3827SChris Lattner
5188eaf3827SChris Lattner  // This is a redundant definition of 17, the asmprinter gives it a unique name
519a54f4eaeSMogball  // CHECK: %{{.*}} = arith.constant 17 : i23
520a54f4eaeSMogball  %z = arith.constant 17 : i23
5218eaf3827SChris Lattner
522a54f4eaeSMogball  // CHECK: %{{.*}} = arith.constant true
523a54f4eaeSMogball  %t = arith.constant true
524a54f4eaeSMogball  // CHECK: %{{.*}} = arith.constant false
525a54f4eaeSMogball  %f = arith.constant false
526fc1f2234SChris Lattner
52799b19c1dSAlex Zinenko  // The trick to parse type declarations should not interfere with hex
52899b19c1dSAlex Zinenko  // literals.
529a54f4eaeSMogball  // CHECK: %{{.*}} = arith.constant 3890 : i32
530a54f4eaeSMogball  %h = arith.constant 0xf32 : i32
53199b19c1dSAlex Zinenko
53289bc449cSRiver Riddle  // CHECK: return %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}
533fc1f2234SChris Lattner  return %x, %y, %z, %t, %f : i32, i23, i23, i1, i1
5348eaf3827SChris Lattner}
5358eaf3827SChris Lattner
536bbf362b7SChris Lattner// CHECK-LABEL: func @typeattr
5376a99d290SRiver Riddlefunc.func @typeattr() -> () {
53837579ae8SChris Lattner^bb0:
539679a3b41SRiver Riddle// CHECK: "foo"() {bar = tensor<*xf32>} : () -> ()
540679a3b41SRiver Riddle  "foo"(){bar = tensor<*xf32>} : () -> ()
54172645b31SJames Molloy  return
54272645b31SJames Molloy}
543ab60afb2SJames Molloy
544bbf362b7SChris Lattner// CHECK-LABEL: func @stringquote
5456a99d290SRiver Riddlefunc.func @stringquote() -> () {
54637579ae8SChris Lattner^bb0:
547679a3b41SRiver Riddle  // CHECK: "foo"() {bar = "a\22quoted\22string"} : () -> ()
548679a3b41SRiver Riddle  "foo"(){bar = "a\"quoted\"string"} : () -> ()
549bda669beSRiver Riddle
550bda669beSRiver Riddle  // CHECK-NEXT: "typed_string" : !foo.string
551bda669beSRiver Riddle  "foo"(){bar = "typed_string" : !foo.string} : () -> ()
552ab60afb2SJames Molloy  return
553ab60afb2SJames Molloy}
554d6c4c748SChris Lattner
55522ad45a7SRiver Riddle// CHECK-LABEL: func @unitAttrs
5566a99d290SRiver Riddlefunc.func @unitAttrs() -> () {
55703d7be2aSRiver Riddle  // CHECK-NEXT: "foo"() {unitAttr}
558679a3b41SRiver Riddle  "foo"() {unitAttr = unit} : () -> ()
55922ad45a7SRiver Riddle
56003d7be2aSRiver Riddle  // CHECK-NEXT: "foo"() {unitAttr}
56122ad45a7SRiver Riddle  "foo"() {unitAttr} : () -> ()
56203d7be2aSRiver Riddle
56303d7be2aSRiver Riddle  // CHECK-NEXT: "foo"() {nested = {unitAttr}}
56403d7be2aSRiver Riddle  "foo"() {nested = {unitAttr}} : () -> ()
56522ad45a7SRiver Riddle  return
56622ad45a7SRiver Riddle}
56722ad45a7SRiver Riddle
568bbf362b7SChris Lattner// CHECK-LABEL: func @floatAttrs
5696a99d290SRiver Riddlefunc.func @floatAttrs() -> () {
57037579ae8SChris Lattner^bb0:
571679a3b41SRiver Riddle  // CHECK: "foo"() {a = 4.000000e+00 : f64, b = 2.000000e+00 : f64, c = 7.100000e+00 : f64, d = -0.000000e+00 : f64} : () -> ()
572679a3b41SRiver Riddle  "foo"(){a = 4.0, b = 2.0, c = 7.1, d = -0.0} : () -> ()
573d6c4c748SChris Lattner  return
574d6c4c748SChris Lattner}
5757e004efaSFeng Liu
576b7382ed3SRahul Joshi// CHECK-LABEL: func private @externalfuncattr
5776a99d290SRiver Riddlefunc.func private @externalfuncattr() -> ()
578679a3b41SRiver Riddle  // CHECK: attributes {dialect.a = "a\22quoted\22string", dialect.b = 4.000000e+00 : f64, dialect.c = tensor<*xf32>}
579679a3b41SRiver Riddle  attributes {dialect.a = "a\"quoted\"string", dialect.b = 4.0, dialect.c = tensor<*xf32>}
5807e004efaSFeng Liu
581b7382ed3SRahul Joshi// CHECK-LABEL: func private @funcattrempty
5826a99d290SRiver Riddlefunc.func private @funcattrempty() -> ()
5837e004efaSFeng Liu  attributes {}
5847e004efaSFeng Liu
585b7382ed3SRahul Joshi// CHECK-LABEL: func private @funcattr
5866a99d290SRiver Riddlefunc.func private @funcattr() -> ()
587679a3b41SRiver Riddle  // CHECK: attributes {dialect.a = "a\22quoted\22string", dialect.b = 4.000000e+00 : f64, dialect.c = tensor<*xf32>}
588679a3b41SRiver Riddle  attributes {dialect.a = "a\"quoted\"string", dialect.b = 4.0, dialect.c = tensor<*xf32>} {
58937579ae8SChris Lattner^bb0:
5907e004efaSFeng Liu  return
5917e004efaSFeng Liu}
5927e004efaSFeng Liu
593bbf362b7SChris Lattner// CHECK-LABEL: func @funcattrwithblock
5946a99d290SRiver Riddlefunc.func @funcattrwithblock() -> ()
5957e004efaSFeng Liu  attributes {} {
59637579ae8SChris Lattner^bb0:
5977e004efaSFeng Liu  return
5987e004efaSFeng Liu}
5997e004efaSFeng Liu
600f0b0c025Sklensy// CHECK-LABEL: func @funcsimplemap
6014268e4f4SRiver Riddle#map_simple0 = affine_map<()[] -> (10)>
6024268e4f4SRiver Riddle#map_simple1 = affine_map<()[s0] -> (s0)>
6034268e4f4SRiver Riddle#map_non_simple0 = affine_map<(d0)[] -> (d0)>
6044268e4f4SRiver Riddle#map_non_simple1 = affine_map<(d0)[s0] -> (d0 + s0)>
6054268e4f4SRiver Riddle#map_non_simple2 = affine_map<()[s0, s1] -> (s0 + s1)>
6064268e4f4SRiver Riddle#map_non_simple3 = affine_map<()[s0] -> (s0 + 3)>
6076a99d290SRiver Riddlefunc.func @funcsimplemap(%arg0: index, %arg1: index) -> () {
608832567b3SRiver Riddle  affine.for %i0 = 0 to #map_simple0()[] {
60989bc449cSRiver Riddle  // CHECK: affine.for %{{.*}} = 0 to 10 {
610832567b3SRiver Riddle    affine.for %i1 = 0 to #map_simple1()[%arg1] {
61189bc449cSRiver Riddle    // CHECK: affine.for %{{.*}} = 0 to %{{.*}} {
612832567b3SRiver Riddle      affine.for %i2 = 0 to #map_non_simple0(%i0)[] {
61389bc449cSRiver Riddle      // CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}(%{{.*}}) {
614832567b3SRiver Riddle        affine.for %i3 = 0 to #map_non_simple1(%i0)[%arg1] {
61589bc449cSRiver Riddle        // CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}(%{{.*}})[%{{.*}}] {
616832567b3SRiver Riddle          affine.for %i4 = 0 to #map_non_simple2()[%arg1, %arg0] {
61789bc449cSRiver Riddle          // CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}()[%{{.*}}, %{{.*}}] {
618832567b3SRiver Riddle            affine.for %i5 = 0 to #map_non_simple3()[%arg0] {
61989bc449cSRiver Riddle            // CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}()[%{{.*}}] {
620a54f4eaeSMogball              %c42_i32 = arith.constant 42 : i32
621f9e50199SNicolas Vasilache            }
622f9e50199SNicolas Vasilache          }
62354e5b4b4SNicolas Vasilache        }
62454e5b4b4SNicolas Vasilache      }
62554e5b4b4SNicolas Vasilache    }
62654e5b4b4SNicolas Vasilache  }
627f9e50199SNicolas Vasilache  return
628f9e50199SNicolas Vasilache}
6295e3cca90SFeng Liu
630bbf362b7SChris Lattner// CHECK-LABEL: func @splattensorattr
6316a99d290SRiver Riddlefunc.func @splattensorattr() -> () {
63237579ae8SChris Lattner^bb0:
6339f498f92SLei Zhang  // CHECK: "splatBoolTensor"() {bar = dense<false> : tensor<i1>} : () -> ()
634679a3b41SRiver Riddle  "splatBoolTensor"(){bar = dense<false> : tensor<i1>} : () -> ()
6356d6ff729SRiver Riddle
636de5a81b1SRiver Riddle  // CHECK: "splatUIntTensor"() {bar = dense<222> : tensor<2x1x4xui8>} : () -> ()
637de5a81b1SRiver Riddle  "splatUIntTensor"(){bar = dense<222> : tensor<2x1x4xui8>} : () -> ()
638de5a81b1SRiver Riddle
639679a3b41SRiver Riddle  // CHECK: "splatIntTensor"() {bar = dense<5> : tensor<2x1x4xi32>} : () -> ()
640679a3b41SRiver Riddle  "splatIntTensor"(){bar = dense<5> : tensor<2x1x4xi32>} : () -> ()
6416d6ff729SRiver Riddle
642679a3b41SRiver Riddle  // CHECK: "splatFloatTensor"() {bar = dense<-5.000000e+00> : tensor<2x1x4xf32>} : () -> ()
643679a3b41SRiver Riddle  "splatFloatTensor"(){bar = dense<-5.0> : tensor<2x1x4xf32>} : () -> ()
6446d6ff729SRiver Riddle
645679a3b41SRiver Riddle  // CHECK: "splatIntVector"() {bar = dense<5> : vector<2x1x4xi64>} : () -> ()
646679a3b41SRiver Riddle  "splatIntVector"(){bar = dense<5> : vector<2x1x4xi64>} : () -> ()
6476d6ff729SRiver Riddle
648679a3b41SRiver Riddle  // CHECK: "splatFloatVector"() {bar = dense<-5.000000e+00> : vector<2x1x4xf16>} : () -> ()
649679a3b41SRiver Riddle  "splatFloatVector"(){bar = dense<-5.0> : vector<2x1x4xf16>} : () -> ()
650191aaa82SFeng Liu
651679a3b41SRiver Riddle  // CHECK: "splatIntScalar"() {bar = dense<5> : tensor<i9>} : () -> ()
652679a3b41SRiver Riddle  "splatIntScalar"() {bar = dense<5> : tensor<i9>} : () -> ()
653679a3b41SRiver Riddle  // CHECK: "splatFloatScalar"() {bar = dense<-5.000000e+00> : tensor<f16>} : () -> ()
654679a3b41SRiver Riddle  "splatFloatScalar"() {bar = dense<-5.0> : tensor<f16>} : () -> ()
6555e3cca90SFeng Liu  return
6565e3cca90SFeng Liu}
657b5b90e54SFeng Liu
658bbf362b7SChris Lattner// CHECK-LABEL: func @densetensorattr
6596a99d290SRiver Riddlefunc.func @densetensorattr() -> () {
66037579ae8SChris Lattner^bb0:
661b5b90e54SFeng Liu
662b5b90e54SFeng Liu// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
663679a3b41SRiver Riddle// CHECK: "fooi3"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi3>} : () -> ()
664679a3b41SRiver Riddle  "fooi3"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi3>} : () -> ()
665679a3b41SRiver Riddle// CHECK: "fooi6"() {bar = dense<{{\[\[\[}}5, -6, 1, 2]], {{\[\[}}7, 8, 3, 4]]]> : tensor<2x1x4xi6>} : () -> ()
666679a3b41SRiver Riddle  "fooi6"(){bar = dense<[[[5, -6, 1, 2]], [[7, 8, 3, 4]]]> : tensor<2x1x4xi6>} : () -> ()
667679a3b41SRiver Riddle// CHECK: "fooi8"() {bar = dense<5> : tensor<1x1x1xi8>} : () -> ()
668679a3b41SRiver Riddle  "fooi8"(){bar = dense<[[[5]]]> : tensor<1x1x1xi8>} : () -> ()
669679a3b41SRiver Riddle// CHECK: "fooi13"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi13>} : () -> ()
670679a3b41SRiver Riddle  "fooi13"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi13>} : () -> ()
671679a3b41SRiver Riddle// CHECK: "fooi16"() {bar = dense<-5> : tensor<1x1x1xi16>} : () -> ()
672679a3b41SRiver Riddle  "fooi16"(){bar = dense<[[[-5]]]> : tensor<1x1x1xi16>} : () -> ()
673679a3b41SRiver Riddle// CHECK: "fooi23"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi23>} : () -> ()
674679a3b41SRiver Riddle  "fooi23"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi23>} : () -> ()
675679a3b41SRiver Riddle// CHECK: "fooi32"() {bar = dense<5> : tensor<1x1x1xi32>} : () -> ()
676679a3b41SRiver Riddle  "fooi32"(){bar = dense<[[[5]]]> : tensor<1x1x1xi32>} : () -> ()
677679a3b41SRiver Riddle// CHECK: "fooi33"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi33>} : () -> ()
678679a3b41SRiver Riddle  "fooi33"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi33>} : () -> ()
679679a3b41SRiver Riddle// CHECK: "fooi43"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi43>} : () -> ()
680679a3b41SRiver Riddle  "fooi43"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi43>} : () -> ()
681679a3b41SRiver Riddle// CHECK: "fooi53"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi53>} : () -> ()
682679a3b41SRiver Riddle  "fooi53"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi53>} : () -> ()
683679a3b41SRiver Riddle// CHECK: "fooi64"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 3, -1, 2]]]> : tensor<2x1x4xi64>} : () -> ()
684679a3b41SRiver Riddle  "fooi64"(){bar = dense<[[[1, -2, 1, 2]], [[0, 3, -1, 2]]]> : tensor<2x1x4xi64>} : () -> ()
685679a3b41SRiver Riddle// CHECK: "fooi64"() {bar = dense<-5> : tensor<1x1x1xi64>} : () -> ()
686679a3b41SRiver Riddle  "fooi64"(){bar = dense<[[[-5]]]> : tensor<1x1x1xi64>} : () -> ()
687679a3b41SRiver Riddle// CHECK: "fooi67"() {bar = dense<{{\[\[\[}}-5, 4, 6, 2]]]> : vector<1x1x4xi67>} : () -> ()
688679a3b41SRiver Riddle  "fooi67"(){bar = dense<[[[-5, 4, 6, 2]]]> : vector<1x1x4xi67>} : () -> ()
689b5b90e54SFeng Liu
69024aa4effSRiver Riddle// CHECK: "foo2"() {bar = dense<> : tensor<0xi32>} : () -> ()
69124aa4effSRiver Riddle  "foo2"(){bar = dense<> : tensor<0xi32>} : () -> ()
69224aa4effSRiver Riddle// CHECK: "foo2"() {bar = dense<> : tensor<1x0xi32>} : () -> ()
69324aa4effSRiver Riddle  "foo2"(){bar = dense<> : tensor<1x0xi32>} : () -> ()
69424aa4effSRiver Riddle// CHECK: dense<> : tensor<0x512x512xi32>
69524aa4effSRiver Riddle  "foo2"(){bar = dense<> : tensor<0x512x512xi32>} : () -> ()
696679a3b41SRiver Riddle// CHECK: "foo3"() {bar = dense<{{\[\[\[}}5, -6, 1, 2]], {{\[\[}}7, 8, 3, 4]]]> : tensor<2x1x4xi32>} : () -> ()
697679a3b41SRiver Riddle  "foo3"(){bar = dense<[[[5, -6, 1, 2]], [[7, 8, 3, 4]]]> : tensor<2x1x4xi32>} : () -> ()
698b5b90e54SFeng Liu
699679a3b41SRiver Riddle// CHECK: "float1"() {bar = dense<5.000000e+00> : tensor<1x1x1xf32>} : () -> ()
700679a3b41SRiver Riddle  "float1"(){bar = dense<[[[5.0]]]> : tensor<1x1x1xf32>} : () -> ()
70124aa4effSRiver Riddle// CHECK: "float2"() {bar = dense<> : tensor<0xf32>} : () -> ()
70224aa4effSRiver Riddle  "float2"(){bar = dense<> : tensor<0xf32>} : () -> ()
70324aa4effSRiver Riddle// CHECK: "float2"() {bar = dense<> : tensor<1x0xf32>} : () -> ()
70424aa4effSRiver Riddle  "float2"(){bar = dense<> : tensor<1x0xf32>} : () -> ()
705b5b90e54SFeng Liu
706679a3b41SRiver Riddle// CHECK: "bfloat16"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : tensor<2x1x4xbf16>} : () -> ()
707679a3b41SRiver Riddle  "bfloat16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xbf16>} : () -> ()
708679a3b41SRiver Riddle// CHECK: "float16"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : tensor<2x1x4xf16>} : () -> ()
709679a3b41SRiver Riddle  "float16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xf16>} : () -> ()
710679a3b41SRiver Riddle// CHECK: "float32"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : tensor<2x1x4xf32>} : () -> ()
711679a3b41SRiver Riddle  "float32"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xf32>} : () -> ()
712679a3b41SRiver Riddle// CHECK: "float64"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : tensor<2x1x4xf64>} : () -> ()
713679a3b41SRiver Riddle  "float64"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xf64>} : () -> ()
714191aaa82SFeng Liu
715679a3b41SRiver Riddle// CHECK: "intscalar"() {bar = dense<1> : tensor<i32>} : () -> ()
716679a3b41SRiver Riddle  "intscalar"(){bar = dense<1> : tensor<i32>} : () -> ()
717679a3b41SRiver Riddle// CHECK: "floatscalar"() {bar = dense<5.000000e+00> : tensor<f32>} : () -> ()
718679a3b41SRiver Riddle  "floatscalar"(){bar = dense<5.0> : tensor<f32>} : () -> ()
7191b2c7877SSean Silva
7201b2c7877SSean Silva// CHECK: "index"() {bar = dense<1> : tensor<index>} : () -> ()
7211b2c7877SSean Silva  "index"(){bar = dense<1> : tensor<index>} : () -> ()
7221b2c7877SSean Silva// CHECK: "index"() {bar = dense<[1, 2]> : tensor<2xindex>} : () -> ()
7231b2c7877SSean Silva  "index"(){bar = dense<[1, 2]> : tensor<2xindex>} : () -> ()
72424ad3858SRiver Riddle
72524ad3858SRiver Riddle  // CHECK: dense<(1,1)> : tensor<complex<i64>>
72624ad3858SRiver Riddle  "complex_attr"(){bar = dense<(1,1)> : tensor<complex<i64>>} : () -> ()
72724ad3858SRiver Riddle  // CHECK: dense<[(1,1), (2,2)]> : tensor<2xcomplex<i64>>
72824ad3858SRiver Riddle  "complex_attr"(){bar = dense<[(1,1), (2,2)]> : tensor<2xcomplex<i64>>} : () -> ()
72924ad3858SRiver Riddle  // CHECK: dense<(1.000000e+00,0.000000e+00)> : tensor<complex<f32>>
73024ad3858SRiver Riddle  "complex_attr"(){bar = dense<(1.000000e+00,0.000000e+00)> : tensor<complex<f32>>} : () -> ()
73124ad3858SRiver Riddle  // CHECK: dense<[(1.000000e+00,0.000000e+00), (2.000000e+00,2.000000e+00)]> : tensor<2xcomplex<f32>>
73224ad3858SRiver Riddle  "complex_attr"(){bar = dense<[(1.000000e+00,0.000000e+00), (2.000000e+00,2.000000e+00)]> : tensor<2xcomplex<f32>>} : () -> ()
733b5b90e54SFeng Liu  return
734b5b90e54SFeng Liu}
735b5b90e54SFeng Liu
736bbf362b7SChris Lattner// CHECK-LABEL: func @densevectorattr
7376a99d290SRiver Riddlefunc.func @densevectorattr() -> () {
73837579ae8SChris Lattner^bb0:
739b5b90e54SFeng Liu// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
740679a3b41SRiver Riddle// CHECK: "fooi8"() {bar = dense<5> : vector<1x1x1xi8>} : () -> ()
741679a3b41SRiver Riddle  "fooi8"(){bar = dense<[[[5]]]> : vector<1x1x1xi8>} : () -> ()
742679a3b41SRiver Riddle// CHECK: "fooi16"() {bar = dense<-5> : vector<1x1x1xi16>} : () -> ()
743679a3b41SRiver Riddle  "fooi16"(){bar = dense<[[[-5]]]> : vector<1x1x1xi16>} : () -> ()
744679a3b41SRiver Riddle// CHECK: "foo32"() {bar = dense<5> : vector<1x1x1xi32>} : () -> ()
745679a3b41SRiver Riddle  "foo32"(){bar = dense<[[[5]]]> : vector<1x1x1xi32>} : () -> ()
746679a3b41SRiver Riddle// CHECK: "fooi64"() {bar = dense<-5> : vector<1x1x1xi64>} : () -> ()
747679a3b41SRiver Riddle  "fooi64"(){bar = dense<[[[-5]]]> : vector<1x1x1xi64>} : () -> ()
748b5b90e54SFeng Liu
749679a3b41SRiver Riddle// CHECK: "foo3"() {bar = dense<{{\[\[\[}}5, -6, 1, 2]], {{\[\[}}7, 8, 3, 4]]]> : vector<2x1x4xi32>} : () -> ()
750679a3b41SRiver Riddle  "foo3"(){bar = dense<[[[5, -6, 1, 2]], [[7, 8, 3, 4]]]> : vector<2x1x4xi32>} : () -> ()
751b5b90e54SFeng Liu
752679a3b41SRiver Riddle// CHECK: "float1"() {bar = dense<5.000000e+00> : vector<1x1x1xf32>} : () -> ()
753679a3b41SRiver Riddle  "float1"(){bar = dense<[[[5.0]]]> : vector<1x1x1xf32>} : () -> ()
754b5b90e54SFeng Liu
755679a3b41SRiver Riddle// CHECK: "bfloat16"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : vector<2x1x4xbf16>} : () -> ()
756679a3b41SRiver Riddle  "bfloat16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xbf16>} : () -> ()
757679a3b41SRiver Riddle// CHECK: "float16"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : vector<2x1x4xf16>} : () -> ()
758679a3b41SRiver Riddle  "float16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xf16>} : () -> ()
759679a3b41SRiver Riddle// CHECK: "float32"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : vector<2x1x4xf32>} : () -> ()
760679a3b41SRiver Riddle  "float32"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xf32>} : () -> ()
761679a3b41SRiver Riddle// CHECK: "float64"() {bar = dense<{{\[\[\[}}-5.000000e+00, 6.000000e+00, 1.000000e+00, 2.000000e+00]], {{\[\[}}7.000000e+00, -8.000000e+00, 3.000000e+00, 4.000000e+00]]]> : vector<2x1x4xf64>} : () -> ()
762679a3b41SRiver Riddle  "float64"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xf64>} : () -> ()
763b5b90e54SFeng Liu  return
764b5b90e54SFeng Liu}
76503b48999SFeng Liu
766bbf362b7SChris Lattner// CHECK-LABEL: func @sparsetensorattr
7676a99d290SRiver Riddlefunc.func @sparsetensorattr() -> () {
76837579ae8SChris Lattner^bb0:
76903b48999SFeng Liu// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
770679a3b41SRiver Riddle// CHECK: "fooi8"() {bar = sparse<0, -2> : tensor<1x1x1xi8>} : () -> ()
771679a3b41SRiver Riddle  "fooi8"(){bar = sparse<0, -2> : tensor<1x1x1xi8>} : () -> ()
772679a3b41SRiver Riddle// CHECK: "fooi16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2, -1, 5]> : tensor<2x2x2xi16>} : () -> ()
773679a3b41SRiver Riddle  "fooi16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2, -1, 5]> : tensor<2x2x2xi16>} : () -> ()
77424aa4effSRiver Riddle// CHECK: "fooi32"() {bar = sparse<> : tensor<1x1xi32>} : () -> ()
77524aa4effSRiver Riddle  "fooi32"(){bar = sparse<> : tensor<1x1xi32>} : () -> ()
776679a3b41SRiver Riddle// CHECK: "fooi64"() {bar = sparse<0, -1> : tensor<1xi64>} : () -> ()
7774f21152aSRiver Riddle  "fooi64"(){bar = sparse<[0], [-1]> : tensor<1xi64>} : () -> ()
77824aa4effSRiver Riddle// CHECK: "foo2"() {bar = sparse<> : tensor<0xi32>} : () -> ()
77924aa4effSRiver Riddle  "foo2"(){bar = sparse<> : tensor<0xi32>} : () -> ()
78024aa4effSRiver Riddle// CHECK: "foo3"() {bar = sparse<> : tensor<i32>} : () -> ()
78124aa4effSRiver Riddle  "foo3"(){bar = sparse<> : tensor<i32>} : () -> ()
78203b48999SFeng Liu
783679a3b41SRiver Riddle// CHECK: "foof16"() {bar = sparse<0, -2.000000e+00> : tensor<1x1x1xf16>} : () -> ()
784679a3b41SRiver Riddle  "foof16"(){bar = sparse<0, -2.0> : tensor<1x1x1xf16>} : () -> ()
785679a3b41SRiver Riddle// CHECK: "foobf16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2.000000e+00, -1.000000e+00, 5.000000e+00]> : tensor<2x2x2xbf16>} : () -> ()
786679a3b41SRiver Riddle  "foobf16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2.0, -1.0, 5.0]> : tensor<2x2x2xbf16>} : () -> ()
78724aa4effSRiver Riddle// CHECK: "foof32"() {bar = sparse<> : tensor<1x0x1xf32>} : () -> ()
78824aa4effSRiver Riddle  "foof32"(){bar = sparse<> : tensor<1x0x1xf32>} : () -> ()
789679a3b41SRiver Riddle// CHECK:  "foof64"() {bar = sparse<0, -1.000000e+00> : tensor<1xf64>} : () -> ()
790679a3b41SRiver Riddle  "foof64"(){bar = sparse<[[0]], [-1.0]> : tensor<1xf64>} : () -> ()
79124aa4effSRiver Riddle// CHECK: "foof320"() {bar = sparse<> : tensor<0xf32>} : () -> ()
79224aa4effSRiver Riddle  "foof320"(){bar = sparse<> : tensor<0xf32>} : () -> ()
79324aa4effSRiver Riddle// CHECK: "foof321"() {bar = sparse<> : tensor<f32>} : () -> ()
79424aa4effSRiver Riddle  "foof321"(){bar = sparse<> : tensor<f32>} : () -> ()
795fb674e33SRob Suderman
796ab9cdf09SRiver Riddle// CHECK: "foostr"() {bar = sparse<0, "foo"> : tensor<1x1x1x!unknown<>>} : () -> ()
797ab9cdf09SRiver Riddle  "foostr"(){bar = sparse<0, "foo"> : tensor<1x1x1x!unknown<>>} : () -> ()
798ab9cdf09SRiver Riddle// CHECK: "foostr"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}"a", "b", "c"]> : tensor<2x2x2x!unknown<>>} : () -> ()
799ab9cdf09SRiver Riddle  "foostr"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], ["a", "b", "c"]> : tensor<2x2x2x!unknown<>>} : () -> ()
80003b48999SFeng Liu  return
80103b48999SFeng Liu}
80203b48999SFeng Liu
803bbf362b7SChris Lattner// CHECK-LABEL: func @sparsevectorattr
8046a99d290SRiver Riddlefunc.func @sparsevectorattr() -> () {
80537579ae8SChris Lattner^bb0:
80603b48999SFeng Liu// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
807679a3b41SRiver Riddle// CHECK: "fooi8"() {bar = sparse<0, -2> : vector<1x1x1xi8>} : () -> ()
808679a3b41SRiver Riddle  "fooi8"(){bar = sparse<0, -2> : vector<1x1x1xi8>} : () -> ()
809679a3b41SRiver Riddle// CHECK: "fooi16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2, -1, 5]> : vector<2x2x2xi16>} : () -> ()
810679a3b41SRiver Riddle  "fooi16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2, -1, 5]> : vector<2x2x2xi16>} : () -> ()
81124aa4effSRiver Riddle// CHECK: "fooi32"() {bar = sparse<> : vector<1x1xi32>} : () -> ()
81224aa4effSRiver Riddle  "fooi32"(){bar = sparse<> : vector<1x1xi32>} : () -> ()
813679a3b41SRiver Riddle// CHECK: "fooi64"() {bar = sparse<0, -1> : vector<1xi64>} : () -> ()
814679a3b41SRiver Riddle  "fooi64"(){bar = sparse<[[0]], [-1]> : vector<1xi64>} : () -> ()
81503b48999SFeng Liu
816679a3b41SRiver Riddle// CHECK: "foof16"() {bar = sparse<0, -2.000000e+00> : vector<1x1x1xf16>} : () -> ()
817679a3b41SRiver Riddle  "foof16"(){bar = sparse<0, -2.0> : vector<1x1x1xf16>} : () -> ()
818679a3b41SRiver Riddle// CHECK: "foobf16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2.000000e+00, -1.000000e+00, 5.000000e+00]> : vector<2x2x2xbf16>} : () -> ()
819679a3b41SRiver Riddle  "foobf16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2.0, -1.0, 5.0]> : vector<2x2x2xbf16>} : () -> ()
820679a3b41SRiver Riddle// CHECK:  "foof64"() {bar = sparse<0, -1.000000e+00> : vector<1xf64>} : () -> ()
821679a3b41SRiver Riddle  "foof64"(){bar = sparse<0, [-1.0]> : vector<1xf64>} : () -> ()
82203b48999SFeng Liu  return
82303b48999SFeng Liu}
824aaa1d77eSChris Lattner
825ab9cdf09SRiver Riddle// CHECK-LABEL: func @unknown_dialect_type() -> !bar<> {
826ab9cdf09SRiver Riddlefunc.func @unknown_dialect_type() -> !bar<> {
8273b2c5600SRiver Riddle  // Unregistered dialect 'bar'.
828ab9cdf09SRiver Riddle  // CHECK: "foo"() : () -> !bar<>
829ab9cdf09SRiver Riddle  %0 = "foo"() : () -> !bar<>
8303b2c5600SRiver Riddle
83172441fcbSChris Lattner  // CHECK: "foo"() : () -> !bar.baz
832ab9cdf09SRiver Riddle  %1 = "foo"() : () -> !bar<baz>
8333b2c5600SRiver Riddle
834ab9cdf09SRiver Riddle  return %0 : !bar<>
8353b2c5600SRiver Riddle}
836aaa1d77eSChris Lattner
8378eccc429SRiver Riddle// CHECK-LABEL: func @type_alias() -> i32 {
838a6cef03fSRiver Riddle!i32_type_alias = i32
8396a99d290SRiver Riddlefunc.func @type_alias() -> !i32_type_alias {
8408eccc429SRiver Riddle
8418eccc429SRiver Riddle  // Return a non-aliased i32 type.
8428eccc429SRiver Riddle  %0 = "foo"() : () -> i32
8438eccc429SRiver Riddle  return %0 : i32
8448eccc429SRiver Riddle}
845c3424c3cSRiver Riddle
84638f8dc67SRiver Riddle// CHECK-LABEL: func @no_integer_set_constraints(
8476a99d290SRiver Riddlefunc.func @no_integer_set_constraints() {
84895371ce9SMehdi Amini  // CHECK: affine.if [[$SET_TRUE]]() {
8494268e4f4SRiver Riddle  affine.if affine_set<() : ()> () {
85038f8dc67SRiver Riddle  }
85138f8dc67SRiver Riddle  return
85238f8dc67SRiver Riddle}
85338f8dc67SRiver Riddle
854c3424c3cSRiver Riddle// CHECK-LABEL: func @verbose_if(
8556a99d290SRiver Riddlefunc.func @verbose_if(%N: index) {
856a54f4eaeSMogball  %c = arith.constant 200 : index
857c3424c3cSRiver Riddle
85889bc449cSRiver Riddle  // CHECK: affine.if #set{{.*}}(%{{.*}})[%{{.*}}, %{{.*}}] {
859d3380a50SAlex Zinenko  "affine.if"(%c, %N, %c) ({
860c3424c3cSRiver Riddle    // CHECK-NEXT: "add"
861c3424c3cSRiver Riddle    %y = "add"(%c, %N) : (index, index) -> index
8622ede8918SJeremy Bruestle    "affine.yield"() : () -> ()
86375553832SRiver Riddle    // CHECK-NEXT: } else {
864d3380a50SAlex Zinenko  }, { // The else region.
865c3424c3cSRiver Riddle    // CHECK-NEXT: "add"
866c3424c3cSRiver Riddle    %z = "add"(%c, %c) : (index, index) -> index
8672ede8918SJeremy Bruestle    "affine.yield"() : () -> ()
868d3380a50SAlex Zinenko  })
869679a3b41SRiver Riddle  { condition = #set0 } : (index, index, index) -> ()
870d3380a50SAlex Zinenko  return
871c3424c3cSRiver Riddle}
872d3380a50SAlex Zinenko
873d3380a50SAlex Zinenko// CHECK-LABEL: func @terminator_with_regions
8746a99d290SRiver Riddlefunc.func @terminator_with_regions() {
875d3380a50SAlex Zinenko  // Combine successors and regions in the same operation.
876d3380a50SAlex Zinenko  // CHECK: "region"()[^bb1] ({
877d3380a50SAlex Zinenko  // CHECK: }) : () -> ()
878d3380a50SAlex Zinenko  "region"()[^bb2] ({}) : () -> ()
879d3380a50SAlex Zinenko^bb2:
880c3424c3cSRiver Riddle  return
881c3424c3cSRiver Riddle}
882366ebcf6SRiver Riddle
883366ebcf6SRiver Riddle// CHECK-LABEL: func @unregistered_term
8846a99d290SRiver Riddlefunc.func @unregistered_term(%arg0 : i1) -> i1 {
885cb177712SRiver Riddle  // CHECK-NEXT: "unregistered_br"(%{{.*}})[^bb1] : (i1) -> ()
886cb177712SRiver Riddle  "unregistered_br"(%arg0)[^bb1] : (i1) -> ()
887366ebcf6SRiver Riddle
888366ebcf6SRiver Riddle^bb1(%arg1 : i1):
889366ebcf6SRiver Riddle  return %arg1 : i1
890366ebcf6SRiver Riddle}
8912d4b0e2cSRiver Riddle
892a495f960SRiver Riddle// CHECK-LABEL: func @dialect_attrs
8936a99d290SRiver Riddlefunc.func @dialect_attrs()
894b5af3784SAlex Zinenko    // CHECK: attributes  {dialect.attr = 10
895679a3b41SRiver Riddle    attributes {dialect.attr = 10} {
8962d4b0e2cSRiver Riddle  return
8972d4b0e2cSRiver Riddle}
89803913698SRiver Riddle
899b7382ed3SRahul Joshi// CHECK-LABEL: func private @_valid.function$name
9006a99d290SRiver Riddlefunc.func private @_valid.function$name()
901db1757f8SRiver Riddle
902b7382ed3SRahul Joshi// CHECK-LABEL: func private @external_func_arg_attrs(i32, i1 {dialect.attr = 10 : i64}, i32)
9036a99d290SRiver Riddlefunc.func private @external_func_arg_attrs(i32, i1 {dialect.attr = 10 : i64}, i32)
904db1757f8SRiver Riddle
90589bc449cSRiver Riddle// CHECK-LABEL: func @func_arg_attrs(%{{.*}}: i1 {dialect.attr = 10 : i64})
9066a99d290SRiver Riddlefunc.func @func_arg_attrs(%arg0: i1 {dialect.attr = 10 : i64}) {
907db1757f8SRiver Riddle  return
908db1757f8SRiver Riddle}
90930e68230SRiver Riddle
9109c9a7e92SSean Silva// CHECK-LABEL: func @func_result_attrs({{.*}}) -> (f32 {dialect.attr = 1 : i64})
9116a99d290SRiver Riddlefunc.func @func_result_attrs(%arg0: f32) -> (f32 {dialect.attr = 1}) {
9129c9a7e92SSean Silva  return %arg0 : f32
9139c9a7e92SSean Silva}
9149c9a7e92SSean Silva
915b7382ed3SRahul Joshi// CHECK-LABEL: func private @empty_tuple(tuple<>)
9166a99d290SRiver Riddlefunc.func private @empty_tuple(tuple<>)
91730e68230SRiver Riddle
918b7382ed3SRahul Joshi// CHECK-LABEL: func private @tuple_single_element(tuple<i32>)
9196a99d290SRiver Riddlefunc.func private @tuple_single_element(tuple<i32>)
92030e68230SRiver Riddle
921b7382ed3SRahul Joshi// CHECK-LABEL: func private @tuple_multi_element(tuple<i32, i16, f32>)
9226a99d290SRiver Riddlefunc.func private @tuple_multi_element(tuple<i32, i16, f32>)
92330e68230SRiver Riddle
924b7382ed3SRahul Joshi// CHECK-LABEL: func private @tuple_nested(tuple<tuple<tuple<i32>>>)
9256a99d290SRiver Riddlefunc.func private @tuple_nested(tuple<tuple<tuple<i32>>>)
92601140bd1SRiver Riddle
92701140bd1SRiver Riddle// CHECK-LABEL: func @pretty_form_multi_result
9286a99d290SRiver Riddlefunc.func @pretty_form_multi_result() -> (i16, i16) {
92989bc449cSRiver Riddle  // CHECK: %{{.*}}:2 = "foo_div"() : () -> (i16, i16)
93001140bd1SRiver Riddle  %quot, %rem = "foo_div"() : () -> (i16, i16)
93101140bd1SRiver Riddle  return %quot, %rem : i16, i16
93201140bd1SRiver Riddle}
9333f93d933SChris Lattner
934b69e8ee0SRiver Riddle// CHECK-LABEL: func @pretty_form_multi_result_groups
9356a99d290SRiver Riddlefunc.func @pretty_form_multi_result_groups() -> (i16, i16, i16, i16, i16) {
936b69e8ee0SRiver Riddle  // CHECK: %[[RES:.*]]:5 =
937b69e8ee0SRiver Riddle  // CHECK: return %[[RES]]#0, %[[RES]]#1, %[[RES]]#2, %[[RES]]#3, %[[RES]]#4
938b69e8ee0SRiver Riddle  %group_1:2, %group_2, %group_3:2 = "foo_test"() : () -> (i16, i16, i16, i16, i16)
939b69e8ee0SRiver Riddle  return %group_1#0, %group_1#1, %group_2, %group_3#0, %group_3#1 : i16, i16, i16, i16, i16
940b69e8ee0SRiver Riddle}
941b69e8ee0SRiver Riddle
9428d5bd823SRiver Riddle// CHECK-LABEL: func @pretty_dialect_attribute()
9436a99d290SRiver Riddlefunc.func @pretty_dialect_attribute() {
944057dc41bSLei Zhang  // CHECK: "foo.unknown_op"() {foo = #foo.simple_attr} : () -> ()
945057dc41bSLei Zhang  "foo.unknown_op"() {foo = #foo.simple_attr} : () -> ()
9468d5bd823SRiver Riddle
947679a3b41SRiver Riddle  // CHECK: "foo.unknown_op"() {foo = #foo.complexattr<abcd>} : () -> ()
948679a3b41SRiver Riddle  "foo.unknown_op"() {foo = #foo.complexattr<abcd>} : () -> ()
9498d5bd823SRiver Riddle
950679a3b41SRiver Riddle  // CHECK: "foo.unknown_op"() {foo = #foo.complexattr<abcd<f32>>} : () -> ()
951679a3b41SRiver Riddle  "foo.unknown_op"() {foo = #foo.complexattr<abcd<f32>>} : () -> ()
9528d5bd823SRiver Riddle
953679a3b41SRiver Riddle  // CHECK: "foo.unknown_op"() {foo = #foo.complexattr<abcd<[f]$$[32]>>} : () -> ()
954679a3b41SRiver Riddle  "foo.unknown_op"() {foo = #foo.complexattr<abcd<[f]$$[32]>>} : () -> ()
9558d5bd823SRiver Riddle
956679a3b41SRiver Riddle  // CHECK: "foo.unknown_op"() {foo = #foo.dialect<!x@#!@#>} : () -> ()
957679a3b41SRiver Riddle  "foo.unknown_op"() {foo = #foo.dialect<!x@#!@#>} : () -> ()
9588d5bd823SRiver Riddle
9598d5bd823SRiver Riddle  return
9608d5bd823SRiver Riddle}
9618d5bd823SRiver Riddle
9623f93d933SChris Lattner// CHECK-LABEL: func @pretty_dialect_type()
9636a99d290SRiver Riddlefunc.func @pretty_dialect_type() {
9643f93d933SChris Lattner
96589bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.simpletype
9663f93d933SChris Lattner  %0 = "foo.unknown_op"() : () -> !foo.simpletype
9673f93d933SChris Lattner
96889bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.complextype<abcd>
9693f93d933SChris Lattner  %1 = "foo.unknown_op"() : () -> !foo.complextype<abcd>
9703f93d933SChris Lattner
97189bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.complextype<abcd<f32>>
9723f93d933SChris Lattner  %2 = "foo.unknown_op"() : () -> !foo.complextype<abcd<f32>>
97309c053bfSChris Lattner
97489bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.complextype<abcd<[f]$$[32]>>
97509c053bfSChris Lattner  %3 = "foo.unknown_op"() : () -> !foo.complextype<abcd<[f]$$[32]>>
97609c053bfSChris Lattner
97789bc449cSRiver Riddle  // CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.dialect<!x@#!@#>
97809c053bfSChris Lattner  %4 = "foo.unknown_op"() : () -> !foo.dialect<!x@#!@#>
97909c053bfSChris Lattner
9803f93d933SChris Lattner  return
9813f93d933SChris Lattner}
9821316db3bSRiver Riddle
9831316db3bSRiver Riddle// CHECK-LABEL: func @none_type
9846a99d290SRiver Riddlefunc.func @none_type() {
9851316db3bSRiver Riddle  // CHECK: "foo.unknown_op"() : () -> none
9861316db3bSRiver Riddle  %none_val = "foo.unknown_op"() : () -> none
9871316db3bSRiver Riddle  return
9881316db3bSRiver Riddle}
989c263ae91SRiver Riddle
990c263ae91SRiver Riddle// CHECK-LABEL: func @scoped_names
9916a99d290SRiver Riddlefunc.func @scoped_names() {
992c263ae91SRiver Riddle  // CHECK-NEXT: "foo.region_op"
993c263ae91SRiver Riddle  "foo.region_op"() ({
994c263ae91SRiver Riddle    // CHECK-NEXT: "foo.unknown_op"
995c263ae91SRiver Riddle    %scoped_name = "foo.unknown_op"() : () -> none
996c263ae91SRiver Riddle    "foo.terminator"() : () -> ()
997c263ae91SRiver Riddle  }, {
998c263ae91SRiver Riddle    // CHECK: "foo.unknown_op"
999c263ae91SRiver Riddle    %scoped_name = "foo.unknown_op"() : () -> none
1000c263ae91SRiver Riddle    "foo.terminator"() : () -> ()
1001c263ae91SRiver Riddle  }) : () -> ()
1002c263ae91SRiver Riddle  return
1003c263ae91SRiver Riddle}
100436b7c2daSRiver Riddle
1005d097cc61SRiver Riddle// CHECK-LABEL: func @dialect_attribute_with_type
10066a99d290SRiver Riddlefunc.func @dialect_attribute_with_type() {
1007d097cc61SRiver Riddle  // CHECK-NEXT: foo = #foo.attr : i32
1008d097cc61SRiver Riddle  "foo.unknown_op"() {foo = #foo.attr : i32} : () -> ()
1009d097cc61SRiver Riddle}
10103b207d36SAlex Zinenko
10113b207d36SAlex Zinenko// CHECK-LABEL: @f16_special_values
10126a99d290SRiver Riddlefunc.func @f16_special_values() {
10133b207d36SAlex Zinenko  // F16 NaNs.
1014a54f4eaeSMogball  // CHECK: arith.constant 0x7C01 : f16
1015a54f4eaeSMogball  %0 = arith.constant 0x7C01 : f16
1016a54f4eaeSMogball  // CHECK: arith.constant 0x7FFF : f16
1017a54f4eaeSMogball  %1 = arith.constant 0x7FFF : f16
1018a54f4eaeSMogball  // CHECK: arith.constant 0xFFFF : f16
1019a54f4eaeSMogball  %2 = arith.constant 0xFFFF : f16
10203b207d36SAlex Zinenko
10213b207d36SAlex Zinenko  // F16 positive infinity.
1022a54f4eaeSMogball  // CHECK: arith.constant 0x7C00 : f16
1023a54f4eaeSMogball  %3 = arith.constant 0x7C00 : f16
1024f28c5acaSKazuaki Ishizaki  // F16 negative infinity.
1025a54f4eaeSMogball  // CHECK: arith.constant 0xFC00 : f16
1026a54f4eaeSMogball  %4 = arith.constant 0xFC00 : f16
10273b207d36SAlex Zinenko
10283b207d36SAlex Zinenko  return
10293b207d36SAlex Zinenko}
10303b207d36SAlex Zinenko
10313b207d36SAlex Zinenko// CHECK-LABEL: @f32_special_values
10326a99d290SRiver Riddlefunc.func @f32_special_values() {
10333b207d36SAlex Zinenko  // F32 signaling NaNs.
1034a54f4eaeSMogball  // CHECK: arith.constant 0x7F800001 : f32
1035a54f4eaeSMogball  %0 = arith.constant 0x7F800001 : f32
1036a54f4eaeSMogball  // CHECK: arith.constant 0x7FBFFFFF : f32
1037a54f4eaeSMogball  %1 = arith.constant 0x7FBFFFFF : f32
10383b207d36SAlex Zinenko
10393b207d36SAlex Zinenko  // F32 quiet NaNs.
1040a54f4eaeSMogball  // CHECK: arith.constant 0x7FC00000 : f32
1041a54f4eaeSMogball  %2 = arith.constant 0x7FC00000 : f32
1042a54f4eaeSMogball  // CHECK: arith.constant 0xFFFFFFFF : f32
1043a54f4eaeSMogball  %3 = arith.constant 0xFFFFFFFF : f32
10443b207d36SAlex Zinenko
10453b207d36SAlex Zinenko  // F32 positive infinity.
1046a54f4eaeSMogball  // CHECK: arith.constant 0x7F800000 : f32
1047a54f4eaeSMogball  %4 = arith.constant 0x7F800000 : f32
10483b207d36SAlex Zinenko  // F32 negative infinity.
1049a54f4eaeSMogball  // CHECK: arith.constant 0xFF800000 : f32
1050a54f4eaeSMogball  %5 = arith.constant 0xFF800000 : f32
10513b207d36SAlex Zinenko
10523b207d36SAlex Zinenko  return
10533b207d36SAlex Zinenko}
10543b207d36SAlex Zinenko
10553b207d36SAlex Zinenko// CHECK-LABEL: @f64_special_values
10566a99d290SRiver Riddlefunc.func @f64_special_values() {
10573b207d36SAlex Zinenko  // F64 signaling NaNs.
1058a54f4eaeSMogball  // CHECK: arith.constant 0x7FF0000000000001 : f64
1059a54f4eaeSMogball  %0 = arith.constant 0x7FF0000000000001 : f64
1060a54f4eaeSMogball  // CHECK: arith.constant 0x7FF8000000000000 : f64
1061a54f4eaeSMogball  %1 = arith.constant 0x7FF8000000000000 : f64
10623b207d36SAlex Zinenko
10633b207d36SAlex Zinenko  // F64 quiet NaNs.
1064a54f4eaeSMogball  // CHECK: arith.constant 0x7FF0000001000000 : f64
1065a54f4eaeSMogball  %2 = arith.constant 0x7FF0000001000000 : f64
1066a54f4eaeSMogball  // CHECK: arith.constant 0xFFF0000001000000 : f64
1067a54f4eaeSMogball  %3 = arith.constant 0xFFF0000001000000 : f64
10683b207d36SAlex Zinenko
1069f28c5acaSKazuaki Ishizaki  // F64 positive infinity.
1070a54f4eaeSMogball  // CHECK: arith.constant 0x7FF0000000000000 : f64
1071a54f4eaeSMogball  %4 = arith.constant 0x7FF0000000000000 : f64
10723b207d36SAlex Zinenko  // F64 negative infinity.
1073a54f4eaeSMogball  // CHECK: arith.constant 0xFFF0000000000000 : f64
1074a54f4eaeSMogball  %5 = arith.constant 0xFFF0000000000000 : f64
10753b207d36SAlex Zinenko
107658c18ca1SRiver Riddle  // Check that values that can't be represented with the default format, use
107758c18ca1SRiver Riddle  // hex instead.
1078a54f4eaeSMogball  // CHECK: arith.constant 0xC1CDC00000000000 : f64
1079a54f4eaeSMogball  %6 = arith.constant 0xC1CDC00000000000 : f64
108058c18ca1SRiver Riddle
10813b207d36SAlex Zinenko  return
10823b207d36SAlex Zinenko}
10833b207d36SAlex Zinenko
10841bd14ce3SRiver Riddle// CHECK-LABEL: @bfloat16_special_values
10856a99d290SRiver Riddlefunc.func @bfloat16_special_values() {
10861bd14ce3SRiver Riddle  // bfloat16 signaling NaNs.
1087a54f4eaeSMogball  // CHECK: arith.constant 0x7F81 : bf16
1088a54f4eaeSMogball  %0 = arith.constant 0x7F81 : bf16
1089a54f4eaeSMogball  // CHECK: arith.constant 0xFF81 : bf16
1090a54f4eaeSMogball  %1 = arith.constant 0xFF81 : bf16
10911bd14ce3SRiver Riddle
10921bd14ce3SRiver Riddle  // bfloat16 quiet NaNs.
1093a54f4eaeSMogball  // CHECK: arith.constant 0x7FC0 : bf16
1094a54f4eaeSMogball  %2 = arith.constant 0x7FC0 : bf16
1095a54f4eaeSMogball  // CHECK: arith.constant 0xFFC0 : bf16
1096a54f4eaeSMogball  %3 = arith.constant 0xFFC0 : bf16
10971bd14ce3SRiver Riddle
10981bd14ce3SRiver Riddle  // bfloat16 positive infinity.
1099a54f4eaeSMogball  // CHECK: arith.constant 0x7F80 : bf16
1100a54f4eaeSMogball  %4 = arith.constant 0x7F80 : bf16
11011bd14ce3SRiver Riddle  // bfloat16 negative infinity.
1102a54f4eaeSMogball  // CHECK: arith.constant 0xFF80 : bf16
1103a54f4eaeSMogball  %5 = arith.constant 0xFF80 : bf16
11041bd14ce3SRiver Riddle
11051bd14ce3SRiver Riddle  return
11061bd14ce3SRiver Riddle}
11071bd14ce3SRiver Riddle
11081e3c630fSorbiri// CHECK-LABEL: @f80_special_values
11091e3c630fSorbirifunc.func @f80_special_values() {
11101e3c630fSorbiri  // F80 signaling NaNs.
11111e3c630fSorbiri  // CHECK: arith.constant 0x7FFFE000000000000001 : f80
11121e3c630fSorbiri  %0 = arith.constant 0x7FFFE000000000000001 : f80
11131e3c630fSorbiri  // CHECK: arith.constant 0x7FFFB000000000000011 : f80
11141e3c630fSorbiri  %1 = arith.constant 0x7FFFB000000000000011 : f80
11151e3c630fSorbiri
11161e3c630fSorbiri  // F80 quiet NaNs.
11171e3c630fSorbiri  // CHECK: arith.constant 0x7FFFC000000000100000 : f80
11181e3c630fSorbiri  %2 = arith.constant 0x7FFFC000000000100000 : f80
11191e3c630fSorbiri  // CHECK: arith.constant 0x7FFFE000000001000000 : f80
11201e3c630fSorbiri  %3 = arith.constant 0x7FFFE000000001000000 : f80
11211e3c630fSorbiri
11221e3c630fSorbiri  // F80 positive infinity.
11231e3c630fSorbiri  // CHECK: arith.constant 0x7FFF8000000000000000 : f80
11241e3c630fSorbiri  %4 = arith.constant 0x7FFF8000000000000000 : f80
11251e3c630fSorbiri  // F80 negative infinity.
11261e3c630fSorbiri  // CHECK: arith.constant 0xFFFF8000000000000000 : f80
11271e3c630fSorbiri  %5 = arith.constant 0xFFFF8000000000000000 : f80
11281e3c630fSorbiri
11291e3c630fSorbiri  return
11301e3c630fSorbiri}
11311e3c630fSorbiri
11323b207d36SAlex Zinenko// We want to print floats in exponential notation with 6 significant digits,
11333b207d36SAlex Zinenko// but it may lead to precision loss when parsing back, in which case we print
11343b207d36SAlex Zinenko// the decimal form instead.
11353b207d36SAlex Zinenko// CHECK-LABEL: @f32_potential_precision_loss()
11366a99d290SRiver Riddlefunc.func @f32_potential_precision_loss() {
1137a54f4eaeSMogball  // CHECK: arith.constant -1.23697901 : f32
1138a54f4eaeSMogball  %0 = arith.constant -1.23697901 : f32
11393b207d36SAlex Zinenko  return
11403b207d36SAlex Zinenko}
1141206be96eSAlex Zinenko
1142206be96eSAlex Zinenko// CHECK-LABEL: @special_float_values_in_tensors
11436a99d290SRiver Riddlefunc.func @special_float_values_in_tensors() {
1144206be96eSAlex Zinenko  // CHECK: dense<0xFFFFFFFF> : tensor<4x4xf32>
1145206be96eSAlex Zinenko  "foo"(){bar = dense<0xFFFFFFFF> : tensor<4x4xf32>} : () -> ()
1146206be96eSAlex Zinenko  // CHECK: dense<[{{\[}}0xFFFFFFFF, 0x7F800000], [0x7FBFFFFF, 0x7F800001]]> : tensor<2x2xf32>
1147206be96eSAlex Zinenko  "foo"(){bar = dense<[[0xFFFFFFFF, 0x7F800000], [0x7FBFFFFF, 0x7F800001]]> : tensor<2x2xf32>} : () -> ()
1148206be96eSAlex Zinenko  // CHECK: dense<[0xFFFFFFFF, 0.000000e+00]> : tensor<2xf32>
1149206be96eSAlex Zinenko  "foo"(){bar = dense<[0xFFFFFFFF, 0.0]> : tensor<2xf32>} : () -> ()
1150206be96eSAlex Zinenko
1151206be96eSAlex Zinenko  // CHECK: sparse<[{{\[}}1, 1, 0], [0, 1, 1]], [0xFFFFFFFF, 0x7F800001]>
1152206be96eSAlex Zinenko  "foo"(){bar = sparse<[[1,1,0],[0,1,1]], [0xFFFFFFFF, 0x7F800001]> : tensor<2x2x2xf32>} : () -> ()
1153206be96eSAlex Zinenko}
1154305516fcSRiver Riddle
1155305516fcSRiver Riddle// Test parsing of an op with multiple region arguments, and without a
1156305516fcSRiver Riddle// delimiter.
1157305516fcSRiver Riddle
1158b89b3cdbSRahul Kayaith// GENERIC-LABEL: op_with_region_args
11596a99d290SRiver Riddlefunc.func @op_with_region_args() {
1160b89b3cdbSRahul Kayaith  // GENERIC: "test.polyfor"() ({
1161b89b3cdbSRahul Kayaith  // GENERIC-NEXT: ^bb{{.*}}(%{{.*}}: index, %{{.*}}: index, %{{.*}}: index):
1162305516fcSRiver Riddle  test.polyfor %i, %j, %k {
1163305516fcSRiver Riddle    "foo"() : () -> ()
1164305516fcSRiver Riddle  }
1165305516fcSRiver Riddle  return
1166305516fcSRiver Riddle}
1167305516fcSRiver Riddle
1168305516fcSRiver Riddle// Test allowing different name scopes for regions isolated from above.
1169305516fcSRiver Riddle
1170305516fcSRiver Riddle// CHECK-LABEL: func @op_with_passthrough_region_args
11716a99d290SRiver Riddlefunc.func @op_with_passthrough_region_args() {
1172a54f4eaeSMogball  // CHECK: [[VAL:%.*]] = arith.constant
1173a54f4eaeSMogball  %0 = arith.constant 10 : index
117431a003dcSChris Lattner
117531a003dcSChris Lattner  // CHECK: test.isolated_region [[VAL]] {
117631a003dcSChris Lattner  // CHECK-NEXT: "foo.consumer"([[VAL]]) : (index)
117731a003dcSChris Lattner  // CHECK-NEXT: }
1178305516fcSRiver Riddle  test.isolated_region %0 {
1179305516fcSRiver Riddle    "foo.consumer"(%0) : (index) -> ()
1180305516fcSRiver Riddle  }
118131a003dcSChris Lattner
118231a003dcSChris Lattner  // CHECK: [[VAL:%.*]]:2 = "foo.op"
118331a003dcSChris Lattner  %result:2 = "foo.op"() : () -> (index, index)
118431a003dcSChris Lattner
118531a003dcSChris Lattner  // CHECK: test.isolated_region [[VAL]]#1 {
118631a003dcSChris Lattner  // CHECK-NEXT: "foo.consumer"([[VAL]]#1) : (index)
118731a003dcSChris Lattner  // CHECK-NEXT: }
118831a003dcSChris Lattner  test.isolated_region %result#1 {
118931a003dcSChris Lattner    "foo.consumer"(%result#1) : (index) -> ()
119031a003dcSChris Lattner  }
119131a003dcSChris Lattner
1192305516fcSRiver Riddle  return
1193305516fcSRiver Riddle}
119431a003dcSChris Lattner
1195b7382ed3SRahul Joshi// CHECK-LABEL: func private @ptr_to_function() -> !unreg.ptr<() -> ()>
11966a99d290SRiver Riddlefunc.func private @ptr_to_function() -> !unreg.ptr<() -> ()>
119761ee7d64SRiver Riddle
1198b7382ed3SRahul Joshi// CHECK-LABEL: func private @escaped_string_char(i1 {foo.value = "\0A"})
11996a99d290SRiver Riddlefunc.func private @escaped_string_char(i1 {foo.value = "\n"})
1200b58d9aeeSRiver Riddle
12016bc9439fSRiver Riddle// CHECK-LABEL: func @parse_integer_literal_test
12026a99d290SRiver Riddlefunc.func @parse_integer_literal_test() {
12036bc9439fSRiver Riddle  // CHECK: test.parse_integer_literal : 5
12046bc9439fSRiver Riddle  test.parse_integer_literal : 5
12056bc9439fSRiver Riddle  return
12066bc9439fSRiver Riddle}
12076bc9439fSRiver Riddle
12086bc9439fSRiver Riddle// CHECK-LABEL: func @parse_wrapped_keyword_test
12096a99d290SRiver Riddlefunc.func @parse_wrapped_keyword_test() {
12106bc9439fSRiver Riddle  // CHECK: test.parse_wrapped_keyword foo.keyword
12116bc9439fSRiver Riddle  test.parse_wrapped_keyword foo.keyword
1212b58d9aeeSRiver Riddle  return
1213b58d9aeeSRiver Riddle}
121471c79622SRiver Riddle
1215b89b3cdbSRahul Kayaith// GENERIC-LABEL: parse_base64_test
1216bf87d5adSbzcheesemanfunc.func @parse_base64_test() {
1217b89b3cdbSRahul Kayaith  // GENERIC: "test.parse_b64"() <{b64 = "hello world"}>
1218bf87d5adSbzcheeseman  test.parse_b64 "aGVsbG8gd29ybGQ="
1219bf87d5adSbzcheeseman  return
1220bf87d5adSbzcheeseman}
1221bf87d5adSbzcheeseman
122271c79622SRiver Riddle// CHECK-LABEL: func @"\22_string_symbol_reference\22"
12236a99d290SRiver Riddlefunc.func @"\"_string_symbol_reference\""() {
122471c79622SRiver Riddle  // CHECK: ref = @"\22_string_symbol_reference\22"
122571c79622SRiver Riddle  "foo.symbol_reference"() {ref = @"\"_string_symbol_reference\""} : () -> ()
122671c79622SRiver Riddle  return
122771c79622SRiver Riddle}
12289b9c647cSRiver Riddle
1229a96911c4SMarkus Böck// CHECK-LABEL: func private @parse_opaque_attr_escape
12306a99d290SRiver Riddlefunc.func private @parse_opaque_attr_escape() {
1231ab9cdf09SRiver Riddle    // CHECK: value = #foo<"\"escaped\\\n\"">
1232a96911c4SMarkus Böck    "foo.constant"() {value = #foo<"\"escaped\\\n\"">} : () -> ()
1233a96911c4SMarkus Böck}
1234a96911c4SMarkus Böck
1235b7382ed3SRahul Joshi// CHECK-LABEL: func private @string_attr_name
1236d2f3e5f2SRiver Riddle// CHECK-SAME: {"0 . 0", nested = {"0 . 0"}}
12376a99d290SRiver Riddlefunc.func private @string_attr_name() attributes {"0 . 0", nested = {"0 . 0"}}
1238d2f3e5f2SRiver Riddle
1239b7382ed3SRahul Joshi// CHECK-LABEL: func private @nested_reference
1240b5af3784SAlex Zinenko// CHECK: ref = @some_symbol::@some_nested_symbol
12416a99d290SRiver Riddlefunc.func private @nested_reference() attributes {test.ref = @some_symbol::@some_nested_symbol }
1242eb418559SRiver Riddle
1243eb418559SRiver Riddle// CHECK-LABEL: func @custom_asm_names
12446a99d290SRiver Riddlefunc.func @custom_asm_names() -> (i32, i32, i32, i32, i32, i32) {
1245eb418559SRiver Riddle  // CHECK: %[[FIRST:first.*]], %[[MIDDLE:middle_results.*]]:2, %[[LAST:[0-9]+]]
1246eb418559SRiver Riddle  %0, %1:2, %2 = "test.asm_interface_op"() : () -> (i32, i32, i32, i32)
1247eb418559SRiver Riddle
1248eb418559SRiver Riddle  // CHECK: %[[FIRST_2:first.*]], %[[LAST_2:[0-9]+]]
1249eb418559SRiver Riddle  %3, %4 = "test.asm_interface_op"() : () -> (i32, i32)
1250eb418559SRiver Riddle
1251eb418559SRiver Riddle  // CHECK: return %[[FIRST]], %[[MIDDLE]]#0, %[[MIDDLE]]#1, %[[LAST]], %[[FIRST_2]], %[[LAST_2]]
12529006bf42SMehdi Amini  return %0, %1#0, %1#1, %2, %3, %4 : i32, i32, i32, i32, i32, i32
1253eb418559SRiver Riddle}
1254596da62dSChris Lattner
1255596da62dSChris Lattner
1256596da62dSChris Lattner// CHECK-LABEL: func @pretty_names
1257596da62dSChris Lattner
1258596da62dSChris Lattner// This tests the behavior
12596a99d290SRiver Riddlefunc.func @pretty_names() {
1260596da62dSChris Lattner  // Simple case, should parse and print as %x being an implied 'name'
1261596da62dSChris Lattner  // attribute.
1262596da62dSChris Lattner  %x = test.string_attr_pretty_name
1263596da62dSChris Lattner  // CHECK: %x = test.string_attr_pretty_name
1264596da62dSChris Lattner  // CHECK-NOT: attributes
1265596da62dSChris Lattner
1266596da62dSChris Lattner  // This specifies an explicit name, which should override the result.
1267596da62dSChris Lattner  %YY = test.string_attr_pretty_name attributes { names = ["y"] }
1268596da62dSChris Lattner  // CHECK: %y = test.string_attr_pretty_name
1269596da62dSChris Lattner  // CHECK-NOT: attributes
1270596da62dSChris Lattner
1271596da62dSChris Lattner  // Conflicts with the 'y' name, so need an explicit attribute.
1272596da62dSChris Lattner  %0 = "test.string_attr_pretty_name"() { names = ["y"]} : () -> i32
1273596da62dSChris Lattner  // CHECK: %y_0 = test.string_attr_pretty_name attributes {names = ["y"]}
1274596da62dSChris Lattner
1275596da62dSChris Lattner  // Name contains a space.
1276596da62dSChris Lattner  %1 = "test.string_attr_pretty_name"() { names = ["space name"]} : () -> i32
1277596da62dSChris Lattner  // CHECK: %space_name = test.string_attr_pretty_name attributes {names = ["space name"]}
1278596da62dSChris Lattner
1279596da62dSChris Lattner  "unknown.use"(%x, %YY, %0, %1) : (i32, i32, i32, i32) -> ()
1280596da62dSChris Lattner
1281596da62dSChris Lattner  // Multi-result support.
1282596da62dSChris Lattner
1283596da62dSChris Lattner  %a, %b, %c = test.string_attr_pretty_name
1284596da62dSChris Lattner  // CHECK: %a, %b, %c = test.string_attr_pretty_name
1285596da62dSChris Lattner  // CHECK-NOT: attributes
1286596da62dSChris Lattner
1287596da62dSChris Lattner  %q:3, %r = test.string_attr_pretty_name
1288596da62dSChris Lattner  // CHECK: %q, %q_1, %q_2, %r = test.string_attr_pretty_name attributes {names = ["q", "q", "q", "r"]}
1289596da62dSChris Lattner
1290596da62dSChris Lattner  // CHECK: return
1291596da62dSChris Lattner  return
1292596da62dSChris Lattner}
12939de4ee38SStephen Neuendorffer
1294387f9554SMehdi Amini
1295387f9554SMehdi Amini// This tests the behavior of "default dialect":
1296387f9554SMehdi Amini// operations like `test.default_dialect` can define a default dialect
1297387f9554SMehdi Amini// used in nested region.
1298387f9554SMehdi Amini// CHECK-LABEL: func @default_dialect
12996a99d290SRiver Riddlefunc.func @default_dialect(%bool : i1) {
1300387f9554SMehdi Amini  test.default_dialect {
1301387f9554SMehdi Amini    // The test dialect is the default in this region, the following two
1302387f9554SMehdi Amini    // operations are parsed identically.
1303387f9554SMehdi Amini    // CHECK-NOT: test.parse_integer_literal
1304387f9554SMehdi Amini    parse_integer_literal : 5
1305387f9554SMehdi Amini    // CHECK: parse_integer_literal : 6
1306387f9554SMehdi Amini    test.parse_integer_literal : 6
1307387f9554SMehdi Amini    // Verify that only an op prefix is stripped, not an attribute value for
1308387f9554SMehdi Amini    // example.
1309387f9554SMehdi Amini    // CHECK:  "test.op_with_attr"() {test.attr = "test.value"} : () -> ()
1310387f9554SMehdi Amini    "test.op_with_attr"() {test.attr = "test.value"} : () -> ()
1311122e6858SAlex Zinenko    // Verify that the prefix is not stripped when it can lead to ambiguity.
1312122e6858SAlex Zinenko    // CHECK: test.op.with_dot_in_name
1313122e6858SAlex Zinenko    test.op.with_dot_in_name
1314122e6858SAlex Zinenko    // This is an unregistered operation, the printing/parsing is handled by the
1315122e6858SAlex Zinenko    // dialect, and the dialect prefix should not be stripped while printing
1316122e6858SAlex Zinenko    // because of potential ambiguity.
1317122e6858SAlex Zinenko    // CHECK: test.dialect_custom_printer.with.dot
1318122e6858SAlex Zinenko    test.dialect_custom_printer.with.dot
1319387f9554SMehdi Amini    "test.terminator"() : ()->()
1320387f9554SMehdi Amini  }
132123aa5a74SRiver Riddle  // The same operation outside of the region does not have an func. prefix.
1322ace01605SRiver Riddle  // CHECK: return
132323aa5a74SRiver Riddle  func.return
1324387f9554SMehdi Amini}
1325387f9554SMehdi Amini
132662828865SStephen Neuendorffer// CHECK-LABEL: func @unreachable_dominance_violation_ok
13276a99d290SRiver Riddlefunc.func @unreachable_dominance_violation_ok() -> i1 {
1328a54f4eaeSMogball// CHECK:   [[VAL:%.*]] = arith.constant false
132962828865SStephen Neuendorffer// CHECK:   return [[VAL]] : i1
133062828865SStephen Neuendorffer// CHECK: ^bb1:   // no predecessors
133162828865SStephen Neuendorffer// CHECK:   [[VAL2:%.*]]:3 = "bar"([[VAL3:%.*]]) : (i64) -> (i1, i1, i1)
1332ace01605SRiver Riddle// CHECK:   cf.br ^bb3
133362828865SStephen Neuendorffer// CHECK: ^bb2:   // pred: ^bb2
1334ace01605SRiver Riddle// CHECK:   cf.br ^bb2
133562828865SStephen Neuendorffer// CHECK: ^bb3:   // pred: ^bb1
133662828865SStephen Neuendorffer// CHECK:   [[VAL3]] = "foo"() : () -> i64
133762828865SStephen Neuendorffer// CHECK:   return [[VAL2]]#1 : i1
133862828865SStephen Neuendorffer// CHECK: }
1339a54f4eaeSMogball  %c = arith.constant false
134062828865SStephen Neuendorffer  return %c : i1
134162828865SStephen Neuendorffer^bb1:
13429de4ee38SStephen Neuendorffer  // %1 is not dominated by it's definition, but block is not reachable.
134362828865SStephen Neuendorffer  %2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
1344ace01605SRiver Riddle  cf.br ^bb3
134562828865SStephen Neuendorffer^bb2:
1346ace01605SRiver Riddle  cf.br ^bb2
134762828865SStephen Neuendorffer^bb3:
134862828865SStephen Neuendorffer  %1 = "foo"() : ()->i64
134962828865SStephen Neuendorffer  return %2#1 : i1
135062828865SStephen Neuendorffer}
135162828865SStephen Neuendorffer
135262828865SStephen Neuendorffer// CHECK-LABEL: func @graph_region_in_hierarchy_ok
13536a99d290SRiver Riddlefunc.func @graph_region_in_hierarchy_ok() -> i64 {
1354ace01605SRiver Riddle// CHECK:   cf.br ^bb2
135562828865SStephen Neuendorffer// CHECK: ^bb1:
135662828865SStephen Neuendorffer// CHECK:   test.graph_region {
135762828865SStephen Neuendorffer// CHECK:     [[VAL2:%.*]]:3 = "bar"([[VAL3:%.*]]) : (i64) -> (i1, i1, i1)
135862828865SStephen Neuendorffer// CHECK:   }
1359ace01605SRiver Riddle// CHECK:   cf.br ^bb3
136062828865SStephen Neuendorffer// CHECK: ^bb2:   // pred: ^bb0
136162828865SStephen Neuendorffer// CHECK:   [[VAL3]] = "foo"() : () -> i64
1362ace01605SRiver Riddle// CHECK:   cf.br ^bb1
136362828865SStephen Neuendorffer// CHECK: ^bb3:   // pred: ^bb1
136462828865SStephen Neuendorffer// CHECK:   return [[VAL3]] : i64
136562828865SStephen Neuendorffer// CHECK: }
1366ace01605SRiver Riddle  cf.br ^bb2
136762828865SStephen Neuendorffer^bb1:
136862828865SStephen Neuendorffer  test.graph_region {
136962828865SStephen Neuendorffer    // %1 is well-defined here, since bb2 dominates bb1.
137062828865SStephen Neuendorffer    %2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
137162828865SStephen Neuendorffer  }
1372ace01605SRiver Riddle  cf.br ^bb4
137362828865SStephen Neuendorffer^bb2:
137462828865SStephen Neuendorffer  %1 = "foo"() : ()->i64
1375ace01605SRiver Riddle  cf.br ^bb1
137662828865SStephen Neuendorffer^bb4:
137762828865SStephen Neuendorffer  return %1 : i64
137862828865SStephen Neuendorffer}
137962828865SStephen Neuendorffer
138062828865SStephen Neuendorffer// CHECK-LABEL: func @graph_region_kind
13816a99d290SRiver Riddlefunc.func @graph_region_kind() -> () {
138262828865SStephen Neuendorffer// CHECK: [[VAL2:%.*]]:3 = "bar"([[VAL3:%.*]]) : (i64) -> (i1, i1, i1)
138362828865SStephen Neuendorffer// CHECK: [[VAL3]] = "baz"([[VAL2]]#0) : (i1) -> i64
138462828865SStephen Neuendorffer  test.graph_region {
13857557530fSFangrui Song    // %1 OK here in graph region.
138662828865SStephen Neuendorffer    %2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
138762828865SStephen Neuendorffer    %1 = "baz"(%2#0) : (i1) -> (i64)
138862828865SStephen Neuendorffer  }
138962828865SStephen Neuendorffer  return
139062828865SStephen Neuendorffer}
139162828865SStephen Neuendorffer
139262828865SStephen Neuendorffer// CHECK-LABEL: func @graph_region_inside_ssacfg_region
13936a99d290SRiver Riddlefunc.func @graph_region_inside_ssacfg_region() -> () {
139462828865SStephen Neuendorffer// CHECK: "test.ssacfg_region"
139562828865SStephen Neuendorffer// CHECK:   [[VAL3:%.*]] = "baz"() : () -> i64
139662828865SStephen Neuendorffer// CHECK:   test.graph_region {
139762828865SStephen Neuendorffer// CHECK:     [[VAL2:%.*]]:3 = "bar"([[VAL3]]) : (i64) -> (i1, i1, i1)
139862828865SStephen Neuendorffer// CHECK:   }
139962828865SStephen Neuendorffer// CHECK:   [[VAL4:.*]] = "baz"() : () -> i64
140062828865SStephen Neuendorffer  "test.ssacfg_region"() ({
140162828865SStephen Neuendorffer    %1 = "baz"() : () -> (i64)
140262828865SStephen Neuendorffer    test.graph_region {
140362828865SStephen Neuendorffer      %2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
140462828865SStephen Neuendorffer    }
140562828865SStephen Neuendorffer    %3 = "baz"() : () -> (i64)
140662828865SStephen Neuendorffer  }) : () -> ()
140762828865SStephen Neuendorffer  return
140862828865SStephen Neuendorffer}
140962828865SStephen Neuendorffer
141062828865SStephen Neuendorffer// CHECK-LABEL: func @graph_region_in_graph_region_ok
14116a99d290SRiver Riddlefunc.func @graph_region_in_graph_region_ok() -> () {
141262828865SStephen Neuendorffer// CHECK: test.graph_region {
141362828865SStephen Neuendorffer// CHECK:   test.graph_region {
141462828865SStephen Neuendorffer// CHECK:     [[VAL2:%.*]]:3 = "bar"([[VAL3:%.*]]) : (i64) -> (i1, i1, i1)
141562828865SStephen Neuendorffer// CHECK:   }
141662828865SStephen Neuendorffer// CHECK:   [[VAL3]] = "foo"() : () -> i64
141762828865SStephen Neuendorffer// CHECK: }
141862828865SStephen Neuendorffertest.graph_region {
141962828865SStephen Neuendorffer    test.graph_region {
142062828865SStephen Neuendorffer    // %1 is well-defined here since defined in graph region
142162828865SStephen Neuendorffer      %2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
142262828865SStephen Neuendorffer    }
142362828865SStephen Neuendorffer    %1 = "foo"() : ()->i64
142462828865SStephen Neuendorffer    "test.terminator"() : ()->()
142562828865SStephen Neuendorffer  }
142662828865SStephen Neuendorffer  return
142762828865SStephen Neuendorffer}
142862828865SStephen Neuendorffer
142962828865SStephen Neuendorffer// CHECK: test.graph_region {
143062828865SStephen Neuendorffertest.graph_region {
143162828865SStephen Neuendorffer// CHECK:   [[VAL1:%.*]] = "op1"([[VAL3:%.*]]) : (i32) -> i32
143262828865SStephen Neuendorffer// CHECK:   [[VAL2:%.*]] = "test.ssacfg_region"([[VAL1]], [[VAL2]], [[VAL3]], [[VAL4:%.*]]) ({
143362828865SStephen Neuendorffer// CHECK:     [[VAL5:%.*]] = "op2"([[VAL1]], [[VAL2]], [[VAL3]], [[VAL4]]) : (i32, i32, i32, i32) -> i32
143462828865SStephen Neuendorffer// CHECK:   }) : (i32, i32, i32, i32) -> i32
143562828865SStephen Neuendorffer// CHECK:   [[VAL3]] = "op2"([[VAL1]], [[VAL4]]) : (i32, i32) -> i32
143662828865SStephen Neuendorffer// CHECK:   [[VAL4]] = "op3"([[VAL1]]) : (i32) -> i32
143762828865SStephen Neuendorffer  %1 = "op1"(%3) : (i32) -> (i32)
143862828865SStephen Neuendorffer  %2 = "test.ssacfg_region"(%1, %2, %3, %4) ({
143962828865SStephen Neuendorffer    %5 = "op2"(%1, %2, %3, %4) :
144062828865SStephen Neuendorffer	 (i32, i32, i32, i32) -> (i32)
144162828865SStephen Neuendorffer  }) : (i32, i32, i32, i32) -> (i32)
144262828865SStephen Neuendorffer  %3 = "op2"(%1, %4) : (i32, i32) -> (i32)
144362828865SStephen Neuendorffer  %4 = "op3"(%1) : (i32) -> (i32)
144462828865SStephen Neuendorffer}
144562828865SStephen Neuendorffer
144662828865SStephen Neuendorffer// CHECK: "unregistered_func_might_have_graph_region"() ({
144762828865SStephen Neuendorffer// CHECK: [[VAL1:%.*]] = "foo"([[VAL1]], [[VAL2:%.*]]) : (i64, i64) -> i64
144862828865SStephen Neuendorffer// CHECK: [[VAL2]] = "bar"([[VAL1]])
144962828865SStephen Neuendorffer"unregistered_func_might_have_graph_region"() ({
145062828865SStephen Neuendorffer  %1 = "foo"(%1, %2) : (i64, i64) -> i64
145162828865SStephen Neuendorffer  %2 = "bar"(%1) : (i64) -> i64
145262828865SStephen Neuendorffer  "unregistered_terminator"() : () -> ()
14534a3460a7SRiver Riddle}) {sym_name = "unregistered_op_dominance_violation_ok", function_type = () -> i1} : () -> ()
1454a0c776fcSMehdi Amini
1455a0c776fcSMehdi Amini// This is an unregister operation, the printing/parsing is handled by the dialect.
1456a0c776fcSMehdi Amini// CHECK: test.dialect_custom_printer custom_format
1457a0c776fcSMehdi Aminitest.dialect_custom_printer custom_format
14580845635eSMogball
14590845635eSMogball// This is a registered operation with no custom parser and printer, and should
14600845635eSMogball// be handled by the dialect.
14610845635eSMogball// CHECK: test.dialect_custom_format_fallback custom_format_fallback
14620845635eSMogballtest.dialect_custom_format_fallback custom_format_fallback
1463554839ecSAlex Zinenko
1464554839ecSAlex Zinenko// Check that an op with an optional result parses f80 as type.
1465554839ecSAlex Zinenko// CHECK: test.format_optional_result_d_op : f80
1466554839ecSAlex Zinenkotest.format_optional_result_d_op : f80
1467