[Mlir-commits] [mlir] [MLIR][SideEffects][MemoryEffects] Modified LICM to be more aggressive when checking movability of ops with MemWrite effects (PR #155344)

Mehdi Amini llvmlistbot at llvm.org
Sat Sep 13 03:58:29 PDT 2025


================
@@ -1437,3 +1437,283 @@ func.func @do_not_hoist_vector_transfer_ops_memref(
   }
   func.return %final : vector<4x4xf32>
 }
+
+// -----
+
+// CHECK-LABEL func.func @move_single_resource_basic
+func.func @move_single_resource_basic() attributes {} {
+  %c0_i32 = arith.constant 0 : i32
+  %c1_i32 = arith.constant 10 : i32
+  %c2_i32 = arith.constant 1 : i32
+  %c0_i32_0 = arith.constant 0 : i32
+
+  // CHECK: "test.test_effects_write_A"() : () -> ()
+
+  scf.for %arg0 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+    scf.for %arg1 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+      scf.for %arg2 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+        "test.test_effects_write_A"() : () -> ()
+      }
+    }
+  }
+  return
+}
+
+// -----
+
+// CHECK-LABEL func.func @move_single_resource_write_dominant
+func.func @move_single_resource_write_dominant() attributes {} {
+  %c0_i32 = arith.constant 0 : i32
+  %c1_i32 = arith.constant 10 : i32
+  %c2_i32 = arith.constant 1 : i32
+  %c0_i32_0 = arith.constant 0 : i32
+
+  // CHECK: "test.test_effects_write_A"() : () -> ()
+
+  scf.for %arg0 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+    scf.for %arg1 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+      scf.for %arg2 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+        
+        // CHECK: "test.test_effects_read_A"() : () -> ()
+
+        "test.test_effects_write_A"() : () -> ()
+        "test.test_effects_read_A"() : () -> ()
+      }
+    }
+  }
+  return
+}
+
+// -----
+
+// CHECK-LABEL func.func @move_single_resource_read_dominant
+func.func @move_single_resource_read_dominant() attributes {} {
+  %c0_i32 = arith.constant 0 : i32
+  %c1_i32 = arith.constant 10 : i32
+  %c2_i32 = arith.constant 1 : i32
+  %c0_i32_0 = arith.constant 0 : i32
+  
+  scf.for %arg0 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+    scf.for %arg1 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+      scf.for %arg2 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+        
+        // CHECK: "test.test_effects_read_A"() : () -> ()
+        // CHECK: "test.test_effects_write_A"() : () -> ()
+
+        "test.test_effects_read_A"() : () -> ()
+        "test.test_effects_write_A"() : () -> ()
+      }
+    }
+  }
+  return
+}
+
+// -----
+
+// CHECK-LABEL func.func @move_single_resource_basic_conflict
+func.func @move_single_resource_basic_conflict() attributes {} {
+  %c0_i32 = arith.constant 0 : i32
+  %c1_i32 = arith.constant 10 : i32
+  %c2_i32 = arith.constant 1 : i32
+  %c0_i32_0 = arith.constant 0 : i32
+  %c0_i32_1 = arith.constant 0 : i32
+  %c0_i32_2 = arith.constant 0 : i32
+
+  scf.for %arg0 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+    scf.for %arg1 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+      scf.for %arg2 = %c0_i32 to %c1_i32 step %c2_i32  : i32 {
+
+        // CHECK: "test.test_effects_write_A"() : () -> ()
+        // CHECK: "test.test_effects_read_A"() : () -> ()
+        // CHECK: "test.test_effects_write_AC"() : () -> ()
+        // CHECK: "test.test_effects_read_AC"() : () -> ()
----------------
joker-eph wrote:

I can't tell what you're checking here: seems like whether the ops are moved out of a loop or not wouldn't matter for the check (as long as the order stays the same), can you add comments to these tests?

https://github.com/llvm/llvm-project/pull/155344


More information about the Mlir-commits mailing list