xref: /llvm-project/mlir/test/Dialect/Arith/value-bounds-op-interface-impl.mlir (revision 0aa831e0edb1c1deabb96ce2435667cc82bac79b)
1*0aa831e0SKrzysztof Drewniak// RUN: mlir-opt %s -pass-pipeline='builtin.module(func.func(test-affine-reify-value-bounds))' -verify-diagnostics \
2d8804ecdSMatthias Springer// RUN:     -verify-diagnostics -split-input-file | FileCheck %s
33fecf9a5SMatthias Springer
4*0aa831e0SKrzysztof Drewniak// RUN: mlir-opt %s -pass-pipeline='builtin.module(func.func(test-affine-reify-value-bounds{use-arith-ops}))' \
5d5b63124SMatthias Springer// RUN:     -verify-diagnostics -split-input-file | \
6d5b63124SMatthias Springer// RUN: FileCheck %s --check-prefix=CHECK-ARITH
7d5b63124SMatthias Springer
83fecf9a5SMatthias Springer// CHECK: #[[$map:.*]] = affine_map<()[s0] -> (s0 + 5)>
93fecf9a5SMatthias Springer// CHECK-LABEL: func @arith_addi(
103fecf9a5SMatthias Springer//  CHECK-SAME:     %[[a:.*]]: index
113fecf9a5SMatthias Springer//       CHECK:   %[[apply:.*]] = affine.apply #[[$map]]()[%[[a]]]
123fecf9a5SMatthias Springer//       CHECK:   return %[[apply]]
13d5b63124SMatthias Springer
14d5b63124SMatthias Springer// CHECK-ARITH-LABEL: func @arith_addi(
15d5b63124SMatthias Springer//  CHECK-ARITH-SAME:     %[[a:.*]]: index
16d5b63124SMatthias Springer//       CHECK-ARITH:   %[[c5:.*]] = arith.constant 5 : index
17d5b63124SMatthias Springer//       CHECK-ARITH:   %[[add:.*]] = arith.addi %[[c5]], %[[a]]
18d5b63124SMatthias Springer//       CHECK-ARITH:   %[[c5:.*]] = arith.constant 5 : index
19d5b63124SMatthias Springer//       CHECK-ARITH:   %[[add:.*]] = arith.addi %[[a]], %[[c5]]
20d5b63124SMatthias Springer//       CHECK-ARITH:   return %[[add]]
213fecf9a5SMatthias Springerfunc.func @arith_addi(%a: index) -> index {
223fecf9a5SMatthias Springer  %0 = arith.constant 5 : index
233fecf9a5SMatthias Springer  %1 = arith.addi %0, %a : index
243fecf9a5SMatthias Springer  %2 = "test.reify_bound"(%1) : (index) -> (index)
253fecf9a5SMatthias Springer  return %2 : index
263fecf9a5SMatthias Springer}
273fecf9a5SMatthias Springer
283fecf9a5SMatthias Springer// -----
293fecf9a5SMatthias Springer
303fecf9a5SMatthias Springer// CHECK: #[[$map:.*]] = affine_map<()[s0] -> (-s0 + 5)>
313fecf9a5SMatthias Springer// CHECK-LABEL: func @arith_subi(
323fecf9a5SMatthias Springer//  CHECK-SAME:     %[[a:.*]]: index
333fecf9a5SMatthias Springer//       CHECK:   %[[apply:.*]] = affine.apply #[[$map]]()[%[[a]]]
343fecf9a5SMatthias Springer//       CHECK:   return %[[apply]]
353fecf9a5SMatthias Springerfunc.func @arith_subi(%a: index) -> index {
363fecf9a5SMatthias Springer  %0 = arith.constant 5 : index
373fecf9a5SMatthias Springer  %1 = arith.subi %0, %a : index
383fecf9a5SMatthias Springer  %2 = "test.reify_bound"(%1) : (index) -> (index)
393fecf9a5SMatthias Springer  return %2 : index
403fecf9a5SMatthias Springer}
413fecf9a5SMatthias Springer
423fecf9a5SMatthias Springer// -----
433fecf9a5SMatthias Springer
443fecf9a5SMatthias Springer// CHECK: #[[$map:.*]] = affine_map<()[s0] -> (s0 * 5)>
453fecf9a5SMatthias Springer// CHECK-LABEL: func @arith_muli(
463fecf9a5SMatthias Springer//  CHECK-SAME:     %[[a:.*]]: index
473fecf9a5SMatthias Springer//       CHECK:   %[[apply:.*]] = affine.apply #[[$map]]()[%[[a]]]
483fecf9a5SMatthias Springer//       CHECK:   return %[[apply]]
493fecf9a5SMatthias Springerfunc.func @arith_muli(%a: index) -> index {
503fecf9a5SMatthias Springer  %0 = arith.constant 5 : index
513fecf9a5SMatthias Springer  %1 = arith.muli %0, %a : index
523fecf9a5SMatthias Springer  %2 = "test.reify_bound"(%1) : (index) -> (index)
533fecf9a5SMatthias Springer  return %2 : index
543fecf9a5SMatthias Springer}
553fecf9a5SMatthias Springer
563fecf9a5SMatthias Springer// -----
573fecf9a5SMatthias Springer
58d8804ecdSMatthias Springerfunc.func @arith_muli_non_pure(%a: index, %b: index) -> index {
59d8804ecdSMatthias Springer  %0 = arith.muli %a, %b : index
60d8804ecdSMatthias Springer  // Semi-affine expressions (such as "symbol * symbol") are not supported.
61d8804ecdSMatthias Springer  // expected-error @below{{could not reify bound}}
62d8804ecdSMatthias Springer  %1 = "test.reify_bound"(%0) : (index) -> (index)
63d8804ecdSMatthias Springer  return %1 : index
64d8804ecdSMatthias Springer}
65d8804ecdSMatthias Springer
66d8804ecdSMatthias Springer// -----
67d8804ecdSMatthias Springer
683fecf9a5SMatthias Springer// CHECK-LABEL: func @arith_const()
693fecf9a5SMatthias Springer//       CHECK:   %[[c5:.*]] = arith.constant 5 : index
703fecf9a5SMatthias Springer//       CHECK:   %[[c5:.*]] = arith.constant 5 : index
713fecf9a5SMatthias Springer//       CHECK:   return %[[c5]]
723fecf9a5SMatthias Springerfunc.func @arith_const() -> index {
733fecf9a5SMatthias Springer  %c5 = arith.constant 5 : index
743fecf9a5SMatthias Springer  %0 = "test.reify_bound"(%c5) : (index) -> (index)
753fecf9a5SMatthias Springer  return %0 : index
763fecf9a5SMatthias Springer}
77c459a366SMatthias Springer
78c459a366SMatthias Springer// -----
79c459a366SMatthias Springer
80c459a366SMatthias Springer// CHECK-LABEL: func @arith_select(
81c459a366SMatthias Springerfunc.func @arith_select(%c: i1) -> (index, index) {
82c459a366SMatthias Springer  // CHECK: arith.constant 5 : index
83c459a366SMatthias Springer  %c5 = arith.constant 5 : index
84c459a366SMatthias Springer  // CHECK: arith.constant 9 : index
85c459a366SMatthias Springer  %c9 = arith.constant 9 : index
86c459a366SMatthias Springer  %r = arith.select %c, %c5, %c9 : index
87c459a366SMatthias Springer  // CHECK: %[[c5:.*]] = arith.constant 5 : index
88c459a366SMatthias Springer  // CHECK: %[[c10:.*]] = arith.constant 10 : index
89c459a366SMatthias Springer  %0 = "test.reify_bound"(%r) {type = "LB"} : (index) -> (index)
90c459a366SMatthias Springer  %1 = "test.reify_bound"(%r) {type = "UB"} : (index) -> (index)
91c459a366SMatthias Springer  // CHECK: return %[[c5]], %[[c10]]
92c459a366SMatthias Springer  return %0, %1 : index, index
93c459a366SMatthias Springer}
94c459a366SMatthias Springer
95c459a366SMatthias Springer// -----
96c459a366SMatthias Springer
97c459a366SMatthias Springer// CHECK-LABEL: func @arith_select_elementwise(
98c459a366SMatthias Springer//  CHECK-SAME:     %[[a:.*]]: tensor<?xf32>, %[[b:.*]]: tensor<?xf32>, %[[c:.*]]: tensor<?xi1>)
99c459a366SMatthias Springerfunc.func @arith_select_elementwise(%a: tensor<?xf32>, %b: tensor<?xf32>, %c: tensor<?xi1>) -> index {
100c459a366SMatthias Springer  %r = arith.select %c, %a, %b : tensor<?xi1>, tensor<?xf32>
101c459a366SMatthias Springer  // CHECK: %[[c0:.*]] = arith.constant 0 : index
102c459a366SMatthias Springer  // CHECK: %[[dim:.*]] = tensor.dim %[[a]], %[[c0]]
103c459a366SMatthias Springer  %0 = "test.reify_bound"(%r) {type = "EQ", dim = 0}
104c459a366SMatthias Springer      : (tensor<?xf32>) -> (index)
105c459a366SMatthias Springer  // CHECK: return %[[dim]]
106c459a366SMatthias Springer  return %0 : index
107c459a366SMatthias Springer}
108