[Mlir-commits] [mlir] 7d29933 - [mlir][arith] Add integration tests for addi emulation
Jakub Kuderski
llvmlistbot at llvm.org
Tue Sep 20 15:55:08 PDT 2022
Author: Jakub Kuderski
Date: 2022-09-20T18:54:53-04:00
New Revision: 7d299333cbce18c37fdef94569720cf5c61c760a
URL: https://github.com/llvm/llvm-project/commit/7d299333cbce18c37fdef94569720cf5c61c760a
DIFF: https://github.com/llvm/llvm-project/commit/7d299333cbce18c37fdef94569720cf5c61c760a.diff
LOG: [mlir][arith] Add integration tests for addi emulation
This includes tests with the exact expected values and comparison-based tests.
Reviewed By: antiagainst
Differential Revision: https://reviews.llvm.org/D134321
Added:
mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-addi-i16.mlir
Modified:
mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-compare-results-i16.mlir
Removed:
################################################################################
diff --git a/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-addi-i16.mlir b/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-addi-i16.mlir
new file mode 100644
index 0000000000000..96a54696adf49
--- /dev/null
+++ b/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-addi-i16.mlir
@@ -0,0 +1,85 @@
+// Check that the wide integer addition emulation produces the same result as
+// wide addition. Emulate i16 ops with i8 ops.
+
+// RUN: mlir-opt %s --convert-scf-to-cf --convert-cf-to-llvm --convert-vector-to-llvm \
+// RUN: --convert-func-to-llvm --convert-arith-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: --shared-libs=%mlir_lib_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s --match-full-lines
+
+// RUN: mlir-opt %s --test-arith-emulate-wide-int="widest-int-supported=8" \
+// RUN: --convert-scf-to-cf --convert-cf-to-llvm --convert-vector-to-llvm \
+// RUN: --convert-func-to-llvm --convert-arith-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: --shared-libs=%mlir_lib_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s --match-full-lines
+
+// Ops in this function *only* will be emulated using i8 types.
+func.func @emulate_addi(%lhs : i16, %rhs : i16) -> (i16) {
+ %res = arith.addi %lhs, %rhs : i16
+ return %res : i16
+}
+
+func.func @check_addi(%lhs : i16, %rhs : i16) -> () {
+ %res = func.call @emulate_addi(%lhs, %rhs) : (i16, i16) -> (i16)
+ vector.print %res : i16
+ return
+}
+
+func.func @entry() {
+ %cst0 = arith.constant 0 : i16
+ %cst1 = arith.constant 1 : i16
+ %cst_1 = arith.constant -1 : i16
+ %cst_3 = arith.constant -3 : i16
+
+ %cst13 = arith.constant 13 : i16
+ %cst37 = arith.constant 37 : i16
+ %cst42 = arith.constant 42 : i16
+
+ %cst256 = arith.constant 256 : i16
+ %cst_i16_max = arith.constant 32767 : i16
+ %cst_i16_min = arith.constant -32768 : i16
+
+ // CHECK: 0
+ func.call @check_addi(%cst0, %cst0) : (i16, i16) -> ()
+ // CHECK-NEXT: 1
+ func.call @check_addi(%cst0, %cst1) : (i16, i16) -> ()
+ // CHECK-NEXT: 2
+ func.call @check_addi(%cst1, %cst1) : (i16, i16) -> ()
+ // CHECK-NEXT: 0
+ func.call @check_addi(%cst1, %cst_1) : (i16, i16) -> ()
+ // CHECK-NEXT: -2
+ func.call @check_addi(%cst_1, %cst_1) : (i16, i16) -> ()
+ // CHECK-NEXT: -2
+ func.call @check_addi(%cst1, %cst_3) : (i16, i16) -> ()
+
+ // CHECK-NEXT: 26
+ func.call @check_addi(%cst13, %cst13) : (i16, i16) -> ()
+ // CHECK-NEXT: 50
+ func.call @check_addi(%cst13, %cst37) : (i16, i16) -> ()
+ // CHECK-NEXT: 79
+ func.call @check_addi(%cst37, %cst42) : (i16, i16) -> ()
+
+ // CHECK-NEXT: 255
+ func.call @check_addi(%cst_1, %cst256) : (i16, i16) -> ()
+ // CHECK-NEXT: 269
+ func.call @check_addi(%cst256, %cst13) : (i16, i16) -> ()
+ // CHECK-NEXT: 293
+ func.call @check_addi(%cst256, %cst37) : (i16, i16) -> ()
+ // CHECK-NEXT: 253
+ func.call @check_addi(%cst256, %cst_3) : (i16, i16) -> ()
+
+ // CHECK-NEXT: -32756
+ func.call @check_addi(%cst13, %cst_i16_max) : (i16, i16) -> ()
+ // CHECK-NEXT: -32731
+ func.call @check_addi(%cst_i16_min, %cst37) : (i16, i16) -> ()
+
+ // CHECK-NEXT: -2
+ func.call @check_addi(%cst_i16_max, %cst_i16_max) : (i16, i16) -> ()
+ // CHECK-NEXT: -32755
+ func.call @check_addi(%cst_i16_min, %cst13) : (i16, i16) -> ()
+ // CHECK-NEXT: 0
+ func.call @check_addi(%cst_i16_min, %cst_i16_min) : (i16, i16) -> ()
+
+ return
+}
diff --git a/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-compare-results-i16.mlir b/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-compare-results-i16.mlir
index 2b1afb3cad9e4..6ca279037d5f0 100644
--- a/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-compare-results-i16.mlir
+++ b/mlir/test/Integration/Dialect/Arithmetic/CPU/test-wide-int-emulation-compare-results-i16.mlir
@@ -62,6 +62,53 @@ func.func @xhash(%i : i16) -> (i16) {
return %res : i16
}
+//===----------------------------------------------------------------------===//
+// Test arith.addi
+//===----------------------------------------------------------------------===//
+
+// Ops in this function will be emulated using i8 ops.
+func.func @emulate_addi(%lhs : i16, %rhs : i16) -> (i16) {
+ %res = arith.addi %lhs, %rhs : i16
+ return %res : i16
+}
+
+// Performs both wide and emulated `arith.muli`, and checks that the results
+// match.
+func.func @check_addi(%lhs : i16, %rhs : i16) -> () {
+ %wide = arith.addi %lhs, %rhs : i16
+ %emulated = func.call @emulate_addi(%lhs, %rhs) : (i16, i16) -> (i16)
+ func.call @check_results(%lhs, %rhs, %wide, %emulated) : (i16, i16, i16, i16) -> ()
+ return
+}
+
+// Checks that `arith.addi` is emulated properly by sampling the input space.
+// In total, this test function checks 500 * 500 = 250k input pairs.
+func.func @test_addi() -> () {
+ %idx0 = arith.constant 0 : index
+ %idx1 = arith.constant 1 : index
+ %idx500 = arith.constant 500 : index
+
+ %cst0 = arith.constant 0 : i16
+ %cst1 = arith.constant 1 : i16
+
+ scf.for %lhs_idx = %idx0 to %idx500 step %idx1 iter_args(%lhs = %cst0) -> (i16) {
+ %arg_lhs = func.call @xhash(%lhs) : (i16) -> (i16)
+
+ scf.for %rhs_idx = %idx0 to %idx500 step %idx1 iter_args(%rhs = %cst0) -> (i16) {
+ %arg_rhs = func.call @xhash(%rhs) : (i16) -> (i16)
+ func.call @check_addi(%arg_lhs, %arg_rhs) : (i16, i16) -> ()
+
+ %rhs_next = arith.addi %rhs, %cst1 : i16
+ scf.yield %rhs_next : i16
+ }
+
+ %lhs_next = arith.addi %lhs, %cst1 : i16
+ scf.yield %lhs_next : i16
+ }
+
+ return
+}
+
//===----------------------------------------------------------------------===//
// Test arith.muli
//===----------------------------------------------------------------------===//
@@ -161,6 +208,7 @@ func.func @test_shrui() -> () {
//===----------------------------------------------------------------------===//
func.func @entry() {
+ func.call @test_addi() : () -> ()
func.call @test_muli() : () -> ()
func.call @test_shrui() : () -> ()
return
More information about the Mlir-commits
mailing list