[flang-commits] [flang] [flang] Recognize non-addressable resources in FIR AA. (PR #191577)
Slava Zakharin via flang-commits
flang-commits at lists.llvm.org
Fri Apr 10 17:12:26 PDT 2026
https://github.com/vzakhari created https://github.com/llvm/llvm-project/pull/191577
Same as in #187423 change for CSE, we can assume that an effect
on a non-addressable resource cannot affect memory pointed to
by 'location'.
>From 0250ecadac761daba2efc7c5597c2ef86588684f Mon Sep 17 00:00:00 2001
From: Slava Zakharin <szakharin at nvidia.com>
Date: Fri, 10 Apr 2026 16:32:49 -0700
Subject: [PATCH] [flang] Recognize non-addressable resources in FIR AA.
Same as in #187423 change for CSE, we can assume that an effect
on a non-addressable resource cannot affect memory pointed to
by 'location'.
---
.../lib/Optimizer/Analysis/AliasAnalysis.cpp | 6 +++++
.../licm-non-addressable-resource.mlir | 25 +++++++++++++++++++
2 files changed, 31 insertions(+)
create mode 100644 flang/test/Transforms/licm-non-addressable-resource.mlir
diff --git a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
index 8b8cb9c658e4a..e832bec484786 100644
--- a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
+++ b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
@@ -767,6 +767,12 @@ ModRefResult AliasAnalysis::getModRef(Operation *op, Value location) {
if (isa<MemoryEffects::Allocate, MemoryEffects::Free>(effect.getEffect()))
continue;
+ // An effect on a non-addressable resource cannot affect
+ // memory pointed to by 'location'.
+ mlir::SideEffects::Resource *resource = effect.getResource();
+ if (!resource->isAddressable())
+ continue;
+
// Check for an alias between the effect and our memory location.
AliasResult aliasResult = AliasResult::MayAlias;
if (Value effectValue = effect.getValue())
diff --git a/flang/test/Transforms/licm-non-addressable-resource.mlir b/flang/test/Transforms/licm-non-addressable-resource.mlir
new file mode 100644
index 0000000000000..07df4582b687c
--- /dev/null
+++ b/flang/test/Transforms/licm-non-addressable-resource.mlir
@@ -0,0 +1,25 @@
+// RUN: fir-opt -flang-licm --split-input-file %s | FileCheck %s
+
+// Verify that a write of non-addressable AccCurrentDeviceIdResource
+// resource does not prevent LICM of fir.load:
+// CHECK-LABEL: func.func @_QPtest(
+// CHECK: %[[DECLARE_1:.*]] = fir.declare %{{.*}} dummy_scope %{{.*}} arg 2 {uniq_name = "_QFtestEy"} : (!fir.ref<f32>, !fir.dscope) -> !fir.ref<f32>
+// CHECK: %[[LOAD_0:.*]] = fir.load %[[DECLARE_1]] : !fir.ref<f32>
+// CHECK: fir.do_loop {{.*}} {
+// CHECK: acc.set device_num(%{{.*}} : index)
+// CHECK: fir.store %[[LOAD_0]] to %{{.*}} : !fir.ref<f32>
+func.func @_QPtest(%arg0: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) {
+ %c1 = arith.constant 1 : index
+ %c10 = arith.constant 10 : index
+ %0 = fir.dummy_scope : !fir.dscope
+ %3 = fir.shape %c10 : (index) -> !fir.shape<1>
+ %4 = fir.declare %arg0(%3) dummy_scope %0 arg 1 {uniq_name = "_QFtestEx"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<10xf32>>
+ %5 = fir.declare %arg1 dummy_scope %0 arg 2 {uniq_name = "_QFtestEy"} : (!fir.ref<f32>, !fir.dscope) -> !fir.ref<f32>
+ fir.do_loop %arg2 = %c1 to %c10 step %c1 {
+ %8 = fir.load %5 : !fir.ref<f32>
+ acc.set device_num(%c1 : index)
+ %11 = fir.array_coor %4(%3) %arg2 : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
+ fir.store %8 to %11 : !fir.ref<f32>
+ }
+ return
+}
More information about the flang-commits
mailing list