[mlir] [integration-test] [LLVMIR] Add reduction intrinsic tests
authoraartbik <ajcbik@google.com>
Thu, 18 Jun 2020 19:55:54 +0000 (12:55 -0700)
committeraartbik <ajcbik@google.com>
Thu, 18 Jun 2020 20:44:46 +0000 (13:44 -0700)
Reviewers: ftynse, nicolasvasilache, reidtatge

Reviewed By: nicolasvasilache

Subscribers: mehdi_amini, rriddle, jpienaar, shauheen, antiagainst, nicolasvasilache, arpith-jacob, mgester, lucyrfox, liufengdb, stephenneuendorffer, Joonsoo, grosul1, Kayjukh, jurahul, msifontes

Tags: #mlir

Differential Revision: https://reviews.llvm.org/D82117

mlir/integration_test/Dialect/LLVMIR/CPU/lit.local.cfg [new file with mode: 0644]
mlir/integration_test/Dialect/LLVMIR/CPU/test-vector-reductions-fp.mlir [new file with mode: 0644]
mlir/integration_test/Dialect/LLVMIR/CPU/test-vector-reductions-int.mlir [new file with mode: 0644]

diff --git a/mlir/integration_test/Dialect/LLVMIR/CPU/lit.local.cfg b/mlir/integration_test/Dialect/LLVMIR/CPU/lit.local.cfg
new file mode 100644 (file)
index 0000000..83247d7
--- /dev/null
@@ -0,0 +1,5 @@
+import sys
+
+# No JIT on win32.
+if sys.platform == 'win32':
+    config.unsupported = True
diff --git a/mlir/integration_test/Dialect/LLVMIR/CPU/test-vector-reductions-fp.mlir b/mlir/integration_test/Dialect/LLVMIR/CPU/test-vector-reductions-fp.mlir
new file mode 100644 (file)
index 0000000..f8be3a6
--- /dev/null
@@ -0,0 +1,65 @@
+// RUN: mlir-cpu-runner %s -e entry -entry-point-result=void  \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+// End-to-end test of all fp reduction intrinsics (not exhaustive unit tests).
+module {
+  llvm.func @print_newline()
+  llvm.func @print_f32(!llvm.float)
+  llvm.func @entry() {
+    // Setup (1,2,3,4).
+    %0 = llvm.mlir.constant(1.000000e+00 : f32) : !llvm.float
+    %1 = llvm.mlir.constant(2.000000e+00 : f32) : !llvm.float
+    %2 = llvm.mlir.constant(3.000000e+00 : f32) : !llvm.float
+    %3 = llvm.mlir.constant(4.000000e+00 : f32) : !llvm.float
+    %4 = llvm.mlir.undef : !llvm<"<4 x float>">
+    %5 = llvm.mlir.constant(0 : index) : !llvm.i64
+    %6 = llvm.insertelement %0, %4[%5 : !llvm.i64] : !llvm<"<4 x float>">
+    %7 = llvm.shufflevector %6, %4 [0 : i32, 0 : i32, 0 : i32, 0 : i32]
+        : !llvm<"<4 x float>">, !llvm<"<4 x float>">
+    %8 = llvm.mlir.constant(1 : i64) : !llvm.i64
+    %9 = llvm.insertelement %1, %7[%8 : !llvm.i64] : !llvm<"<4 x float>">
+    %10 = llvm.mlir.constant(2 : i64) : !llvm.i64
+    %11 = llvm.insertelement %2, %9[%10 : !llvm.i64] : !llvm<"<4 x float>">
+    %12 = llvm.mlir.constant(3 : i64) : !llvm.i64
+    %v = llvm.insertelement %3, %11[%12 : !llvm.i64] : !llvm<"<4 x float>">
+
+    %max = "llvm.intr.experimental.vector.reduce.fmax"(%v)
+        : (!llvm<"<4 x float>">) -> !llvm.float
+    llvm.call @print_f32(%max) : (!llvm.float) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 4
+
+    %min = "llvm.intr.experimental.vector.reduce.fmin"(%v)
+        : (!llvm<"<4 x float>">) -> !llvm.float
+    llvm.call @print_f32(%min) : (!llvm.float) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 1
+
+    %add1 = "llvm.intr.experimental.vector.reduce.v2.fadd"(%0, %v)
+        : (!llvm.float, !llvm<"<4 x float>">) -> !llvm.float
+    llvm.call @print_f32(%add1) : (!llvm.float) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 11
+
+    %add2 = "llvm.intr.experimental.vector.reduce.v2.fadd"(%1, %v)
+        : (!llvm.float, !llvm<"<4 x float>">) -> !llvm.float
+    llvm.call @print_f32(%add2) : (!llvm.float) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 12
+
+    %mul1 = "llvm.intr.experimental.vector.reduce.v2.fmul"(%0, %v)
+        : (!llvm.float, !llvm<"<4 x float>">) -> !llvm.float
+    llvm.call @print_f32(%mul1) : (!llvm.float) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 24
+
+    %mul2 = "llvm.intr.experimental.vector.reduce.v2.fmul"(%1, %v)
+        : (!llvm.float, !llvm<"<4 x float>">) -> !llvm.float
+    llvm.call @print_f32(%mul2) : (!llvm.float) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 48
+
+    llvm.return
+  }
+}
diff --git a/mlir/integration_test/Dialect/LLVMIR/CPU/test-vector-reductions-int.mlir b/mlir/integration_test/Dialect/LLVMIR/CPU/test-vector-reductions-int.mlir
new file mode 100644 (file)
index 0000000..3fa556c
--- /dev/null
@@ -0,0 +1,83 @@
+// RUN: mlir-cpu-runner %s -e entry -entry-point-result=void  \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+// End-to-end test of all int reduction intrinsics (not exhaustive unit tests).
+module {
+  llvm.func @print_newline()
+  llvm.func @print_i32(!llvm.i32)
+  llvm.func @entry() {
+    // Setup (1,2,3,4).
+    %0 = llvm.mlir.constant(1 : i32) : !llvm.i32
+    %1 = llvm.mlir.constant(2 : i32) : !llvm.i32
+    %2 = llvm.mlir.constant(3 : i32) : !llvm.i32
+    %3 = llvm.mlir.constant(4 : i32) : !llvm.i32
+    %4 = llvm.mlir.undef : !llvm<"<4 x i32>">
+    %5 = llvm.mlir.constant(0 : index) : !llvm.i64
+    %6 = llvm.insertelement %0, %4[%5 : !llvm.i64] : !llvm<"<4 x i32>">
+    %7 = llvm.shufflevector %6, %4 [0 : i32, 0 : i32, 0 : i32, 0 : i32]
+        : !llvm<"<4 x i32>">, !llvm<"<4 x i32>">
+    %8 = llvm.mlir.constant(1 : i64) : !llvm.i64
+    %9 = llvm.insertelement %1, %7[%8 : !llvm.i64] : !llvm<"<4 x i32>">
+    %10 = llvm.mlir.constant(2 : i64) : !llvm.i64
+    %11 = llvm.insertelement %2, %9[%10 : !llvm.i64] : !llvm<"<4 x i32>">
+    %12 = llvm.mlir.constant(3 : i64) : !llvm.i64
+    %v = llvm.insertelement %3, %11[%12 : !llvm.i64] : !llvm<"<4 x i32>">
+
+    %add = "llvm.intr.experimental.vector.reduce.add"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%add) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 10
+
+    %and = "llvm.intr.experimental.vector.reduce.and"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%and) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 0
+
+    %mul = "llvm.intr.experimental.vector.reduce.mul"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%mul) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 24
+
+    %or = "llvm.intr.experimental.vector.reduce.or"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%or) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 7
+
+    %smax = "llvm.intr.experimental.vector.reduce.smax"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%smax) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 4
+
+    %smin = "llvm.intr.experimental.vector.reduce.smin"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%smin) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 1
+
+    %umax = "llvm.intr.experimental.vector.reduce.umax"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%umax) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 4
+
+    %umin = "llvm.intr.experimental.vector.reduce.umin"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%umin) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 1
+
+    %xor = "llvm.intr.experimental.vector.reduce.xor"(%v)
+        : (!llvm<"<4 x i32>">) -> !llvm.i32
+    llvm.call @print_i32(%xor) : (!llvm.i32) -> ()
+    llvm.call @print_newline() : () -> ()
+    // CHECK: 4
+
+    llvm.return
+  }
+}