2019-03-03 14:34:18 +08:00
|
|
|
// RUN: mlir-opt %s | FileCheck %s
|
2018-06-23 01:39:19 +08:00
|
|
|
|
2018-10-27 00:07:10 +08:00
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0, d1, d2, d3, d4)[s0] -> (d0, d1, d2, d4, d3)
|
|
|
|
#map0 = (d0, d1, d2, d3, d4)[s0] -> (d0, d1, d2, d4, d3)
|
2018-07-18 07:56:54 +08:00
|
|
|
|
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0) -> (d0)
|
2018-07-17 00:45:22 +08:00
|
|
|
#map1 = (d0) -> (d0)
|
2018-07-18 07:56:54 +08:00
|
|
|
|
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0, d1, d2) -> (d0, d1, d2)
|
2018-07-17 00:45:22 +08:00
|
|
|
#map2 = (d0, d1, d2) -> (d0, d1, d2)
|
2018-07-18 07:56:54 +08:00
|
|
|
|
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0, d1, d2) -> (d1, d0, d2)
|
2018-07-17 00:45:22 +08:00
|
|
|
#map3 = (d0, d1, d2) -> (d1, d0, d2)
|
2018-07-18 07:56:54 +08:00
|
|
|
|
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0, d1, d2) -> (d2, d1, d0)
|
2018-07-17 00:45:22 +08:00
|
|
|
#map4 = (d0, d1, d2) -> (d2, d1, d0)
|
2018-06-23 01:39:19 +08:00
|
|
|
|
2018-08-25 14:38:14 +08:00
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = ()[s0] -> (0, s0 - 1)
|
|
|
|
#inline_map_minmax_loop1 = ()[s0] -> (0, s0 - 1)
|
|
|
|
|
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = ()[s0] -> (100, s0 + 1)
|
|
|
|
#inline_map_minmax_loop2 = ()[s0] -> (100, s0 + 1)
|
|
|
|
|
2018-10-30 21:11:29 +08:00
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0, d1)[s0] -> (d0 + d1 + s0)
|
2018-08-25 14:38:14 +08:00
|
|
|
#bound_map1 = (i, j)[s] -> (i + j + s)
|
|
|
|
|
2018-10-30 21:11:29 +08:00
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0, d1) -> (d0 + d1)
|
2018-08-25 14:38:14 +08:00
|
|
|
#inline_map_loop_bounds2 = (d0, d1) -> (d0 + d1)
|
|
|
|
|
2018-10-30 21:11:29 +08:00
|
|
|
// CHECK-DAG: #map{{[0-9]+}} = (d0)[s0] -> (d0 + s0, d0 - s0)
|
2018-08-25 14:38:14 +08:00
|
|
|
#bound_map2 = (i)[s] -> (i + s, i - s)
|
|
|
|
|
2018-10-30 21:11:29 +08:00
|
|
|
// All maps appear in arbitrary order before all sets, in arbitrary order.
|
2019-04-13 01:31:21 +08:00
|
|
|
// CHECK-NOT: Placeholder
|
2018-10-30 21:11:29 +08:00
|
|
|
|
2019-01-21 22:59:58 +08:00
|
|
|
// CHECK-DAG: #set{{[0-9]+}} = (d0)[s0, s1] : (d0 >= 0, -d0 + s0 >= 0, s0 - 5 == 0, -d0 + s1 + 1 >= 0)
|
2018-10-26 09:33:42 +08:00
|
|
|
#set0 = (i)[N, M] : (i >= 0, -i + N >= 0, N - 5 == 0, -i + M + 1 >= 0)
|
2018-08-08 05:24:38 +08:00
|
|
|
|
2018-10-26 13:13:03 +08:00
|
|
|
// CHECK-DAG: #set{{[0-9]+}} = (d0, d1)[s0] : (d0 >= 0, d1 >= 0)
|
|
|
|
#set1 = (d0, d1)[s0] : (d0 >= 0, d1 >= 0)
|
|
|
|
|
|
|
|
// CHECK-DAG: #set{{[0-9]+}} = (d0) : (d0 - 1 == 0)
|
|
|
|
#set2 = (d0) : (d0 - 1 == 0)
|
|
|
|
|
2019-02-03 13:01:11 +08:00
|
|
|
// CHECK-DAG: [[SET_TRUE:#set[0-9]+]] = () : (0 == 0)
|
|
|
|
|
2019-01-21 22:59:58 +08:00
|
|
|
// CHECK-DAG: #set{{[0-9]+}} = (d0)[s0] : (d0 - 2 >= 0, -d0 + 4 >= 0)
|
2018-08-08 05:24:38 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @foo(i32, i64) -> f32
|
|
|
|
func @foo(i32, i64) -> f32
|
2018-06-23 01:39:19 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @bar()
|
|
|
|
func @bar() -> ()
|
2018-06-23 01:39:19 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @baz() -> (i1, index, f32)
|
|
|
|
func @baz() -> (i1, index, f32)
|
2018-06-23 01:39:19 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @missingReturn()
|
|
|
|
func @missingReturn()
|
2018-06-23 06:52:02 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @int_types(i1, i2, i4, i7, i87) -> (i1, index, i19)
|
|
|
|
func @int_types(i1, i2, i4, i7, i87) -> (i1, index, i19)
|
2018-06-30 13:08:05 +08:00
|
|
|
|
2018-06-23 06:52:02 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @vectors(vector<1xf32>, vector<2x4xf32>)
|
|
|
|
func @vectors(vector<1 x f32>, vector<2x4xf32>)
|
2018-06-23 06:52:02 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @tensors(tensor<*xf32>, tensor<*xvector<2x4xf32>>, tensor<1x?x4x?x?xi32>, tensor<i8>)
|
|
|
|
func @tensors(tensor<* x f32>, tensor<* x vector<2x4xf32>>,
|
Eliminate "primitive" types from being a thing, splitting them into FloatType
and OtherType. Other type is now the thing that holds AffineInt, Control,
eventually Resource, Variant, String, etc. FloatType holds the floating point
types, and allows convenient query of isa<FloatType>().
This fixes issues where we allowed control to be the element type of tensor,
memref, vector. At the same time, ban AffineInt from being an element of a
vector/memref/tensor as well since we don't need it.
I updated the spec to match this as well.
PiperOrigin-RevId: 206361942
2018-07-28 04:09:58 +08:00
|
|
|
tensor<1x?x4x?x?xi32>, tensor<i8>)
|
2018-06-23 06:52:02 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs(memref<1x?x4x?x?xi32, #map{{[0-9]+}}>, memref<8xi8>)
|
|
|
|
func @memrefs(memref<1x?x4x?x?xi32, #map0>, memref<8xi8, #map1, #map1>)
|
2018-06-23 13:03:48 +08:00
|
|
|
|
2018-07-17 00:45:22 +08:00
|
|
|
// Test memref affine map compositions.
|
2018-06-24 07:03:42 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs2(memref<2x4x8xi8, 1>)
|
|
|
|
func @memrefs2(memref<2x4x8xi8, #map2, 1>)
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs23(memref<2x4x8xi8, #map{{[0-9]+}}>)
|
|
|
|
func @memrefs23(memref<2x4x8xi8, #map2, #map3, 0>)
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs234(memref<2x4x8xi8, #map{{[0-9]+}}, #map{{[0-9]+}}, 3>)
|
|
|
|
func @memrefs234(memref<2x4x8xi8, #map2, #map3, #map4, 3>)
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2018-10-30 21:11:29 +08:00
|
|
|
// Test memref inline affine map compositions, minding that identity maps are removed.
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs3(memref<2x4x8xi8>)
|
|
|
|
func @memrefs3(memref<2x4x8xi8, (d0, d1, d2) -> (d0, d1, d2)>)
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs33(memref<2x4x8xi8, #map{{[0-9]+}}, 1>)
|
|
|
|
func @memrefs33(memref<2x4x8xi8, (d0, d1, d2) -> (d0, d1, d2), (d0, d1, d2) -> (d1, d0, d2), 1>)
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_inline(memref<2xi8>)
|
|
|
|
func @memrefs_drop_triv_id_inline(memref<2xi8, (d0) -> (d0)>)
|
2018-10-27 00:07:10 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_inline0(memref<2xi8>)
|
|
|
|
func @memrefs_drop_triv_id_inline0(memref<2xi8, (d0) -> (d0), 0>)
|
2018-10-27 00:07:10 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_inline1(memref<2xi8, 1>)
|
|
|
|
func @memrefs_drop_triv_id_inline1(memref<2xi8, (d0) -> (d0), 1>)
|
2018-10-27 00:07:10 +08:00
|
|
|
|
2018-10-30 21:11:29 +08:00
|
|
|
// Identity maps should be dropped from the composition, but not the pair of
|
|
|
|
// "interchange" maps that, if composed, would be also an identity.
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_composition(memref<2x2xi8, #map{{[0-9]+}}, #map{{[0-9]+}}>)
|
|
|
|
func @memrefs_drop_triv_id_composition(memref<2x2xi8,
|
2018-10-30 21:11:29 +08:00
|
|
|
(d0, d1) -> (d1, d0),
|
|
|
|
(d0, d1) -> (d0, d1),
|
|
|
|
(d0, d1) -> (d1, d0),
|
|
|
|
(d0, d1) -> (d0, d1),
|
|
|
|
(d0, d1) -> (d0, d1)>)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_trailing(memref<2x2xi8, #map{{[0-9]+}}>)
|
|
|
|
func @memrefs_drop_triv_id_trailing(memref<2x2xi8, (d0, d1) -> (d1, d0),
|
2018-10-30 21:11:29 +08:00
|
|
|
(d0, d1) -> (d0, d1)>)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_middle(memref<2x2xi8, #map{{[0-9]+}}, #map{{[0-9]+}}>)
|
2019-10-18 03:23:47 +08:00
|
|
|
func @memrefs_drop_triv_id_middle(memref<2x2xi8,
|
|
|
|
(d0, d1) -> (d0, d1 + 1),
|
|
|
|
(d0, d1) -> (d0, d1),
|
|
|
|
(d0, d1) -> (d0 + 1, d1)>)
|
2018-10-30 21:11:29 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_drop_triv_id_multiple(memref<2xi8>)
|
|
|
|
func @memrefs_drop_triv_id_multiple(memref<2xi8, (d0) -> (d0), (d0) -> (d0)>)
|
2018-10-30 21:11:29 +08:00
|
|
|
|
2018-10-27 00:07:10 +08:00
|
|
|
// These maps appeared before, so they must be uniqued and hoisted to the beginning.
|
2018-10-30 21:11:29 +08:00
|
|
|
// Identity map should be removed.
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @memrefs_compose_with_id(memref<2x2xi8, #map{{[0-9]+}}>)
|
|
|
|
func @memrefs_compose_with_id(memref<2x2xi8, (d0, d1) -> (d0, d1),
|
2018-10-27 00:07:10 +08:00
|
|
|
(d0, d1) -> (d1, d0)>)
|
|
|
|
|
2019-03-30 13:23:34 +08:00
|
|
|
|
|
|
|
// CHECK: func @complex_types(complex<i1>) -> complex<f32>
|
|
|
|
func @complex_types(complex<i1>) -> complex<f32>
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK: func @functions((memref<1x?x4x?x?xi32, #map0>, memref<8xi8>) -> (), () -> ())
|
|
|
|
func @functions((memref<1x?x4x?x?xi32, #map0, 0>, memref<8xi8, #map1, 0>) -> (), ()->())
|
2018-06-24 07:03:42 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @simpleCFG(%{{.*}}: i32, %{{.*}}: f32) -> i1 {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @simpleCFG(%arg0: i32, %f: f32) -> i1 {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo"() : () -> i64
|
2018-07-19 23:35:28 +08:00
|
|
|
%1 = "foo"() : ()->i64
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: "bar"(%{{.*}}) : (i64) -> (i1, i1, i1)
|
2019-03-29 05:58:52 +08:00
|
|
|
%2:3 = "bar"(%1) : (i64) -> (i1,i1,i1)
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: return %{{.*}}#1
|
2018-07-23 23:42:19 +08:00
|
|
|
return %2#1 : i1
|
2018-07-19 06:31:25 +08:00
|
|
|
// CHECK: }
|
|
|
|
}
|
2018-06-24 07:03:42 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @simpleCFGUsingBBArgs(%{{.*}}: i32, %{{.*}}: i64) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @simpleCFGUsingBBArgs(i32, i64) {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42 (%arg0: i32, %f: i64):
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: "bar"(%{{.*}}) : (i64) -> (i1, i1, i1)
|
2019-03-29 05:58:52 +08:00
|
|
|
%2:3 = "bar"(%f) : (i64) -> (i1,i1,i1)
|
2018-08-02 23:28:20 +08:00
|
|
|
// CHECK: return{{$}}
|
2018-07-23 06:45:24 +08:00
|
|
|
return
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @multiblock() {
|
|
|
|
func @multiblock() {
|
2018-07-15 14:06:24 +08:00
|
|
|
return // CHECK: return
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb1: // CHECK: ^bb1: // no predecessors
|
|
|
|
br ^bb4 // CHECK: br ^bb3
|
|
|
|
^bb2: // CHECK: ^bb2: // pred: ^bb2
|
|
|
|
br ^bb2 // CHECK: br ^bb2
|
|
|
|
^bb4: // CHECK: ^bb3: // pred: ^bb1
|
2018-07-15 14:06:24 +08:00
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @emptyMLF() {
|
|
|
|
func @emptyMLF() {
|
2018-07-15 14:06:24 +08:00
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
2018-06-29 08:02:32 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @func_with_one_arg(%{{.*}}: i1) -> i2 {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @func_with_one_arg(%c : i1) -> i2 {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo"(%{{.*}}) : (i1) -> i2
|
2018-08-07 02:54:39 +08:00
|
|
|
%b = "foo"(%c) : (i1) -> (i2)
|
2019-07-10 01:40:29 +08:00
|
|
|
return %b : i2 // CHECK: return %{{.*}} : i2
|
2018-08-10 03:28:58 +08:00
|
|
|
} // CHECK: }
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @func_with_two_args(%{{.*}}: f16, %{{.*}}: i8) -> (i1, i32) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @func_with_two_args(%a : f16, %b : i8) -> (i1, i32) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}}:2 = "foo"(%{{.*}}, %{{.*}}) : (f16, i8) -> (i1, i32)
|
2019-03-29 05:58:52 +08:00
|
|
|
%c:2 = "foo"(%a, %b) : (f16, i8)->(i1, i32)
|
2019-07-10 01:40:29 +08:00
|
|
|
return %c#0, %c#1 : i1, i32 // CHECK: return %{{.*}}#0, %{{.*}}#1 : i1, i32
|
2018-08-10 03:28:58 +08:00
|
|
|
} // CHECK: }
|
|
|
|
|
2019-02-06 03:47:02 +08:00
|
|
|
// CHECK-LABEL: func @second_order_func() -> (() -> ()) {
|
|
|
|
func @second_order_func() -> (() -> ()) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-NEXT: %{{.*}} = constant @emptyMLF : () -> ()
|
2019-02-06 03:47:02 +08:00
|
|
|
%c = constant @emptyMLF : () -> ()
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-NEXT: return %{{.*}} : () -> ()
|
2019-02-06 03:47:02 +08:00
|
|
|
return %c : () -> ()
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @third_order_func() -> (() -> (() -> ())) {
|
|
|
|
func @third_order_func() -> (() -> (() -> ())) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-NEXT: %{{.*}} = constant @second_order_func : () -> (() -> ())
|
2019-02-06 03:47:02 +08:00
|
|
|
%c = constant @second_order_func : () -> (() -> ())
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-NEXT: return %{{.*}} : () -> (() -> ())
|
2019-02-06 03:47:02 +08:00
|
|
|
return %c : () -> (() -> ())
|
|
|
|
}
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @identity_functor(%{{.*}}: () -> ()) -> (() -> ()) {
|
2019-02-06 03:47:02 +08:00
|
|
|
func @identity_functor(%a : () -> ()) -> (() -> ()) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-NEXT: return %{{.*}} : () -> ()
|
2019-02-06 03:47:02 +08:00
|
|
|
return %a : () -> ()
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @func_ops_in_loop() {
|
|
|
|
func @func_ops_in_loop() {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo"() : () -> i64
|
2018-07-27 09:09:20 +08:00
|
|
|
%a = "foo"() : ()->i64
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 1 to 10 {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i = 1 to 10 {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "doo"() : () -> f32
|
2018-07-27 09:09:20 +08:00
|
|
|
%b = "doo"() : ()->f32
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: "bar"(%{{.*}}, %{{.*}}) : (i64, f32) -> ()
|
2018-07-27 09:09:20 +08:00
|
|
|
"bar"(%a, %b) : (i64, f32) -> ()
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
// CHECK: return
|
|
|
|
return
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @loops() {
|
|
|
|
func @loops() {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 1 to 100 step 2 {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i = 1 to 100 step 2 {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 1 to 200 {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %j = 1 to 200 {
|
2018-07-15 14:06:24 +08:00
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @complex_loops() {
|
|
|
|
func @complex_loops() {
|
2019-07-10 01:40:29 +08:00
|
|
|
affine.for %i1 = 1 to 100 { // CHECK: affine.for %{{.*}} = 1 to 100 {
|
|
|
|
affine.for %j1 = 1 to 100 { // CHECK: affine.for %{{.*}} = 1 to 100 {
|
|
|
|
// CHECK: "foo"(%{{.*}}, %{{.*}}) : (index, index) -> ()
|
2018-10-07 08:21:53 +08:00
|
|
|
"foo"(%i1, %j1) : (index,index) -> ()
|
2018-07-31 06:18:10 +08:00
|
|
|
} // CHECK: }
|
|
|
|
"boo"() : () -> () // CHECK: "boo"() : () -> ()
|
2019-07-10 01:40:29 +08:00
|
|
|
affine.for %j2 = 1 to 10 { // CHECK: affine.for %{{.*}} = 1 to 10 {
|
|
|
|
affine.for %k2 = 1 to 10 { // CHECK: affine.for %{{.*}} = 1 to 10 {
|
2018-07-31 06:18:10 +08:00
|
|
|
"goo"() : () -> () // CHECK: "goo"() : () -> ()
|
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: func @triang_loop(%{{.*}}: index, %{{.*}}: memref<?x?xi32>) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @triang_loop(%arg0: index, %arg1: memref<?x?xi32>) {
|
2019-07-10 01:40:29 +08:00
|
|
|
%c = constant 0 : i32 // CHECK: %{{.*}} = constant 0 : i32
|
|
|
|
affine.for %i0 = 1 to %arg0 { // CHECK: affine.for %{{.*}} = 1 to %{{.*}} {
|
|
|
|
affine.for %i1 = (d0)[]->(d0)(%i0)[] to %arg0 { // CHECK: affine.for %{{.*}} = #map{{[0-9]+}}(%{{.*}}) to %{{.*}} {
|
|
|
|
store %c, %arg1[%i0, %i1] : memref<?x?xi32> // CHECK: store %{{.*}}, %{{.*}}[%{{.*}}, %{{.*}}]
|
2018-08-25 14:38:14 +08:00
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: func @minmax_loop(%{{.*}}: index, %{{.*}}: index, %{{.*}}: memref<100xf32>) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @minmax_loop(%arg0: index, %arg1: index, %arg2: memref<100xf32>) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = max #map{{.*}}()[%{{.*}}] to min #map{{.*}}()[%{{.*}}] {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i0 = max()[s]->(0,s-1)()[%arg0] to min()[s]->(100,s+1)()[%arg1] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: "foo"(%{{.*}}, %{{.*}}) : (memref<100xf32>, index) -> ()
|
2018-10-07 08:21:53 +08:00
|
|
|
"foo"(%arg2, %i0) : (memref<100xf32>, index) -> ()
|
2018-08-25 14:38:14 +08:00
|
|
|
} // CHECK: }
|
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @loop_bounds(%{{.*}}: index) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @loop_bounds(%N : index) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo"(%{{.*}}) : (index) -> index
|
2018-10-07 08:21:53 +08:00
|
|
|
%s = "foo"(%N) : (index) -> index
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = %{{.*}} to %{{.*}}
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i = %s to %N {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = #map{{[0-9]+}}(%{{.*}}) to 0
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %j = (d0)[]->(d0)(%i)[] to 0 step 1 {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}]
|
2019-02-07 03:08:18 +08:00
|
|
|
%w1 = affine.apply(d0, d1)[s0] -> (d0+d1) (%i, %j) [%s]
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}]
|
2019-02-07 03:08:18 +08:00
|
|
|
%w2 = affine.apply(d0, d1)[s0] -> (s0+1) (%i, %j) [%s]
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}] to #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}] {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %k = #bound_map1 (%w1, %i)[%N] to (i, j)[s] -> (i + j + s) (%w2, %j)[%s] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: "foo"(%{{.*}}, %{{.*}}, %{{.*}}) : (index, index, index) -> ()
|
2018-10-07 08:21:53 +08:00
|
|
|
"foo"(%i, %j, %k) : (index, index, index)->()
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 30 : index
|
2018-10-07 08:21:53 +08:00
|
|
|
%c = constant 30 : index
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})
|
2019-02-07 03:08:18 +08:00
|
|
|
%u = affine.apply (d0, d1)->(d0+d1) (%N, %c)
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = max #map{{.*}}(%{{.*}})[%{{.*}}] to min #map{{.*}}(%{{.*}})[%{{.*}}] {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %l = max #bound_map2(%i)[%u] to min #bound_map2(%k)[%c] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: "bar"(%{{.*}}) : (index) -> ()
|
2018-10-07 08:21:53 +08:00
|
|
|
"bar"(%l) : (index) -> ()
|
2018-08-25 14:38:14 +08:00
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
} // CHECK: }
|
|
|
|
return // CHECK: return
|
|
|
|
} // CHECK: }
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @ifinst(%{{.*}}: index) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @ifinst(%N: index) {
|
2019-07-10 01:40:29 +08:00
|
|
|
%c = constant 200 : index // CHECK %{{.*}} = constant 200
|
|
|
|
affine.for %i = 1 to 10 { // CHECK affine.for %{{.*}} = 1 to 10 {
|
|
|
|
affine.if #set0(%i)[%N, %c] { // CHECK affine.if #set0(%{{.*}})[%{{.*}}, %{{.*}}] {
|
2018-08-08 05:24:38 +08:00
|
|
|
%x = constant 1 : i32
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 1 : i32
|
|
|
|
%y = "add"(%x, %i) : (i32, index) -> i32 // CHECK: %{{.*}} = "add"(%{{.*}}, %{{.*}}) : (i32, index) -> i32
|
|
|
|
%z = "mul"(%y, %y) : (i32, i32) -> i32 // CHECK: %{{.*}} = "mul"(%{{.*}}, %{{.*}}) : (i32, i32) -> i32
|
2019-01-29 13:23:53 +08:00
|
|
|
} else { // CHECK } else {
|
2019-07-10 01:40:29 +08:00
|
|
|
affine.if (i)[N] : (i - 2 >= 0, 4 - i >= 0)(%i)[%N] { // CHECK affine.if (#set1(%{{.*}})[%{{.*}}]) {
|
|
|
|
// CHECK: %{{.*}} = constant 1 : index
|
2019-01-29 13:23:53 +08:00
|
|
|
%u = constant 1 : index
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = affine.apply #map{{.*}}(%{{.*}}, %{{.*}})[%{{.*}}]
|
2019-02-07 03:08:18 +08:00
|
|
|
%w = affine.apply (d0,d1)[s0] -> (d0+d1+s0) (%i, %i) [%u]
|
2019-01-29 13:23:53 +08:00
|
|
|
} else { // CHECK } else {
|
|
|
|
%v = constant 3 : i32 // %c3_i32 = constant 3 : i32
|
|
|
|
}
|
2018-08-08 05:24:38 +08:00
|
|
|
} // CHECK }
|
|
|
|
} // CHECK }
|
|
|
|
return // CHECK return
|
|
|
|
} // CHECK }
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @simple_ifinst(%{{.*}}: index) {
|
2019-01-03 02:20:00 +08:00
|
|
|
func @simple_ifinst(%N: index) {
|
2019-07-10 01:40:29 +08:00
|
|
|
%c = constant 200 : index // CHECK %{{.*}} = constant 200
|
|
|
|
affine.for %i = 1 to 10 { // CHECK affine.for %{{.*}} = 1 to 10 {
|
|
|
|
affine.if #set0(%i)[%N, %c] { // CHECK affine.if #set0(%{{.*}})[%{{.*}}, %{{.*}}] {
|
2018-09-01 13:33:47 +08:00
|
|
|
%x = constant 1 : i32
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 1 : i32
|
|
|
|
%y = "add"(%x, %i) : (i32, index) -> i32 // CHECK: %{{.*}} = "add"(%{{.*}}, %{{.*}}) : (i32, index) -> i32
|
|
|
|
%z = "mul"(%y, %y) : (i32, i32) -> i32 // CHECK: %{{.*}} = "mul"(%{{.*}}, %{{.*}}) : (i32, i32) -> i32
|
2018-09-01 13:33:47 +08:00
|
|
|
} // CHECK }
|
|
|
|
} // CHECK }
|
|
|
|
return // CHECK return
|
|
|
|
} // CHECK }
|
2018-07-15 14:06:24 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @attributes() {
|
|
|
|
func @attributes() {
|
2018-07-15 14:06:24 +08:00
|
|
|
// CHECK: "foo"()
|
2018-07-19 06:31:25 +08:00
|
|
|
"foo"(){} : ()->()
|
2018-07-05 11:45:39 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {a = 1 : i64, b = -423 : i64, c = [true, false], d = 1.600000e+01 : f64} : () -> ()
|
|
|
|
"foo"() {a = 1, b = -423, c = [true, false], d = 16.0 } : () -> ()
|
2018-07-05 11:45:39 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {map1 = #map{{[0-9]+}}}
|
|
|
|
"foo"() {map1 = #map1} : () -> ()
|
2018-07-19 07:29:21 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {map2 = #map{{[0-9]+}}}
|
|
|
|
"foo"() {map2 = (d0, d1, d2) -> (d0, d1, d2)} : () -> ()
|
2018-07-19 07:29:21 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {map12 = [#map{{[0-9]+}}, #map{{[0-9]+}}]}
|
|
|
|
"foo"() {map12 = [#map1, #map2]} : () -> ()
|
2018-07-19 07:29:21 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {set1 = #set{{[0-9]+}}}
|
|
|
|
"foo"() {set1 = #set1} : () -> ()
|
2018-10-26 13:13:03 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {set2 = #set{{[0-9]+}}}
|
|
|
|
"foo"() {set2 = (d0, d1, d2) : (d0 >= 0, d1 >= 0, d2 - d1 == 0)} : () -> ()
|
2018-10-26 13:13:03 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {set12 = [#set{{[0-9]+}}, #set{{[0-9]+}}]}
|
|
|
|
"foo"() {set12 = [#set1, #set2]} : () -> ()
|
2018-10-26 13:13:03 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {dictionary = {bool = true, fn = @ifinst}}
|
|
|
|
"foo"() {dictionary = {bool = true, fn = @ifinst}} : () -> ()
|
2019-06-01 00:24:48 +08:00
|
|
|
|
|
|
|
// Check that the dictionary attribute elements are sorted.
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {dictionary = {bar = false, bool = true, fn = @ifinst}}
|
|
|
|
"foo"() {dictionary = {fn = @ifinst, bar = false, bool = true}} : () -> ()
|
2019-06-01 00:24:48 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {d = 1.000000e-09 : f64, func = [], i123 = 7 : i64, if = "foo"} : () -> ()
|
|
|
|
"foo"() {if = "foo", func = [], i123 = 7, d = 1.e-9} : () -> ()
|
2018-07-05 11:45:39 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {fn = @attributes, if = @ifinst} : () -> ()
|
|
|
|
"foo"() {fn = @attributes, if = @ifinst} : () -> ()
|
2019-02-05 23:12:46 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {int = 0 : i42} : () -> ()
|
|
|
|
"foo"() {int = 0 : i42} : () -> ()
|
2018-07-06 00:12:11 +08:00
|
|
|
return
|
2018-07-05 11:45:39 +08:00
|
|
|
}
|
2018-07-21 09:41:34 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @ssa_values() -> (i16, i8) {
|
|
|
|
func @ssa_values() -> (i16, i8) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}}:2 = "foo"() : () -> (i1, i17)
|
2019-03-29 05:58:52 +08:00
|
|
|
%0:2 = "foo"() : () -> (i1, i17)
|
2018-12-30 03:32:37 +08:00
|
|
|
br ^bb2
|
2018-07-21 09:41:34 +08:00
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb1: // CHECK: ^bb1: // pred: ^bb2
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}}:2 = "baz"(%{{.*}}#1, %{{.*}}#0, %{{.*}}#1) : (f32, i11, i17) -> (i16, i8)
|
2019-03-29 05:58:52 +08:00
|
|
|
%1:2 = "baz"(%2#1, %2#0, %0#1) : (f32, i11, i17) -> (i16, i8)
|
2018-07-25 01:41:30 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: return %{{.*}}#0, %{{.*}}#1 : i16, i8
|
2018-07-24 02:56:17 +08:00
|
|
|
return %1#0, %1#1 : i16, i8
|
2018-07-21 09:41:34 +08:00
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb2: // CHECK: ^bb2: // pred: ^bb0
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}}:2 = "bar"(%{{.*}}#0, %{{.*}}#1) : (i1, i17) -> (i11, f32)
|
2019-03-29 05:58:52 +08:00
|
|
|
%2:2 = "bar"(%0#0, %0#1) : (i1, i17) -> (i11, f32)
|
2018-12-30 03:32:37 +08:00
|
|
|
br ^bb1
|
2018-07-23 23:42:19 +08:00
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @bbargs() -> (i16, i8) {
|
|
|
|
func @bbargs() -> (i16, i8) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}}:2 = "foo"() : () -> (i1, i17)
|
2019-03-29 05:58:52 +08:00
|
|
|
%0:2 = "foo"() : () -> (i1, i17)
|
2018-12-30 03:32:37 +08:00
|
|
|
br ^bb1(%0#1, %0#0 : i17, i1)
|
2018-07-23 23:42:19 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
^bb1(%x: i17, %y: i1): // CHECK: ^bb1(%{{.*}}: i17, %{{.*}}: i1):
|
|
|
|
// CHECK: %{{.*}}:2 = "baz"(%{{.*}}, %{{.*}}, %{{.*}}#1) : (i17, i1, i17) -> (i16, i8)
|
2019-03-29 05:58:52 +08:00
|
|
|
%1:2 = "baz"(%x, %y, %0#1) : (i17, i1, i17) -> (i16, i8)
|
2018-07-24 02:56:17 +08:00
|
|
|
return %1#0, %1#1 : i16, i8
|
2018-07-23 23:42:19 +08:00
|
|
|
}
|
2018-07-25 06:01:27 +08:00
|
|
|
|
2019-01-10 04:28:30 +08:00
|
|
|
// CHECK-LABEL: func @verbose_terminators() -> (i1, i17)
|
|
|
|
func @verbose_terminators() -> (i1, i17) {
|
2019-03-29 05:58:52 +08:00
|
|
|
%0:2 = "foo"() : () -> (i1, i17)
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: br ^bb1(%{{.*}}#0, %{{.*}}#1 : i1, i17)
|
2019-03-03 10:03:03 +08:00
|
|
|
"std.br"()[^bb1(%0#0, %0#1 : i1, i17)] : () -> ()
|
2019-01-10 04:28:30 +08:00
|
|
|
|
|
|
|
^bb1(%x : i1, %y : i17):
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: cond_br %{{.*}}, ^bb2(%{{.*}} : i17), ^bb3(%{{.*}}, %{{.*}} : i1, i17)
|
2019-03-03 10:03:03 +08:00
|
|
|
"std.cond_br"(%x)[^bb2(%y : i17), ^bb3(%x, %y : i1, i17)] : (i1) -> ()
|
2019-01-10 04:28:30 +08:00
|
|
|
|
|
|
|
^bb2(%a : i17):
|
|
|
|
%true = constant 1 : i1
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: return %{{.*}}, %{{.*}} : i1, i17
|
2019-03-03 10:03:03 +08:00
|
|
|
"std.return"(%true, %a) : (i1, i17) -> ()
|
2019-01-10 04:28:30 +08:00
|
|
|
|
|
|
|
^bb3(%b : i1, %c : i17):
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: return %{{.*}}, %{{.*}} : i1, i17
|
2019-03-03 10:03:03 +08:00
|
|
|
"std.return"(%b, %c) : (i1, i17) -> ()
|
2019-01-10 04:28:30 +08:00
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @condbr_simple
|
|
|
|
func @condbr_simple() -> (i32) {
|
2018-07-25 06:01:27 +08:00
|
|
|
%cond = "foo"() : () -> i1
|
|
|
|
%a = "bar"() : () -> i32
|
|
|
|
%b = "bar"() : () -> i64
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: cond_br %{{.*}}, ^bb1(%{{.*}} : i32), ^bb2(%{{.*}} : i64)
|
2018-12-30 03:32:37 +08:00
|
|
|
cond_br %cond, ^bb1(%a : i32), ^bb2(%b : i64)
|
2018-07-25 06:01:27 +08:00
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
// CHECK: ^bb1({{.*}}: i32): // pred: ^bb0
|
|
|
|
^bb1(%x : i32):
|
|
|
|
br ^bb2(%b: i64)
|
2018-07-25 06:01:27 +08:00
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
// CHECK: ^bb2({{.*}}: i64): // 2 preds: ^bb0, ^bb1
|
|
|
|
^bb2(%y : i64):
|
2018-07-25 06:01:27 +08:00
|
|
|
%z = "foo"() : () -> i32
|
|
|
|
return %z : i32
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @condbr_moarargs
|
|
|
|
func @condbr_moarargs() -> (i32) {
|
2018-07-25 06:01:27 +08:00
|
|
|
%cond = "foo"() : () -> i1
|
|
|
|
%a = "bar"() : () -> i32
|
|
|
|
%b = "bar"() : () -> i64
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: cond_br %{{.*}}, ^bb1(%{{.*}}, %{{.*}} : i32, i64), ^bb2(%{{.*}}, %{{.*}}, %{{.*}} : i64, i32, i32)
|
2018-12-30 03:32:37 +08:00
|
|
|
cond_br %cond, ^bb1(%a, %b : i32, i64), ^bb2(%b, %a, %a : i64, i32, i32)
|
2018-07-25 06:01:27 +08:00
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb1(%x : i32, %y : i64):
|
2018-07-25 06:01:27 +08:00
|
|
|
return %x : i32
|
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb2(%x2 : i64, %y2 : i32, %z2 : i32):
|
2018-07-25 06:01:27 +08:00
|
|
|
%z = "foo"() : () -> i32
|
|
|
|
return %z : i32
|
|
|
|
}
|
2018-08-02 01:43:18 +08:00
|
|
|
|
|
|
|
|
|
|
|
// Test pretty printing of constant names.
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @constants
|
|
|
|
func @constants() -> (i32, i23, i23, i1, i1) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 42 : i32
|
2018-08-02 01:43:18 +08:00
|
|
|
%x = constant 42 : i32
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 17 : i23
|
2018-08-02 01:43:18 +08:00
|
|
|
%y = constant 17 : i23
|
|
|
|
|
|
|
|
// This is a redundant definition of 17, the asmprinter gives it a unique name
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 17 : i23
|
2018-08-02 01:43:18 +08:00
|
|
|
%z = constant 17 : i23
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 1 : i1
|
2018-08-03 08:16:58 +08:00
|
|
|
%t = constant 1 : i1
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 0 : i1
|
2018-08-03 08:16:58 +08:00
|
|
|
%f = constant 0 : i1
|
|
|
|
|
2019-02-08 00:36:50 +08:00
|
|
|
// The trick to parse type declarations should not interfere with hex
|
|
|
|
// literals.
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = constant 3890 : i32
|
2019-02-08 00:36:50 +08:00
|
|
|
%h = constant 0xf32 : i32
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: return %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}
|
2018-08-03 08:16:58 +08:00
|
|
|
return %x, %y, %z, %t, %f : i32, i23, i23, i1, i1
|
2018-08-02 01:43:18 +08:00
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @typeattr
|
|
|
|
func @typeattr() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {bar = tensor<*xf32>} : () -> ()
|
|
|
|
"foo"(){bar = tensor<*xf32>} : () -> ()
|
2018-08-03 16:54:46 +08:00
|
|
|
return
|
|
|
|
}
|
2018-08-14 16:16:45 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @stringquote
|
|
|
|
func @stringquote() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {bar = "a\22quoted\22string"} : () -> ()
|
|
|
|
"foo"(){bar = "a\"quoted\"string"} : () -> ()
|
2019-06-28 00:12:19 +08:00
|
|
|
|
|
|
|
// CHECK-NEXT: "typed_string" : !foo.string
|
|
|
|
"foo"(){bar = "typed_string" : !foo.string} : () -> ()
|
2018-08-14 16:16:45 +08:00
|
|
|
return
|
|
|
|
}
|
2018-08-16 00:09:54 +08:00
|
|
|
|
2019-04-26 00:56:09 +08:00
|
|
|
// CHECK-LABEL: func @unitAttrs
|
|
|
|
func @unitAttrs() -> () {
|
2019-10-22 02:01:38 +08:00
|
|
|
// CHECK-NEXT: "foo"() {unitAttr}
|
2019-06-26 10:06:06 +08:00
|
|
|
"foo"() {unitAttr = unit} : () -> ()
|
2019-04-26 00:56:09 +08:00
|
|
|
|
2019-10-22 02:01:38 +08:00
|
|
|
// CHECK-NEXT: "foo"() {unitAttr}
|
2019-04-26 00:56:09 +08:00
|
|
|
"foo"() {unitAttr} : () -> ()
|
2019-10-22 02:01:38 +08:00
|
|
|
|
|
|
|
// CHECK-NEXT: "foo"() {nested = {unitAttr}}
|
|
|
|
"foo"() {nested = {unitAttr}} : () -> ()
|
2019-04-26 00:56:09 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @floatAttrs
|
|
|
|
func @floatAttrs() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo"() {a = 4.000000e+00 : f64, b = 2.000000e+00 : f64, c = 7.100000e+00 : f64, d = -0.000000e+00 : f64} : () -> ()
|
|
|
|
"foo"(){a = 4.0, b = 2.0, c = 7.1, d = -0.0} : () -> ()
|
2018-08-16 00:09:54 +08:00
|
|
|
return
|
2018-08-21 05:37:39 +08:00
|
|
|
}
|
2018-09-19 07:36:26 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @externalfuncattr
|
|
|
|
func @externalfuncattr() -> ()
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: attributes {dialect.a = "a\22quoted\22string", dialect.b = 4.000000e+00 : f64, dialect.c = tensor<*xf32>}
|
|
|
|
attributes {dialect.a = "a\"quoted\"string", dialect.b = 4.0, dialect.c = tensor<*xf32>}
|
2018-09-19 07:36:26 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @funcattrempty
|
|
|
|
func @funcattrempty() -> ()
|
2018-09-19 07:36:26 +08:00
|
|
|
attributes {}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @funcattr
|
|
|
|
func @funcattr() -> ()
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: attributes {dialect.a = "a\22quoted\22string", dialect.b = 4.000000e+00 : f64, dialect.c = tensor<*xf32>}
|
|
|
|
attributes {dialect.a = "a\"quoted\"string", dialect.b = 4.0, dialect.c = tensor<*xf32>} {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-09-19 07:36:26 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @funcattrwithblock
|
|
|
|
func @funcattrwithblock() -> ()
|
2018-09-19 07:36:26 +08:00
|
|
|
attributes {} {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-09-19 07:36:26 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-label func @funcsimplemap
|
2018-09-26 08:15:54 +08:00
|
|
|
#map_simple0 = ()[] -> (10)
|
|
|
|
#map_simple1 = ()[s0] -> (s0)
|
|
|
|
#map_non_simple0 = (d0)[] -> (d0)
|
|
|
|
#map_non_simple1 = (d0)[s0] -> (d0 + s0)
|
|
|
|
#map_non_simple2 = ()[s0, s1] -> (s0 + s1)
|
|
|
|
#map_non_simple3 = ()[s0] -> (s0 + 3)
|
2019-01-03 02:20:00 +08:00
|
|
|
func @funcsimplemap(%arg0: index, %arg1: index) -> () {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i0 = 0 to #map_simple0()[] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 0 to 10 {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i1 = 0 to #map_simple1()[%arg1] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 0 to %{{.*}} {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i2 = 0 to #map_non_simple0(%i0)[] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}(%{{.*}}) {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i3 = 0 to #map_non_simple1(%i0)[%arg1] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}(%{{.*}})[%{{.*}}] {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i4 = 0 to #map_non_simple2()[%arg1, %arg0] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}()[%{{.*}}, %{{.*}}] {
|
2019-03-26 01:14:34 +08:00
|
|
|
affine.for %i5 = 0 to #map_non_simple3()[%arg0] {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.for %{{.*}} = 0 to #map{{[a-z_0-9]*}}()[%{{.*}}] {
|
2018-09-26 08:15:54 +08:00
|
|
|
%c42_i32 = constant 42 : i32
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-09-23 01:35:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2018-10-10 23:57:51 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @splattensorattr
|
|
|
|
func @splattensorattr() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2019-07-19 00:24:41 +08:00
|
|
|
// CHECK: "splatBoolTensor"() {bar = dense<false> : tensor<i1>} : () -> ()
|
2019-06-26 10:06:06 +08:00
|
|
|
"splatBoolTensor"(){bar = dense<false> : tensor<i1>} : () -> ()
|
2019-03-19 04:42:55 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "splatIntTensor"() {bar = dense<5> : tensor<2x1x4xi32>} : () -> ()
|
|
|
|
"splatIntTensor"(){bar = dense<5> : tensor<2x1x4xi32>} : () -> ()
|
2019-03-19 04:42:55 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "splatFloatTensor"() {bar = dense<-5.000000e+00> : tensor<2x1x4xf32>} : () -> ()
|
|
|
|
"splatFloatTensor"(){bar = dense<-5.0> : tensor<2x1x4xf32>} : () -> ()
|
2019-03-19 04:42:55 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "splatIntVector"() {bar = dense<5> : vector<2x1x4xi64>} : () -> ()
|
|
|
|
"splatIntVector"(){bar = dense<5> : vector<2x1x4xi64>} : () -> ()
|
2019-03-19 04:42:55 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "splatFloatVector"() {bar = dense<-5.000000e+00> : vector<2x1x4xf16>} : () -> ()
|
|
|
|
"splatFloatVector"(){bar = dense<-5.0> : vector<2x1x4xf16>} : () -> ()
|
2019-04-02 01:01:47 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "splatIntScalar"() {bar = dense<5> : tensor<i9>} : () -> ()
|
|
|
|
"splatIntScalar"() {bar = dense<5> : tensor<i9>} : () -> ()
|
|
|
|
// CHECK: "splatFloatScalar"() {bar = dense<-5.000000e+00> : tensor<f16>} : () -> ()
|
|
|
|
"splatFloatScalar"() {bar = dense<-5.0> : tensor<f16>} : () -> ()
|
2018-10-10 23:57:51 +08:00
|
|
|
return
|
|
|
|
}
|
2018-10-19 04:54:44 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @densetensorattr
|
|
|
|
func @densetensorattr() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
|
|
|
|
// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "fooi3"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi3>} : () -> ()
|
|
|
|
"fooi3"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi3>} : () -> ()
|
|
|
|
// CHECK: "fooi6"() {bar = dense<{{\[\[\[}}5, -6, 1, 2]], {{\[\[}}7, 8, 3, 4]]]> : tensor<2x1x4xi6>} : () -> ()
|
|
|
|
"fooi6"(){bar = dense<[[[5, -6, 1, 2]], [[7, 8, 3, 4]]]> : tensor<2x1x4xi6>} : () -> ()
|
|
|
|
// CHECK: "fooi8"() {bar = dense<5> : tensor<1x1x1xi8>} : () -> ()
|
|
|
|
"fooi8"(){bar = dense<[[[5]]]> : tensor<1x1x1xi8>} : () -> ()
|
|
|
|
// CHECK: "fooi13"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi13>} : () -> ()
|
|
|
|
"fooi13"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi13>} : () -> ()
|
|
|
|
// CHECK: "fooi16"() {bar = dense<-5> : tensor<1x1x1xi16>} : () -> ()
|
|
|
|
"fooi16"(){bar = dense<[[[-5]]]> : tensor<1x1x1xi16>} : () -> ()
|
|
|
|
// CHECK: "fooi23"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi23>} : () -> ()
|
|
|
|
"fooi23"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi23>} : () -> ()
|
|
|
|
// CHECK: "fooi32"() {bar = dense<5> : tensor<1x1x1xi32>} : () -> ()
|
|
|
|
"fooi32"(){bar = dense<[[[5]]]> : tensor<1x1x1xi32>} : () -> ()
|
|
|
|
// CHECK: "fooi33"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi33>} : () -> ()
|
|
|
|
"fooi33"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi33>} : () -> ()
|
|
|
|
// CHECK: "fooi43"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi43>} : () -> ()
|
|
|
|
"fooi43"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi43>} : () -> ()
|
|
|
|
// CHECK: "fooi53"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 2, -1, 2]]]> : tensor<2x1x4xi53>} : () -> ()
|
|
|
|
"fooi53"(){bar = dense<[[[1, -2, 1, 2]], [[0, 2, -1, 2]]]> : tensor<2x1x4xi53>} : () -> ()
|
|
|
|
// CHECK: "fooi64"() {bar = dense<{{\[\[\[}}1, -2, 1, 2]], {{\[\[}}0, 3, -1, 2]]]> : tensor<2x1x4xi64>} : () -> ()
|
|
|
|
"fooi64"(){bar = dense<[[[1, -2, 1, 2]], [[0, 3, -1, 2]]]> : tensor<2x1x4xi64>} : () -> ()
|
|
|
|
// CHECK: "fooi64"() {bar = dense<-5> : tensor<1x1x1xi64>} : () -> ()
|
|
|
|
"fooi64"(){bar = dense<[[[-5]]]> : tensor<1x1x1xi64>} : () -> ()
|
|
|
|
// CHECK: "fooi67"() {bar = dense<{{\[\[\[}}-5, 4, 6, 2]]]> : vector<1x1x4xi67>} : () -> ()
|
|
|
|
"fooi67"(){bar = dense<[[[-5, 4, 6, 2]]]> : vector<1x1x4xi67>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "foo2"() {bar = dense<[]> : tensor<0xi32>} : () -> ()
|
|
|
|
"foo2"(){bar = dense<[]> : tensor<0xi32>} : () -> ()
|
|
|
|
// CHECK: "foo2"() {bar = dense<{{\[\[}}]]> : tensor<1x0xi32>} : () -> ()
|
|
|
|
"foo2"(){bar = dense<[[]]> : tensor<1x0xi32>} : () -> ()
|
|
|
|
// CHECK: "foo3"() {bar = dense<{{\[\[\[}}5, -6, 1, 2]], {{\[\[}}7, 8, 3, 4]]]> : tensor<2x1x4xi32>} : () -> ()
|
|
|
|
"foo3"(){bar = dense<[[[5, -6, 1, 2]], [[7, 8, 3, 4]]]> : tensor<2x1x4xi32>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "float1"() {bar = dense<5.000000e+00> : tensor<1x1x1xf32>} : () -> ()
|
|
|
|
"float1"(){bar = dense<[[[5.0]]]> : tensor<1x1x1xf32>} : () -> ()
|
|
|
|
// CHECK: "float2"() {bar = dense<[]> : tensor<0xf32>} : () -> ()
|
|
|
|
"float2"(){bar = dense<[]> : tensor<0xf32>} : () -> ()
|
|
|
|
// CHECK: "float2"() {bar = dense<{{\[\[}}]]> : tensor<1x0xf32>} : () -> ()
|
|
|
|
"float2"(){bar = dense<[[]]> : tensor<1x0xf32>} : () -> ()
|
|
|
|
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"bfloat16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xbf16>} : () -> ()
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"float16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xf16>} : () -> ()
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"float32"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xf32>} : () -> ()
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"float64"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : tensor<2x1x4xf64>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "intscalar"() {bar = dense<1> : tensor<i32>} : () -> ()
|
|
|
|
"intscalar"(){bar = dense<1> : tensor<i32>} : () -> ()
|
|
|
|
// CHECK: "floatscalar"() {bar = dense<5.000000e+00> : tensor<f32>} : () -> ()
|
|
|
|
"floatscalar"(){bar = dense<5.0> : tensor<f32>} : () -> ()
|
2018-10-19 04:54:44 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @densevectorattr
|
|
|
|
func @densevectorattr() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "fooi8"() {bar = dense<5> : vector<1x1x1xi8>} : () -> ()
|
|
|
|
"fooi8"(){bar = dense<[[[5]]]> : vector<1x1x1xi8>} : () -> ()
|
|
|
|
// CHECK: "fooi16"() {bar = dense<-5> : vector<1x1x1xi16>} : () -> ()
|
|
|
|
"fooi16"(){bar = dense<[[[-5]]]> : vector<1x1x1xi16>} : () -> ()
|
|
|
|
// CHECK: "foo32"() {bar = dense<5> : vector<1x1x1xi32>} : () -> ()
|
|
|
|
"foo32"(){bar = dense<[[[5]]]> : vector<1x1x1xi32>} : () -> ()
|
|
|
|
// CHECK: "fooi64"() {bar = dense<-5> : vector<1x1x1xi64>} : () -> ()
|
|
|
|
"fooi64"(){bar = dense<[[[-5]]]> : vector<1x1x1xi64>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "foo3"() {bar = dense<{{\[\[\[}}5, -6, 1, 2]], {{\[\[}}7, 8, 3, 4]]]> : vector<2x1x4xi32>} : () -> ()
|
|
|
|
"foo3"(){bar = dense<[[[5, -6, 1, 2]], [[7, 8, 3, 4]]]> : vector<2x1x4xi32>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "float1"() {bar = dense<5.000000e+00> : vector<1x1x1xf32>} : () -> ()
|
|
|
|
"float1"(){bar = dense<[[[5.0]]]> : vector<1x1x1xf32>} : () -> ()
|
|
|
|
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"bfloat16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xbf16>} : () -> ()
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"float16"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xf16>} : () -> ()
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"float32"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xf32>} : () -> ()
|
|
|
|
// 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>} : () -> ()
|
|
|
|
"float64"(){bar = dense<[[[-5.0, 6.0, 1.0, 2.0]], [[7.0, -8.0, 3.0, 4.0]]]> : vector<2x1x4xf64>} : () -> ()
|
2018-10-19 04:54:44 +08:00
|
|
|
return
|
Add support to constant sparse tensor / vector attribute
The SparseElementsAttr uses (COO) Coordinate List encoding to represents a
sparse tensor / vector. Specifically, the coordinates and values are stored as
two dense elements attributes. The first dense elements attribute is a 2-D
attribute with shape [N, ndims], which contains the indices of the elements
with nonzero values in the constant vector/tensor. The second elements
attribute is a 1-D attribute list with shape [N], which supplies the values for
each element in the first elements attribute. ndims is the rank of the
vector/tensor and N is the total nonzero elements.
The syntax is:
`sparse<` (tensor-type | vector-type)`, ` indices-attribute-list, values-attribute-list `>`
Example: a sparse tensor
sparse<vector<3x4xi32>, [[0, 0], [1, 2]], [1, 2]> represents the dense tensor
[[1, 0, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 0]]
PiperOrigin-RevId: 217764319
2018-10-19 05:02:20 +08:00
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @sparsetensorattr
|
|
|
|
func @sparsetensorattr() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
Add support to constant sparse tensor / vector attribute
The SparseElementsAttr uses (COO) Coordinate List encoding to represents a
sparse tensor / vector. Specifically, the coordinates and values are stored as
two dense elements attributes. The first dense elements attribute is a 2-D
attribute with shape [N, ndims], which contains the indices of the elements
with nonzero values in the constant vector/tensor. The second elements
attribute is a 1-D attribute list with shape [N], which supplies the values for
each element in the first elements attribute. ndims is the rank of the
vector/tensor and N is the total nonzero elements.
The syntax is:
`sparse<` (tensor-type | vector-type)`, ` indices-attribute-list, values-attribute-list `>`
Example: a sparse tensor
sparse<vector<3x4xi32>, [[0, 0], [1, 2]], [1, 2]> represents the dense tensor
[[1, 0, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 0]]
PiperOrigin-RevId: 217764319
2018-10-19 05:02:20 +08:00
|
|
|
// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "fooi8"() {bar = sparse<0, -2> : tensor<1x1x1xi8>} : () -> ()
|
|
|
|
"fooi8"(){bar = sparse<0, -2> : tensor<1x1x1xi8>} : () -> ()
|
|
|
|
// CHECK: "fooi16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2, -1, 5]> : tensor<2x2x2xi16>} : () -> ()
|
|
|
|
"fooi16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2, -1, 5]> : tensor<2x2x2xi16>} : () -> ()
|
|
|
|
// CHECK: "fooi32"() {bar = sparse<{{\[}}], {{\[}}]> : tensor<1x1xi32>} : () -> ()
|
|
|
|
"fooi32"(){bar = sparse<[], []> : tensor<1x1xi32>} : () -> ()
|
|
|
|
// CHECK: "fooi64"() {bar = sparse<0, -1> : tensor<1xi64>} : () -> ()
|
|
|
|
"fooi64"(){bar = sparse<[[0]], [-1]> : tensor<1xi64>} : () -> ()
|
|
|
|
// CHECK: "foo2"() {bar = sparse<{{\[}}], {{\[}}]> : tensor<0xi32>} : () -> ()
|
|
|
|
"foo2"(){bar = sparse<[], []> : tensor<0xi32>} : () -> ()
|
|
|
|
// CHECK: "foo3"() {bar = sparse<{{\[}}], {{\[}}]> : tensor<i32>} : () -> ()
|
|
|
|
"foo3"(){bar = sparse<[], []> : tensor<i32>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "foof16"() {bar = sparse<0, -2.000000e+00> : tensor<1x1x1xf16>} : () -> ()
|
|
|
|
"foof16"(){bar = sparse<0, -2.0> : tensor<1x1x1xf16>} : () -> ()
|
|
|
|
// CHECK: "foobf16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2.000000e+00, -1.000000e+00, 5.000000e+00]> : tensor<2x2x2xbf16>} : () -> ()
|
|
|
|
"foobf16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2.0, -1.0, 5.0]> : tensor<2x2x2xbf16>} : () -> ()
|
|
|
|
// CHECK: "foof32"() {bar = sparse<{{\[}}], {{\[}}]> : tensor<1x0x1xf32>} : () -> ()
|
|
|
|
"foof32"(){bar = sparse<[], []> : tensor<1x0x1xf32>} : () -> ()
|
|
|
|
// CHECK: "foof64"() {bar = sparse<0, -1.000000e+00> : tensor<1xf64>} : () -> ()
|
|
|
|
"foof64"(){bar = sparse<[[0]], [-1.0]> : tensor<1xf64>} : () -> ()
|
|
|
|
// CHECK: "foof320"() {bar = sparse<{{\[}}], {{\[}}]> : tensor<0xf32>} : () -> ()
|
|
|
|
"foof320"(){bar = sparse<[], []> : tensor<0xf32>} : () -> ()
|
|
|
|
// CHECK: "foof321"() {bar = sparse<{{\[}}], {{\[}}]> : tensor<f32>} : () -> ()
|
|
|
|
"foof321"(){bar = sparse<[], []> : tensor<f32>} : () -> ()
|
Add support to constant sparse tensor / vector attribute
The SparseElementsAttr uses (COO) Coordinate List encoding to represents a
sparse tensor / vector. Specifically, the coordinates and values are stored as
two dense elements attributes. The first dense elements attribute is a 2-D
attribute with shape [N, ndims], which contains the indices of the elements
with nonzero values in the constant vector/tensor. The second elements
attribute is a 1-D attribute list with shape [N], which supplies the values for
each element in the first elements attribute. ndims is the rank of the
vector/tensor and N is the total nonzero elements.
The syntax is:
`sparse<` (tensor-type | vector-type)`, ` indices-attribute-list, values-attribute-list `>`
Example: a sparse tensor
sparse<vector<3x4xi32>, [[0, 0], [1, 2]], [1, 2]> represents the dense tensor
[[1, 0, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 0]]
PiperOrigin-RevId: 217764319
2018-10-19 05:02:20 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
// CHECK-LABEL: func @sparsevectorattr
|
|
|
|
func @sparsevectorattr() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
Add support to constant sparse tensor / vector attribute
The SparseElementsAttr uses (COO) Coordinate List encoding to represents a
sparse tensor / vector. Specifically, the coordinates and values are stored as
two dense elements attributes. The first dense elements attribute is a 2-D
attribute with shape [N, ndims], which contains the indices of the elements
with nonzero values in the constant vector/tensor. The second elements
attribute is a 1-D attribute list with shape [N], which supplies the values for
each element in the first elements attribute. ndims is the rank of the
vector/tensor and N is the total nonzero elements.
The syntax is:
`sparse<` (tensor-type | vector-type)`, ` indices-attribute-list, values-attribute-list `>`
Example: a sparse tensor
sparse<vector<3x4xi32>, [[0, 0], [1, 2]], [1, 2]> represents the dense tensor
[[1, 0, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 0]]
PiperOrigin-RevId: 217764319
2018-10-19 05:02:20 +08:00
|
|
|
// NOTE: The {{\[\[}} syntax is because "[[" confuses FileCheck.
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "fooi8"() {bar = sparse<0, -2> : vector<1x1x1xi8>} : () -> ()
|
|
|
|
"fooi8"(){bar = sparse<0, -2> : vector<1x1x1xi8>} : () -> ()
|
|
|
|
// CHECK: "fooi16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2, -1, 5]> : vector<2x2x2xi16>} : () -> ()
|
|
|
|
"fooi16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2, -1, 5]> : vector<2x2x2xi16>} : () -> ()
|
|
|
|
// CHECK: "fooi32"() {bar = sparse<{{\[}}], {{\[}}]> : vector<1x1xi32>} : () -> ()
|
|
|
|
"fooi32"(){bar = sparse<[], []> : vector<1x1xi32>} : () -> ()
|
|
|
|
// CHECK: "fooi64"() {bar = sparse<0, -1> : vector<1xi64>} : () -> ()
|
|
|
|
"fooi64"(){bar = sparse<[[0]], [-1]> : vector<1xi64>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: "foof16"() {bar = sparse<0, -2.000000e+00> : vector<1x1x1xf16>} : () -> ()
|
|
|
|
"foof16"(){bar = sparse<0, -2.0> : vector<1x1x1xf16>} : () -> ()
|
|
|
|
// CHECK: "foobf16"() {bar = sparse<{{\[\[}}1, 1, 0], {{\[}}0, 1, 0], {{\[}}0, 0, 1]], {{\[}}2.000000e+00, -1.000000e+00, 5.000000e+00]> : vector<2x2x2xbf16>} : () -> ()
|
|
|
|
"foobf16"(){bar = sparse<[[1, 1, 0], [0, 1, 0], [0, 0, 1]], [2.0, -1.0, 5.0]> : vector<2x2x2xbf16>} : () -> ()
|
|
|
|
// CHECK: "foof64"() {bar = sparse<0, -1.000000e+00> : vector<1xf64>} : () -> ()
|
|
|
|
"foof64"(){bar = sparse<0, [-1.0]> : vector<1xf64>} : () -> ()
|
Add support to constant sparse tensor / vector attribute
The SparseElementsAttr uses (COO) Coordinate List encoding to represents a
sparse tensor / vector. Specifically, the coordinates and values are stored as
two dense elements attributes. The first dense elements attribute is a 2-D
attribute with shape [N, ndims], which contains the indices of the elements
with nonzero values in the constant vector/tensor. The second elements
attribute is a 1-D attribute list with shape [N], which supplies the values for
each element in the first elements attribute. ndims is the rank of the
vector/tensor and N is the total nonzero elements.
The syntax is:
`sparse<` (tensor-type | vector-type)`, ` indices-attribute-list, values-attribute-list `>`
Example: a sparse tensor
sparse<vector<3x4xi32>, [[0, 0], [1, 2]], [1, 2]> represents the dense tensor
[[1, 0, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 0]]
PiperOrigin-RevId: 217764319
2018-10-19 05:02:20 +08:00
|
|
|
return
|
2018-10-26 09:33:42 +08:00
|
|
|
}
|
2018-12-30 05:36:59 +08:00
|
|
|
|
2019-01-08 01:58:34 +08:00
|
|
|
// CHECK-LABEL: func @unknown_dialect_type() -> !bar<""> {
|
|
|
|
func @unknown_dialect_type() -> !bar<""> {
|
|
|
|
// Unregistered dialect 'bar'.
|
|
|
|
// CHECK: "foo"() : () -> !bar<"">
|
|
|
|
%0 = "foo"() : () -> !bar<"">
|
|
|
|
|
2019-04-06 14:56:49 +08:00
|
|
|
// CHECK: "foo"() : () -> !bar.baz
|
2019-01-08 01:58:34 +08:00
|
|
|
%1 = "foo"() : () -> !bar<"baz">
|
|
|
|
|
|
|
|
return %0 : !bar<"">
|
|
|
|
}
|
2018-12-30 05:36:59 +08:00
|
|
|
|
2019-01-08 10:42:04 +08:00
|
|
|
// CHECK-LABEL: func @type_alias() -> i32 {
|
|
|
|
!i32_type_alias = type i32
|
|
|
|
func @type_alias() -> !i32_type_alias {
|
|
|
|
|
|
|
|
// Return a non-aliased i32 type.
|
|
|
|
%0 = "foo"() : () -> i32
|
|
|
|
return %0 : i32
|
|
|
|
}
|
2019-01-26 04:48:25 +08:00
|
|
|
|
2019-02-03 13:01:11 +08:00
|
|
|
// CHECK-LABEL: func @no_integer_set_constraints(
|
|
|
|
func @no_integer_set_constraints() {
|
2019-03-25 11:35:07 +08:00
|
|
|
// CHECK: affine.if [[SET_TRUE]]() {
|
|
|
|
affine.if () : () () {
|
2019-02-03 13:01:11 +08:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-26 04:48:25 +08:00
|
|
|
// CHECK-LABEL: func @verbose_if(
|
|
|
|
func @verbose_if(%N: index) {
|
|
|
|
%c = constant 200 : index
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: affine.if #set{{.*}}(%{{.*}})[%{{.*}}, %{{.*}}] {
|
2019-05-06 16:40:13 +08:00
|
|
|
"affine.if"(%c, %N, %c) ({
|
2019-01-26 04:48:25 +08:00
|
|
|
// CHECK-NEXT: "add"
|
|
|
|
%y = "add"(%c, %N) : (index, index) -> index
|
2019-03-27 20:11:58 +08:00
|
|
|
"affine.terminator"() : () -> ()
|
2019-01-29 13:23:53 +08:00
|
|
|
// CHECK-NEXT: } else {
|
2019-05-06 16:40:13 +08:00
|
|
|
}, { // The else region.
|
2019-01-26 04:48:25 +08:00
|
|
|
// CHECK-NEXT: "add"
|
|
|
|
%z = "add"(%c, %c) : (index, index) -> index
|
2019-03-27 20:11:58 +08:00
|
|
|
"affine.terminator"() : () -> ()
|
2019-05-06 16:40:13 +08:00
|
|
|
})
|
2019-06-26 10:06:06 +08:00
|
|
|
{ condition = #set0 } : (index, index, index) -> ()
|
2019-05-06 16:40:13 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @terminator_with_regions
|
|
|
|
func @terminator_with_regions() {
|
|
|
|
// Combine successors and regions in the same operation.
|
|
|
|
// CHECK: "region"()[^bb1] ( {
|
|
|
|
// CHECK: }) : () -> ()
|
|
|
|
"region"()[^bb2] ({}) : () -> ()
|
|
|
|
^bb2:
|
2019-01-26 04:48:25 +08:00
|
|
|
return
|
|
|
|
}
|
2019-02-09 01:52:26 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @unregistered_term
|
|
|
|
func @unregistered_term(%arg0 : i1) -> i1 {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-NEXT: "unregistered_br"()[^bb1(%{{.*}} : i1)] : () -> ()
|
2019-02-09 01:52:26 +08:00
|
|
|
"unregistered_br"()[^bb1(%arg0 : i1)] : () -> ()
|
|
|
|
|
|
|
|
^bb1(%arg1 : i1):
|
|
|
|
return %arg1 : i1
|
|
|
|
}
|
2019-02-27 04:52:51 +08:00
|
|
|
|
2019-03-03 14:34:18 +08:00
|
|
|
// CHECK-LABEL: func @dialect_attrs
|
|
|
|
func @dialect_attrs()
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK-NEXT: attributes {dialect.attr = 10
|
|
|
|
attributes {dialect.attr = 10} {
|
2019-02-27 04:52:51 +08:00
|
|
|
return
|
|
|
|
}
|
2019-02-27 09:11:24 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @_valid.function$name
|
|
|
|
func @_valid.function$name()
|
2019-03-01 01:30:52 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK-LABEL: func @external_func_arg_attrs(i32, i1 {dialect.attr = 10 : i64}, i32)
|
|
|
|
func @external_func_arg_attrs(i32, i1 {dialect.attr = 10 : i64}, i32)
|
2019-03-01 01:30:52 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @func_arg_attrs(%{{.*}}: i1 {dialect.attr = 10 : i64})
|
2019-06-26 10:06:06 +08:00
|
|
|
func @func_arg_attrs(%arg0: i1 {dialect.attr = 10 : i64}) {
|
2019-03-01 01:30:52 +08:00
|
|
|
return
|
|
|
|
}
|
2019-03-20 01:59:02 +08:00
|
|
|
|
2019-10-19 07:02:56 +08:00
|
|
|
// CHECK-LABEL: func @func_result_attrs({{.*}}) -> (f32 {dialect.attr = 1 : i64})
|
|
|
|
func @func_result_attrs(%arg0: f32) -> (f32 {dialect.attr = 1}) {
|
|
|
|
return %arg0 : f32
|
|
|
|
}
|
|
|
|
|
2019-03-20 01:59:02 +08:00
|
|
|
// CHECK-LABEL: func @empty_tuple(tuple<>)
|
|
|
|
func @empty_tuple(tuple<>)
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @tuple_single_element(tuple<i32>)
|
|
|
|
func @tuple_single_element(tuple<i32>)
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @tuple_multi_element(tuple<i32, i16, f32>)
|
|
|
|
func @tuple_multi_element(tuple<i32, i16, f32>)
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @tuple_nested(tuple<tuple<tuple<i32>>>)
|
|
|
|
func @tuple_nested(tuple<tuple<tuple<i32>>>)
|
2019-03-29 05:58:52 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @pretty_form_multi_result
|
|
|
|
func @pretty_form_multi_result() -> (i16, i16) {
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}}:2 = "foo_div"() : () -> (i16, i16)
|
2019-03-29 05:58:52 +08:00
|
|
|
%quot, %rem = "foo_div"() : () -> (i16, i16)
|
|
|
|
return %quot, %rem : i16, i16
|
|
|
|
}
|
2019-04-06 10:36:42 +08:00
|
|
|
|
2019-10-26 00:33:32 +08:00
|
|
|
// CHECK-LABEL: func @pretty_form_multi_result_groups
|
|
|
|
func @pretty_form_multi_result_groups() -> (i16, i16, i16, i16, i16) {
|
|
|
|
// CHECK: %[[RES:.*]]:5 =
|
|
|
|
// CHECK: return %[[RES]]#0, %[[RES]]#1, %[[RES]]#2, %[[RES]]#3, %[[RES]]#4
|
|
|
|
%group_1:2, %group_2, %group_3:2 = "foo_test"() : () -> (i16, i16, i16, i16, i16)
|
|
|
|
return %group_1#0, %group_1#1, %group_2, %group_3#0, %group_3#1 : i16, i16, i16, i16, i16
|
|
|
|
}
|
|
|
|
|
2019-05-16 00:10:52 +08:00
|
|
|
// CHECK-LABEL: func @pretty_dialect_attribute()
|
|
|
|
func @pretty_dialect_attribute() {
|
2019-10-18 03:23:47 +08:00
|
|
|
// CHECK: "foo.unknown_op"() {foo = #foo.simple_attr} : () -> ()
|
|
|
|
"foo.unknown_op"() {foo = #foo.simple_attr} : () -> ()
|
2019-05-16 00:10:52 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo.unknown_op"() {foo = #foo.complexattr<abcd>} : () -> ()
|
|
|
|
"foo.unknown_op"() {foo = #foo.complexattr<abcd>} : () -> ()
|
2019-05-16 00:10:52 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo.unknown_op"() {foo = #foo.complexattr<abcd<f32>>} : () -> ()
|
|
|
|
"foo.unknown_op"() {foo = #foo.complexattr<abcd<f32>>} : () -> ()
|
2019-05-16 00:10:52 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo.unknown_op"() {foo = #foo.complexattr<abcd<[f]$$[32]>>} : () -> ()
|
|
|
|
"foo.unknown_op"() {foo = #foo.complexattr<abcd<[f]$$[32]>>} : () -> ()
|
2019-05-16 00:10:52 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo.unknown_op"() {foo = #foo.dialect<!x@#!@#>} : () -> ()
|
|
|
|
"foo.unknown_op"() {foo = #foo.dialect<!x@#!@#>} : () -> ()
|
2019-05-16 00:10:52 +08:00
|
|
|
|
|
|
|
// Extraneous extra > character can't use the pretty syntax.
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK: "foo.unknown_op"() {foo = #foo<"dialect<!x@#!@#>>">} : () -> ()
|
|
|
|
"foo.unknown_op"() {foo = #foo<"dialect<!x@#!@#>>">} : () -> ()
|
2019-05-16 00:10:52 +08:00
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-04-06 10:36:42 +08:00
|
|
|
// CHECK-LABEL: func @pretty_dialect_type()
|
|
|
|
func @pretty_dialect_type() {
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.simpletype
|
2019-04-06 10:36:42 +08:00
|
|
|
%0 = "foo.unknown_op"() : () -> !foo.simpletype
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.complextype<abcd>
|
2019-04-06 10:36:42 +08:00
|
|
|
%1 = "foo.unknown_op"() : () -> !foo.complextype<abcd>
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.complextype<abcd<f32>>
|
2019-04-06 10:36:42 +08:00
|
|
|
%2 = "foo.unknown_op"() : () -> !foo.complextype<abcd<f32>>
|
2019-04-15 04:41:09 +08:00
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.complextype<abcd<[f]$$[32]>>
|
2019-04-15 04:41:09 +08:00
|
|
|
%3 = "foo.unknown_op"() : () -> !foo.complextype<abcd<[f]$$[32]>>
|
|
|
|
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo.dialect<!x@#!@#>
|
2019-04-15 04:41:09 +08:00
|
|
|
%4 = "foo.unknown_op"() : () -> !foo.dialect<!x@#!@#>
|
|
|
|
|
|
|
|
// Extraneous extra > character can't use the pretty syntax.
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK: %{{.*}} = "foo.unknown_op"() : () -> !foo<"dialect<!x@#!@#>>">
|
2019-04-15 04:41:09 +08:00
|
|
|
%5 = "foo.unknown_op"() : () -> !foo<"dialect<!x@#!@#>>">
|
|
|
|
|
2019-04-06 10:36:42 +08:00
|
|
|
return
|
|
|
|
}
|
2019-04-28 09:35:04 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @none_type
|
|
|
|
func @none_type() {
|
|
|
|
// CHECK: "foo.unknown_op"() : () -> none
|
|
|
|
%none_val = "foo.unknown_op"() : () -> none
|
|
|
|
return
|
|
|
|
}
|
2019-06-04 00:43:22 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @scoped_names
|
|
|
|
func @scoped_names() {
|
|
|
|
// CHECK-NEXT: "foo.region_op"
|
|
|
|
"foo.region_op"() ({
|
|
|
|
// CHECK-NEXT: "foo.unknown_op"
|
|
|
|
%scoped_name = "foo.unknown_op"() : () -> none
|
|
|
|
"foo.terminator"() : () -> ()
|
|
|
|
}, {
|
|
|
|
// CHECK: "foo.unknown_op"
|
|
|
|
%scoped_name = "foo.unknown_op"() : () -> none
|
|
|
|
"foo.terminator"() : () -> ()
|
|
|
|
}) : () -> ()
|
|
|
|
return
|
|
|
|
}
|
2019-06-22 09:27:49 +08:00
|
|
|
|
2019-06-26 10:06:06 +08:00
|
|
|
// CHECK-LABEL: func @loc_attr(i1 {foo.loc_attr = loc(callsite("foo" at "mysource.cc":10:8))})
|
|
|
|
func @loc_attr(i1 {foo.loc_attr = loc(callsite("foo" at "mysource.cc":10:8))})
|
2019-07-18 07:05:32 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @dialect_attribute_with_type
|
|
|
|
func @dialect_attribute_with_type() {
|
|
|
|
// CHECK-NEXT: foo = #foo.attr : i32
|
|
|
|
"foo.unknown_op"() {foo = #foo.attr : i32} : () -> ()
|
|
|
|
}
|
2019-07-31 05:05:49 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: @f16_special_values
|
|
|
|
func @f16_special_values() {
|
|
|
|
// F16 NaNs.
|
|
|
|
// CHECK: constant 0x7C01 : f16
|
|
|
|
%0 = constant 0x7C01 : f16
|
|
|
|
// CHECK: constant 0x7FFF : f16
|
|
|
|
%1 = constant 0x7FFF : f16
|
|
|
|
// CHECK: constant 0xFFFF : f16
|
|
|
|
%2 = constant 0xFFFF : f16
|
|
|
|
|
|
|
|
// F16 positive infinity.
|
|
|
|
// CHECK: constant 0x7C00 : f16
|
|
|
|
%3 = constant 0x7C00 : f16
|
2019-10-21 00:44:06 +08:00
|
|
|
// F16 negative infinity.
|
2019-07-31 05:05:49 +08:00
|
|
|
// CHECK: constant 0xFC00 : f16
|
|
|
|
%4 = constant 0xFC00 : f16
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @f32_special_values
|
|
|
|
func @f32_special_values() {
|
|
|
|
// F32 signaling NaNs.
|
|
|
|
// CHECK: constant 0x7F800001 : f32
|
|
|
|
%0 = constant 0x7F800001 : f32
|
|
|
|
// CHECK: constant 0x7FBFFFFF : f32
|
|
|
|
%1 = constant 0x7FBFFFFF : f32
|
|
|
|
|
|
|
|
// F32 quiet NaNs.
|
|
|
|
// CHECK: constant 0x7FC00000 : f32
|
|
|
|
%2 = constant 0x7FC00000 : f32
|
|
|
|
// CHECK: constant 0xFFFFFFFF : f32
|
|
|
|
%3 = constant 0xFFFFFFFF : f32
|
|
|
|
|
|
|
|
// F32 positive infinity.
|
|
|
|
// CHECK: constant 0x7F800000 : f32
|
|
|
|
%4 = constant 0x7F800000 : f32
|
|
|
|
// F32 negative infinity.
|
|
|
|
// CHECK: constant 0xFF800000 : f32
|
|
|
|
%5 = constant 0xFF800000 : f32
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @f64_special_values
|
|
|
|
func @f64_special_values() {
|
|
|
|
// F64 signaling NaNs.
|
|
|
|
// CHECK: constant 0x7FF0000000000001 : f64
|
|
|
|
%0 = constant 0x7FF0000000000001 : f64
|
|
|
|
// CHECK: constant 0x7FF8000000000000 : f64
|
|
|
|
%1 = constant 0x7FF8000000000000 : f64
|
|
|
|
|
|
|
|
// F64 quiet NaNs.
|
|
|
|
// CHECK: constant 0x7FF0000001000000 : f64
|
|
|
|
%2 = constant 0x7FF0000001000000 : f64
|
|
|
|
// CHECK: constant 0xFFF0000001000000 : f64
|
|
|
|
%3 = constant 0xFFF0000001000000 : f64
|
|
|
|
|
2019-10-21 00:44:06 +08:00
|
|
|
// F64 positive infinity.
|
2019-07-31 05:05:49 +08:00
|
|
|
// CHECK: constant 0x7FF0000000000000 : f64
|
|
|
|
%4 = constant 0x7FF0000000000000 : f64
|
|
|
|
// F64 negative infinity.
|
|
|
|
// CHECK: constant 0xFFF0000000000000 : f64
|
|
|
|
%5 = constant 0xFFF0000000000000 : f64
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// We want to print floats in exponential notation with 6 significant digits,
|
|
|
|
// but it may lead to precision loss when parsing back, in which case we print
|
|
|
|
// the decimal form instead.
|
|
|
|
// CHECK-LABEL: @f32_potential_precision_loss()
|
|
|
|
func @f32_potential_precision_loss() {
|
|
|
|
// CHECK: constant -1.23697901 : f32
|
|
|
|
%0 = constant -1.23697901 : f32
|
|
|
|
return
|
|
|
|
}
|
2019-07-31 05:24:30 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: @special_float_values_in_tensors
|
|
|
|
func @special_float_values_in_tensors() {
|
|
|
|
// CHECK: dense<0xFFFFFFFF> : tensor<4x4xf32>
|
|
|
|
"foo"(){bar = dense<0xFFFFFFFF> : tensor<4x4xf32>} : () -> ()
|
|
|
|
// CHECK: dense<[{{\[}}0xFFFFFFFF, 0x7F800000], [0x7FBFFFFF, 0x7F800001]]> : tensor<2x2xf32>
|
|
|
|
"foo"(){bar = dense<[[0xFFFFFFFF, 0x7F800000], [0x7FBFFFFF, 0x7F800001]]> : tensor<2x2xf32>} : () -> ()
|
|
|
|
// CHECK: dense<[0xFFFFFFFF, 0.000000e+00]> : tensor<2xf32>
|
|
|
|
"foo"(){bar = dense<[0xFFFFFFFF, 0.0]> : tensor<2xf32>} : () -> ()
|
|
|
|
|
|
|
|
// CHECK: sparse<[{{\[}}1, 1, 0], [0, 1, 1]], [0xFFFFFFFF, 0x7F800001]>
|
|
|
|
"foo"(){bar = sparse<[[1,1,0],[0,1,1]], [0xFFFFFFFF, 0x7F800001]> : tensor<2x2x2xf32>} : () -> ()
|
|
|
|
}
|
2019-08-20 06:26:43 +08:00
|
|
|
|
|
|
|
// Test parsing of an op with multiple region arguments, and without a
|
|
|
|
// delimiter.
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @op_with_region_args
|
|
|
|
func @op_with_region_args() {
|
|
|
|
// CHECK: "test.polyfor"() ( {
|
|
|
|
// CHECK-NEXT: ^bb{{.*}}(%{{.*}}: index, %{{.*}}: index, %{{.*}}: index):
|
|
|
|
test.polyfor %i, %j, %k {
|
|
|
|
"foo"() : () -> ()
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test allowing different name scopes for regions isolated from above.
|
|
|
|
|
|
|
|
// CHECK-LABEL: func @op_with_passthrough_region_args
|
|
|
|
func @op_with_passthrough_region_args() {
|
|
|
|
// CHECK: [[VAL:%.*]] = constant
|
|
|
|
%0 = constant 10 : index
|
2019-08-24 01:35:24 +08:00
|
|
|
|
|
|
|
// CHECK: test.isolated_region [[VAL]] {
|
|
|
|
// CHECK-NEXT: "foo.consumer"([[VAL]]) : (index)
|
|
|
|
// CHECK-NEXT: }
|
2019-08-20 06:26:43 +08:00
|
|
|
test.isolated_region %0 {
|
|
|
|
"foo.consumer"(%0) : (index) -> ()
|
|
|
|
}
|
2019-08-24 01:35:24 +08:00
|
|
|
|
|
|
|
// CHECK: [[VAL:%.*]]:2 = "foo.op"
|
|
|
|
%result:2 = "foo.op"() : () -> (index, index)
|
|
|
|
|
|
|
|
// CHECK: test.isolated_region [[VAL]]#1 {
|
|
|
|
// CHECK-NEXT: "foo.consumer"([[VAL]]#1) : (index)
|
|
|
|
// CHECK-NEXT: }
|
|
|
|
test.isolated_region %result#1 {
|
|
|
|
"foo.consumer"(%result#1) : (index) -> ()
|
|
|
|
}
|
|
|
|
|
2019-08-20 06:26:43 +08:00
|
|
|
return
|
|
|
|
}
|
2019-08-24 01:35:24 +08:00
|
|
|
|
2019-08-29 04:55:11 +08:00
|
|
|
// CHECK-LABEL: func @ptr_to_function() -> !unreg.ptr<() -> ()>
|
|
|
|
func @ptr_to_function() -> !unreg.ptr<() -> ()>
|
2019-09-04 02:27:00 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @escaped_string_char(i1 {foo.value = "\0A"})
|
|
|
|
func @escaped_string_char(i1 {foo.value = "\n"})
|
2019-09-18 08:54:54 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @wrapped_keyword_test
|
|
|
|
func @wrapped_keyword_test() {
|
|
|
|
// CHECK: test.wrapped_keyword foo.keyword
|
|
|
|
test.wrapped_keyword foo.keyword
|
|
|
|
return
|
|
|
|
}
|
2019-10-09 08:44:39 +08:00
|
|
|
|
|
|
|
// CHECK-LABEL: func @"\22_string_symbol_reference\22"
|
|
|
|
func @"\"_string_symbol_reference\""() {
|
|
|
|
// CHECK: ref = @"\22_string_symbol_reference\22"
|
|
|
|
"foo.symbol_reference"() {ref = @"\"_string_symbol_reference\""} : () -> ()
|
|
|
|
return
|
|
|
|
}
|