[flang-commits] [flang] [flang][acc] register `fir.dummy_scope` to OpenACC extensions (PR #208091)
Susan Tan ス-ザン タン via flang-commits
flang-commits at lists.llvm.org
Wed Jul 8 07:26:56 PDT 2026
https://github.com/SusanTan updated https://github.com/llvm/llvm-project/pull/208091
>From c17236e0b03d1cd93a217950d697503d17eaefdd Mon Sep 17 00:00:00 2001
From: Susan Tan <zujunt at nvidia.com>
Date: Tue, 7 Jul 2026 13:04:42 -0700
Subject: [PATCH] add dummy scope to registration
---
.../Support/RegisterOpenACCExtensions.cpp | 2 +
.../offload-livein-value-canonicalization.fir | 70 +++++++++++++++++++
2 files changed, 72 insertions(+)
diff --git a/flang/lib/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.cpp b/flang/lib/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.cpp
index 070208d22ba05..56c337468ba72 100644
--- a/flang/lib/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.cpp
+++ b/flang/lib/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.cpp
@@ -85,6 +85,8 @@ void registerOpenACCExtensions(mlir::DialectRegistry ®istry) {
*ctx);
fir::SliceOp::attachInterface<OutlineRematerializationModel<fir::SliceOp>>(
*ctx);
+ fir::DummyScopeOp::attachInterface<
+ OutlineRematerializationModel<fir::DummyScopeOp>>(*ctx);
});
// Register HLFIR operation interfaces
diff --git a/flang/test/Fir/OpenACC/offload-livein-value-canonicalization.fir b/flang/test/Fir/OpenACC/offload-livein-value-canonicalization.fir
index e692e5fb6dc4f..b5b8394ebbb94 100644
--- a/flang/test/Fir/OpenACC/offload-livein-value-canonicalization.fir
+++ b/flang/test/Fir/OpenACC/offload-livein-value-canonicalization.fir
@@ -467,3 +467,73 @@ func.func @test_undef_slice_rematerialize(%arg0: !fir.box<!fir.array<?x?xf32>>)
// CHECK: %[[UNDEF_INNER:.*]] = fir.undefined index
// CHECK: %[[SLICE_INNER:.*]] = fir.slice {{.*}}, %[[UNDEF_INNER]], %[[UNDEF_INNER]]
// CHECK: fir.rebox %arg0 [%[[SLICE_INNER]]]
+
+// -----
+
+// Test fir.dummy_scope sinking together with the fir.declare chain that
+// uses it as an operand. Regression test: after inlining, a fir.declare
+// for a dummy argument aliasing a device-valid global (e.g. one with
+// !$ACC DECLARE COPYIN) is rematerialized into the offload region, but its
+// dummy_scope operand was left behind as an illegal live-in value because
+// fir.dummy_scope was not registered as an outline rematerialization
+// candidate.
+
+fir.global @global_for_dummy_scope {acc.declare = #acc.declare<dataClause = acc_copyin>} : i32 {
+ %0 = arith.constant 0 : i32
+ fir.has_value %0 : i32
+}
+
+func.func private @use_ref(!fir.ref<i32>) -> ()
+
+func.func @test_dummy_scope_sink() {
+ %addr = fir.address_of(@global_for_dummy_scope) : !fir.ref<i32>
+ %scope = fir.dummy_scope : !fir.dscope
+ %decl = fir.declare %addr dummy_scope %scope {uniq_name = "global"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>
+ acc.serial {
+ fir.call @use_ref(%decl) : (!fir.ref<i32>) -> ()
+ acc.yield
+ }
+ return
+}
+
+// CHECK-LABEL: @test_dummy_scope_sink
+// CHECK: acc.serial {
+// CHECK-DAG: fir.address_of(@global_for_dummy_scope)
+// CHECK-DAG: %[[SCOPE:.*]] = fir.dummy_scope
+// CHECK: fir.declare {{.*}} dummy_scope %[[SCOPE]]
+// CHECK: fir.call @use_ref
+
+// -----
+
+// Test fir.dummy_scope rematerialization (used both inside and outside
+// region through separate fir.declare chains).
+
+fir.global @global_for_dummy_scope_remat {acc.declare = #acc.declare<dataClause = acc_copyin>} : i32 {
+ %0 = arith.constant 0 : i32
+ fir.has_value %0 : i32
+}
+
+func.func private @use_ref(!fir.ref<i32>) -> ()
+
+func.func @test_dummy_scope_rematerialize() {
+ %addr = fir.address_of(@global_for_dummy_scope_remat) : !fir.ref<i32>
+ %scope = fir.dummy_scope : !fir.dscope
+ %decl_outer = fir.declare %addr dummy_scope %scope {uniq_name = "global"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>
+ fir.call @use_ref(%decl_outer) : (!fir.ref<i32>) -> ()
+ acc.serial {
+ %decl_inner = fir.declare %addr dummy_scope %scope {uniq_name = "global"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>
+ fir.call @use_ref(%decl_inner) : (!fir.ref<i32>) -> ()
+ acc.yield
+ }
+ return
+}
+
+// CHECK-LABEL: @test_dummy_scope_rematerialize
+// CHECK: %[[SCOPE_OUTER:.*]] = fir.dummy_scope
+// CHECK: %[[DECL_OUTER:.*]] = fir.declare {{.*}} dummy_scope %[[SCOPE_OUTER]]
+// CHECK: fir.call @use_ref(%[[DECL_OUTER]])
+// CHECK: acc.serial {
+// CHECK-DAG: fir.address_of(@global_for_dummy_scope_remat)
+// CHECK-DAG: %[[SCOPE_INNER:.*]] = fir.dummy_scope
+// CHECK: %[[DECL_INNER:.*]] = fir.declare {{.*}} dummy_scope %[[SCOPE_INNER]]
+// CHECK: fir.call @use_ref(%[[DECL_INNER]])
More information about the flang-commits
mailing list