[flang-commits] [flang] [FIRToMemRef] copy ACC Variable Name attribute (PR #187724)

Scott Manley via flang-commits flang-commits at lists.llvm.org
Fri Mar 20 09:36:24 PDT 2026


https://github.com/rscottmanley updated https://github.com/llvm/llvm-project/pull/187724

>From 926263ff4ec9ce359df978e45cb155b073f51227 Mon Sep 17 00:00:00 2001
From: Scott Manley <scmanley at nvidia.com>
Date: Fri, 20 Mar 2026 08:51:19 -0700
Subject: [PATCH 1/3] [FIRToMemRef] copy ACC Variable Name attribute

When converting from fir.alloca to memref.alloca, also copy the acc
variable name attribute if it exists
---
 flang/lib/Optimizer/Transforms/FIRToMemRef.cpp | 1 +
 flang/test/Transforms/FIRToMemRef/alloca.mlir  | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/flang/lib/Optimizer/Transforms/FIRToMemRef.cpp b/flang/lib/Optimizer/Transforms/FIRToMemRef.cpp
index 90b4b01e30f62..ee6f644aea911 100644
--- a/flang/lib/Optimizer/Transforms/FIRToMemRef.cpp
+++ b/flang/lib/Optimizer/Transforms/FIRToMemRef.cpp
@@ -330,6 +330,7 @@ void FIRToMemRef::rewriteAlloca(fir::AllocaOp firAlloca,
   copyAttribute(firAlloca, alloca, firAlloca.getBindcNameAttrName());
   copyAttribute(firAlloca, alloca, firAlloca.getUniqNameAttrName());
   copyAttribute(firAlloca, alloca, cuf::getDataAttrName());
+  copyAttribute(firAlloca, alloca, acc::getVarNameAttrName());
 
   auto convert = fir::ConvertOp::create(rewriter, loc, type, alloca);
 
diff --git a/flang/test/Transforms/FIRToMemRef/alloca.mlir b/flang/test/Transforms/FIRToMemRef/alloca.mlir
index b2859370903f4..2c76c4a9b3849 100644
--- a/flang/test/Transforms/FIRToMemRef/alloca.mlir
+++ b/flang/test/Transforms/FIRToMemRef/alloca.mlir
@@ -86,11 +86,11 @@ func.func @peep_declare() {
 
 // check that attributes are copied when they exist
 // CHECK-LABEL: func.func @no_peep_declare
-// CHECK:       memref.alloca() {bindc_name = "x", uniq_name = "y"} : memref<i32>
+// CHECK:       memref.alloca() {acc.var_name = #acc.var_name<"z">, bindc_name = "x", uniq_name = "y"} : memref<i32>
 // CHECK-NOT:   memref.store %c1_i32, %alloca[] : memref<i32>
 func.func @no_peep_declare() {
   %c1_i32 = arith.constant 1 : i32
-  %0 = fir.alloca i32 {bindc_name = "x", uniq_name = "y"}
+  %0 = fir.alloca i32 {acc.var_name = #acc.var_name<"z">, bindc_name = "x", uniq_name = "y"}
   %1 = fir.declare %0 {uniq_name = "some_name"} : (!fir.ref<i32>) -> !fir.ref<i32>
   fir.store %c1_i32 to %1 : !fir.ref<i32>
   return

>From b42d2da7a553962642337b5002047d31799eee67 Mon Sep 17 00:00:00 2001
From: Scott Manley <scmanley at nvidia.com>
Date: Fri, 20 Mar 2026 09:06:07 -0700
Subject: [PATCH 2/3] improved test(s)

---
 flang/test/Transforms/FIRToMemRef/alloca.mlir | 32 +++++++++++++++----
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/flang/test/Transforms/FIRToMemRef/alloca.mlir b/flang/test/Transforms/FIRToMemRef/alloca.mlir
index 2c76c4a9b3849..359db260b9573 100644
--- a/flang/test/Transforms/FIRToMemRef/alloca.mlir
+++ b/flang/test/Transforms/FIRToMemRef/alloca.mlir
@@ -71,6 +71,7 @@ func.func @alloca_nonconvertible() {
   return
 }
 
+// compiler generated alloca will not perserve declare
 // CHECK-LABEL: func.func @peep_declare
 // CHECK:       [[ALLOCA:%.+]] = memref.alloca() : memref<i32>
 // CHECK-NOT:   fircg.ext_declare
@@ -83,14 +84,33 @@ func.func @peep_declare() {
   return
 }
 
-
 // check that attributes are copied when they exist
-// CHECK-LABEL: func.func @no_peep_declare
-// CHECK:       memref.alloca() {acc.var_name = #acc.var_name<"z">, bindc_name = "x", uniq_name = "y"} : memref<i32>
-// CHECK-NOT:   memref.store %c1_i32, %alloca[] : memref<i32>
-func.func @no_peep_declare() {
+// CHECK-LABEL: func.func @perserve_declare
+// CHECK:       [[ALLOCA:%.*]] = memref.alloca() {bindc_name = "x", uniq_name = "y"} : memref<i32>
+// CHECK-NOT:   memref.store %c1_i32, [[ALLOCA]][] : memref<i32>
+func.func @perserve_declare() {
+  %c1_i32 = arith.constant 1 : i32
+  %0 = fir.alloca i32 {bindc_name = "x", uniq_name = "y"}
+  %1 = fir.declare %0 {uniq_name = "some_name"} : (!fir.ref<i32>) -> !fir.ref<i32>
+  fir.store %c1_i32 to %1 : !fir.ref<i32>
+  return
+}
+
+// CHECK-LABEL: func.func @copy_cuf_data_attr
+// CHECK:       memref.alloca() {cuf.data_attr = #cuf.cuda<device>} : memref<i32>
+func.func @copy_cuf_data_attr() {
+  %c1_i32 = arith.constant 1 : i32
+  %0 = fir.alloca i32 {cuf.data_attr = #cuf.cuda<device>}
+  %1 = fir.declare %0 {uniq_name = "some_name"} : (!fir.ref<i32>) -> !fir.ref<i32>
+  fir.store %c1_i32 to %1 : !fir.ref<i32>
+  return
+}
+
+// CHECK-LABEL: func.func @copy_acc_var_name_attr
+// CHECK:       memref.alloca() {acc.var_name = #acc.var_name<"x">} : memref<i32>
+func.func @copy_acc_var_name_attr() {
   %c1_i32 = arith.constant 1 : i32
-  %0 = fir.alloca i32 {acc.var_name = #acc.var_name<"z">, bindc_name = "x", uniq_name = "y"}
+  %0 = fir.alloca i32 {acc.var_name = #acc.var_name<"x">}
   %1 = fir.declare %0 {uniq_name = "some_name"} : (!fir.ref<i32>) -> !fir.ref<i32>
   fir.store %c1_i32 to %1 : !fir.ref<i32>
   return

>From dbc625e5ea4c288427ad8ab284e5902bb6e0e125 Mon Sep 17 00:00:00 2001
From: Scott Manley <scmanley at nvidia.com>
Date: Fri, 20 Mar 2026 09:36:01 -0700
Subject: [PATCH 3/3] test fixes

---
 flang/test/Transforms/FIRToMemRef/alloca.mlir | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/flang/test/Transforms/FIRToMemRef/alloca.mlir b/flang/test/Transforms/FIRToMemRef/alloca.mlir
index 359db260b9573..10f79b7aab41d 100644
--- a/flang/test/Transforms/FIRToMemRef/alloca.mlir
+++ b/flang/test/Transforms/FIRToMemRef/alloca.mlir
@@ -71,10 +71,10 @@ func.func @alloca_nonconvertible() {
   return
 }
 
-// compiler generated alloca will not perserve declare
+// compiler generated alloca will not preserve declare
 // CHECK-LABEL: func.func @peep_declare
 // CHECK:       [[ALLOCA:%.+]] = memref.alloca() : memref<i32>
-// CHECK-NOT:   fircg.ext_declare
+// CHECK-NOT:   fir.declare
 // CHECK:       memref.store %c1_i32, [[ALLOCA]][] : memref<i32>
 func.func @peep_declare() {
   %c1_i32 = arith.constant 1 : i32
@@ -85,10 +85,10 @@ func.func @peep_declare() {
 }
 
 // check that attributes are copied when they exist
-// CHECK-LABEL: func.func @perserve_declare
+// CHECK-LABEL: func.func @preserve_declare
 // CHECK:       [[ALLOCA:%.*]] = memref.alloca() {bindc_name = "x", uniq_name = "y"} : memref<i32>
 // CHECK-NOT:   memref.store %c1_i32, [[ALLOCA]][] : memref<i32>
-func.func @perserve_declare() {
+func.func @preserve_declare() {
   %c1_i32 = arith.constant 1 : i32
   %0 = fir.alloca i32 {bindc_name = "x", uniq_name = "y"}
   %1 = fir.declare %0 {uniq_name = "some_name"} : (!fir.ref<i32>) -> !fir.ref<i32>



More information about the flang-commits mailing list