diff options
| author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:39:43 +0900 |
|---|---|---|
| committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:39:43 +0900 |
| commit | c36c84047e92587931e74aea1b3d91342617400b (patch) | |
| tree | 3d25b78796205b1f3f1ee5f9c55da298f6449ce8 /mlir/test/Transforms/loop-invariant-code-motion.mlir | |
| parent | 122393694892e7a718e8c612b5650388075e2833 (diff) | |
| parent | bdcf47e4bcb92889665825654bb80a8bbe30379e (diff) | |
Merge branch 'users/chapuni/cov/single/base' into users/chapuni/cov/single/condopusers/chapuni/cov/single/condop
Conflicts:
clang/lib/CodeGen/CoverageMappingGen.cpp
Diffstat (limited to 'mlir/test/Transforms/loop-invariant-code-motion.mlir')
| -rw-r--r-- | mlir/test/Transforms/loop-invariant-code-motion.mlir | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/mlir/test/Transforms/loop-invariant-code-motion.mlir b/mlir/test/Transforms/loop-invariant-code-motion.mlir index e4c423ce7052..5133c14414c9 100644 --- a/mlir/test/Transforms/loop-invariant-code-motion.mlir +++ b/mlir/test/Transforms/loop-invariant-code-motion.mlir @@ -124,6 +124,64 @@ func.func @invariant_affine_if() { // ----- +func.func @hoist_invariant_affine_if_success(%lb: index, %ub: index, %step: index) -> i32 { + %cst_0 = arith.constant 0 : i32 + %cst_42 = arith.constant 42 : i32 + %sum_result = affine.for %i = %lb to %ub iter_args(%acc = %cst_0) -> i32 { + %conditional_add = affine.if affine_set<() : ()> () -> (i32) { + %add = arith.addi %cst_42, %cst_42 : i32 + affine.yield %add : i32 + } else { + %poison = ub.poison : i32 + affine.yield %poison : i32 + } + %sum = arith.addi %acc, %conditional_add : i32 + affine.yield %sum : i32 + } + + // CHECK-LABEL: hoist_invariant_affine_if_success + // CHECK-NEXT: arith.constant 0 : i32 + // CHECK-NEXT: %[[CST:.*]] = arith.constant 42 : i32 + // CHECK-NEXT: %[[IF:.*]] = affine.if + // CHECK-NEXT: arith.addi %[[CST]], %[[CST]] : i32 + // CHECK: affine.for + // CHECK-NOT: affine.if + // CHECK-NEXT: arith.addi %{{.*}}, %[[IF]] + + return %sum_result : i32 +} + +// ----- + +func.func @hoist_variant_affine_if_failure(%lb: index, %ub: index, %step: index) -> i32 { + %cst_0 = arith.constant 0 : i32 + %cst_42 = arith.constant 42 : i32 + %ind_7 = arith.constant 7 : index + %sum_result = affine.for %i = %lb to %ub iter_args(%acc = %cst_0) -> i32 { + %conditional_add = affine.if affine_set<(d0, d1) : (d1 - d0 >= 0)> (%i, %ind_7) -> (i32) { + %add = arith.addi %cst_42, %cst_42 : i32 + affine.yield %add : i32 + } else { + %poison = ub.poison : i32 + affine.yield %poison : i32 + } + %sum = arith.addi %acc, %conditional_add : i32 + affine.yield %sum : i32 + } + + // CHECK-LABEL: hoist_variant_affine_if_failure + // CHECK-NEXT: arith.constant 0 : i32 + // CHECK-NEXT: %[[CST:.*]] = arith.constant 42 : i32 + // CHECK-NEXT: arith.constant 7 : index + // CHECK-NEXT: affine.for + // CHECK-NEXT: %[[IF:.*]] = affine.if + // CHECK: arith.addi %{{.*}}, %[[IF]] + + return %sum_result : i32 +} + +// ----- + func.func @hoist_affine_for_with_unknown_trip_count(%lb: index, %ub: index) { affine.for %arg0 = 0 to 10 { affine.for %arg1 = %lb to %ub { @@ -383,6 +441,69 @@ func.func @parallel_loop_with_invariant() { // ----- +func.func @hoist_invariant_scf_if_success(%lb: index, %ub: index, %step: index) -> i32 { + %cst_0 = arith.constant 0 : i32 + %cst_42 = arith.constant 42 : i32 + %true = arith.constant true + %sum_result = scf.for %i = %lb to %ub step %step iter_args(%acc = %cst_0) -> i32 { + %conditional_add = scf.if %true -> (i32) { + %add = arith.addi %cst_42, %cst_42 : i32 + scf.yield %add : i32 + } else { + %poison = ub.poison : i32 + scf.yield %poison : i32 + } + %sum = arith.addi %acc, %conditional_add : i32 + scf.yield %sum : i32 + } + + // CHECK-LABEL: hoist_invariant_scf_if_success + // CHECK-NEXT: arith.constant 0 : i32 + // CHECK-NEXT: %[[CST:.*]] = arith.constant 42 : i32 + // CHECK-NEXT: %[[TRUE:.*]] = arith.constant true + // CHECK-NEXT: %[[IF:.*]] = scf.if %[[TRUE]] + // CHECK-NEXT: arith.addi %[[CST]], %[[CST]] : i32 + // CHECK: scf.for + // CHECK-NOT: scf.if + // CHECK-NEXT: arith.addi %{{.*}}, %[[IF]] + + return %sum_result : i32 +} + +// ----- + +func.func @hoist_variant_scf_if_failure(%lb: index, %ub: index, %step: index) -> i32 { + %cst_0 = arith.constant 0 : i32 + %cst_42 = arith.constant 42 : i32 + %ind_7 = arith.constant 7 : index + %sum_result = scf.for %i = %lb to %ub step %step iter_args(%acc = %cst_0) -> i32 { + %cond = arith.cmpi ult, %i, %ind_7 : index + %conditional_add = scf.if %cond -> (i32) { + %add = arith.addi %cst_42, %cst_42 : i32 + scf.yield %add : i32 + } else { + %poison = ub.poison : i32 + scf.yield %poison : i32 + } + %sum = arith.addi %acc, %conditional_add : i32 + scf.yield %sum : i32 + } + + // CHECK-LABEL: hoist_variant_scf_if_failure + // CHECK-NEXT: arith.constant 0 : i32 + // CHECK-NEXT: %[[CST_42:.*]] = arith.constant 42 : i32 + // CHECK-NEXT: %[[CST_7:.*]] = arith.constant 7 : index + // CHECK-NEXT: scf.for %[[IV:.*]] = %{{.*}} to %{{.*}} + // CHECK-NEXT: %[[CMP:.*]] = arith.cmpi ult, %[[IV]], %[[CST_7]] + // CHECK-NEXT: %[[IF:.*]] = scf.if %[[CMP]] + // CHECK-NEXT: arith.addi %[[CST_42]], %[[CST_42]] : i32 + // CHECK: arith.addi %{{.*}}, %[[IF]] + + return %sum_result : i32 +} + +// ----- + func.func private @make_val() -> (index) // CHECK-LABEL: func @nested_uses_inside |
