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