From 29c7929b13b6e47e3d498b8d82186183471b82f2 Mon Sep 17 00:00:00 2001 From: Alex Zinenko Date: Wed, 22 May 2019 12:13:54 -0700 Subject: [PATCH] Make EDSC builder test more robust to the order of evaluation EDSC builder test uses FileCheck to match the IR produced by EDSC in the textual order. For mathematical operations, EDSC relies on overloaded operators. Since they are essentially function calls, the order of evaluation of their operands is unspecified and differs between compilers. Do not rely on a specific order of operands and just check they are all emitted before the last operation. Give names to matched SSA values in order to make sure the right operands are used in relevant places. -- PiperOrigin-RevId: 249494995 --- mlir/test/CMakeLists.txt | 1 + mlir/test/EDSC/CMakeLists.txt | 2 ++ mlir/test/EDSC/builder-api-test.cpp | 66 ++++++++++++++++++------------------- mlir/test/EDSC/lit.local.cfg | 1 + 4 files changed, 37 insertions(+), 33 deletions(-) create mode 100644 mlir/test/EDSC/lit.local.cfg diff --git a/mlir/test/CMakeLists.txt b/mlir/test/CMakeLists.txt index 03c486c..edd9387 100644 --- a/mlir/test/CMakeLists.txt +++ b/mlir/test/CMakeLists.txt @@ -27,6 +27,7 @@ set(MLIR_TEST_DEPENDS FileCheck count not MLIRUnitTests mlir-cpu-runner + mlir-edsc-builder-api-test mlir-opt mlir-sdbm-api-test mlir-tblgen diff --git a/mlir/test/EDSC/CMakeLists.txt b/mlir/test/EDSC/CMakeLists.txt index 67377a9..01fc5ec 100644 --- a/mlir/test/EDSC/CMakeLists.txt +++ b/mlir/test/EDSC/CMakeLists.txt @@ -14,6 +14,8 @@ target_link_libraries(mlir-edsc-builder-api-test LLVMSupport ) +target_include_directories(mlir-edsc-builder-api-test PRIVATE ..) + whole_archive_link(mlir-edsc-builder-api-test MLIRAffineOps MLIRStandardOps diff --git a/mlir/test/EDSC/builder-api-test.cpp b/mlir/test/EDSC/builder-api-test.cpp index 6a8e5d5..55c4574 100644 --- a/mlir/test/EDSC/builder-api-test.cpp +++ b/mlir/test/EDSC/builder-api-test.cpp @@ -83,24 +83,24 @@ TEST_FUNC(builder_dynamic_for_func_args) { // clang-format off // CHECK-LABEL: func @builder_dynamic_for_func_args(%arg0: index, %arg1: index) { - // CHECK: affine.for %i0 = (d0) -> (d0)(%arg0) to (d0) -> (d0)(%arg1) step 3 { - // CHECK: {{.*}} = affine.apply ()[s0] -> (s0 * 3)()[%arg0] - // CHECK: {{.*}} = affine.apply ()[s0, s1] -> (s1 + s0 * 3)()[%arg0, %arg1] - // CHECK: {{.*}} = affine.apply ()[s0] -> (s0 + 3)()[%arg0] - // CHECK: affine.for %i1 = (d0) -> (d0)(%arg0) to (d0) -> (d0)(%arg1) step 2 { - // CHECK: {{.*}} = affine.apply (d0, d1) -> ((d0 + d1 * 3) floordiv 32)(%i0, %i1) - // CHECK: {{.*}} = affine.apply (d0, d1) -> (((d0 + d1 * 3) floordiv 32) * 31)(%i0, %i1) - // CHECK: {{.*}} = affine.apply (d0, d1) -> ((((d0 + d1 * 3) floordiv 32) * 31) ceildiv 32)(%i0, %i1) - // CHECK: [[rf1:%[0-9]+]] = addf {{.*}}, {{.*}} : f32 - // CHECK: [[rf2:%[0-9]+]] = divf [[rf1]], {{.*}} : f32 - // CHECK: [[rf3:%[0-9]+]] = remf [[rf2]], {{.*}} : f32 - // CHECK: [[rf4:%[0-9]+]] = mulf {{.*}}, {{.*}} : f32 - // CHECK: {{.*}} = subf [[rf3]], [[rf4]] : f32 - // CHECK: [[ri1:%[0-9]+]] = addi {{.*}}, {{.*}} : i32 - // CHECK: [[ri2:%[0-9]+]] = divis [[ri1]], {{.*}} : i32 - // CHECK: [[ri3:%[0-9]+]] = remis [[ri2]], {{.*}} : i32 - // CHECK: [[ri4:%[0-9]+]] = muli {{.*}}, {{.*}} : i32 - // CHECK: {{.*}} = subi [[ri3]], [[ri4]] : i32 + // CHECK: affine.for %i0 = (d0) -> (d0)(%arg0) to (d0) -> (d0)(%arg1) step 3 { + // CHECK: {{.*}} = affine.apply ()[s0] -> (s0 * 3)()[%arg0] + // CHECK: {{.*}} = affine.apply ()[s0, s1] -> (s1 + s0 * 3)()[%arg0, %arg1] + // CHECK: {{.*}} = affine.apply ()[s0] -> (s0 + 3)()[%arg0] + // CHECK: affine.for %i1 = (d0) -> (d0)(%arg0) to (d0) -> (d0)(%arg1) step 2 { + // CHECK: {{.*}} = affine.apply (d0, d1) -> ((d0 + d1 * 3) floordiv 32)(%i0, %i1) + // CHECK: {{.*}} = affine.apply (d0, d1) -> (((d0 + d1 * 3) floordiv 32) * 31)(%i0, %i1) + // CHECK: {{.*}} = affine.apply (d0, d1) -> ((((d0 + d1 * 3) floordiv 32) * 31) ceildiv 32)(%i0, %i1) + // CHECK-DAG: [[rf1:%[0-9]+]] = addf {{.*}}, {{.*}} : f32 + // CHECK-DAG: [[rf2:%[0-9]+]] = divf [[rf1]], {{.*}} : f32 + // CHECK-DAG: [[rf3:%[0-9]+]] = remf [[rf2]], {{.*}} : f32 + // CHECK-DAG: [[rf4:%[0-9]+]] = mulf {{.*}}, {{.*}} : f32 + // CHECK: {{.*}} = subf [[rf3]], [[rf4]] : f32 + // CHECK-DAG: [[ri1:%[0-9]+]] = addi {{.*}}, {{.*}} : i32 + // CHECK-DAG: [[ri2:%[0-9]+]] = divis [[ri1]], {{.*}} : i32 + // CHECK-DAG: [[ri3:%[0-9]+]] = remis [[ri2]], {{.*}} : i32 + // CHECK-DAG: [[ri4:%[0-9]+]] = muli {{.*}}, {{.*}} : i32 + // CHECK: {{.*}} = subi [[ri3]], [[ri4]] : i32 // clang-format on f->print(llvm::outs()); } @@ -121,9 +121,9 @@ TEST_FUNC(builder_dynamic_for) { // clang-format off // CHECK-LABEL: func @builder_dynamic_for(%arg0: index, %arg1: index, %arg2: index, %arg3: index) { - // CHECK: %0 = affine.apply ()[s0, s1] -> (s0 - s1)()[%arg0, %arg1] - // CHECK-NEXT: %1 = affine.apply ()[s0, s1] -> (s0 + s1)()[%arg2, %arg3] - // CHECK-NEXT: affine.for %i0 = (d0) -> (d0)(%0) to (d0) -> (d0)(%1) step 2 { + // CHECK-DAG: [[r0:%[0-9]+]] = affine.apply ()[s0, s1] -> (s0 - s1)()[%arg0, %arg1] + // CHECK-DAG: [[r1:%[0-9]+]] = affine.apply ()[s0, s1] -> (s0 + s1)()[%arg2, %arg3] + // CHECK-NEXT: affine.for %i0 = (d0) -> (d0)([[r0]]) to (d0) -> (d0)([[r1]]) step 2 { // clang-format on f->print(llvm::outs()); } @@ -349,18 +349,18 @@ TEST_FUNC(builder_helpers) { // CHECK: affine.for %i0 = (d0) -> (d0)({{.*}}) to (d0) -> (d0)({{.*}}) { // CHECK-NEXT: affine.for %i1 = (d0) -> (d0)({{.*}}) to (d0) -> (d0)({{.*}}) { // CHECK-NEXT: affine.for %i2 = (d0) -> (d0)({{.*}}) to (d0) -> (d0)({{.*}}) { - // CHECK-NEXT: [[a:%.*]] = load %arg0[%i0, %i1, %i2] : memref - // CHECK-NEXT: [[b:%.*]] = addf {{.*}}, [[a]] : f32 - // CHECK-NEXT: [[c:%.*]] = load %arg1[%i0, %i1, %i2] : memref - // CHECK-NEXT: [[d:%.*]] = addf [[b]], [[c]] : f32 + // CHECK-DAG: [[a:%.*]] = load %arg0[%i0, %i1, %i2] : memref + // CHECK-DAG: [[b:%.*]] = addf {{.*}}, [[a]] : f32 + // CHECK-DAG: [[c:%.*]] = load %arg1[%i0, %i1, %i2] : memref + // CHECK-DAG: [[d:%.*]] = addf [[b]], [[c]] : f32 // CHECK-NEXT: store [[d]], %arg2[%i0, %i1, %i2] : memref // CHECK-NEXT: } // CHECK-NEXT: affine.for %i3 = (d0) -> (d0)(%c0_1) to (d0) -> (d0)(%2) { - // CHECK-NEXT: [[a:%.*]] = load %arg1[%i0, %i1, %i3] : memref - // CHECK-NEXT: [[b:%.*]] = load %arg0[%i0, %i1, %i3] : memref - // CHECK-NEXT: [[c:%.*]] = addf [[b]], [[a]] : f32 - // CHECK-NEXT: [[d:%.*]] = load %arg2[%i0, %i1, %i3] : memref - // CHECK-NEXT: [[e:%.*]] = addf [[d]], [[c]] : f32 + // CHECK-DAG: [[a:%.*]] = load %arg1[%i0, %i1, %i3] : memref + // CHECK-DAG: [[b:%.*]] = load %arg0[%i0, %i1, %i3] : memref + // CHECK-DAG: [[c:%.*]] = addf [[b]], [[a]] : f32 + // CHECK-DAG: [[d:%.*]] = load %arg2[%i0, %i1, %i3] : memref + // CHECK-DAG: [[e:%.*]] = addf [[d]], [[c]] : f32 // CHECK-NEXT: store [[e]], %arg2[%i0, %i1, %i3] : memref // clang-format on f->print(llvm::outs()); @@ -456,9 +456,9 @@ TEST_FUNC(select_op) { // CHECK-LABEL: @select_op // CHECK: affine.for %i0 = 0 to 1 { // CHECK-NEXT: affine.for %i1 = 0 to 1 { - // CHECK-NEXT: {{.*}} = cmpi "eq" - // CHECK-NEXT: {{.*}} = load - // CHECK-NEXT: {{.*}} = load + // CHECK-DAG: {{.*}} = cmpi "eq" + // CHECK-DAG: {{.*}} = load + // CHECK-DAG: {{.*}} = load // CHECK-NEXT: {{.*}} = select // clang-format on f->print(llvm::outs()); diff --git a/mlir/test/EDSC/lit.local.cfg b/mlir/test/EDSC/lit.local.cfg new file mode 100644 index 0000000..8126155 --- /dev/null +++ b/mlir/test/EDSC/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes.add('.cpp') -- 2.7.4