[flang-commits] [flang] [flang][acc] Support fir.convert in type categorization (PR #160403)

via flang-commits flang-commits at lists.llvm.org
Tue Sep 23 14:48:40 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Razvan Lupusoru (razvanlupusoru)

<details>
<summary>Changes</summary>

Ensure that casting operations do not prevent mis-categorization. This pattern is seen when variables are casted to be passed by raw pointers. I encountered this problem because Fortran runtime calls take file name by pointer.

---
Full diff: https://github.com/llvm/llvm-project/pull/160403.diff


2 Files Affected:

- (modified) flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp (+8) 
- (added) flang/test/Fir/OpenACC/openacc-type-categories.mlir (+36) 


``````````diff
diff --git a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
index 684de4b2fd4a5..89aa010e7d9a1 100644
--- a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
+++ b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
@@ -365,6 +365,14 @@ getBaseRef(mlir::TypedValue<mlir::acc::PointerLikeType> varPtr) {
             // object, get the base object.
             return op.getRef();
           })
+          .Case<fir::ConvertOp>([&](auto op) -> mlir::Value {
+            // Strip the conversion and recursively check the operand
+            if (auto ptrLikeOperand = mlir::dyn_cast_if_present<
+                    mlir::TypedValue<mlir::acc::PointerLikeType>>(
+                    op.getValue()))
+              return getBaseRef(ptrLikeOperand);
+            return varPtr;
+          })
           .Default([&](mlir::Operation *) { return varPtr; });
 
   return baseRef;
diff --git a/flang/test/Fir/OpenACC/openacc-type-categories.mlir b/flang/test/Fir/OpenACC/openacc-type-categories.mlir
new file mode 100644
index 0000000000000..2275039dc3aff
--- /dev/null
+++ b/flang/test/Fir/OpenACC/openacc-type-categories.mlir
@@ -0,0 +1,36 @@
+// Use --mlir-disable-threading so that the diagnostic printing is serialized.
+// RUN: fir-opt %s -pass-pipeline='builtin.module(test-fir-openacc-interfaces)' -split-input-file --mlir-disable-threading 2>&1 | FileCheck %s
+
+module {
+  fir.global linkonce @test_string constant : !fir.char<1,26> {
+    %0 = fir.string_lit "hello_world_test_string\00"(26) : !fir.char<1,26>
+    fir.has_value %0 : !fir.char<1,26>
+  }
+
+  // Test global constant string with pointer conversion
+  func.func @_QPtest_global_string_ptr() {
+    %0 = fir.address_of(@test_string) : !fir.ref<!fir.char<1,26>>
+    %1 = fir.convert %0 : (!fir.ref<!fir.char<1,26>>) -> !fir.ref<i8>
+    %2 = acc.copyin varPtr(%1 : !fir.ref<i8>) -> !fir.ref<i8> {name = "test_string", structured = false}
+    acc.enter_data dataOperands(%2 : !fir.ref<i8>)
+    return
+  }
+
+  // CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<i8>) -> !fir.ref<i8> {name = "test_string", structured = false}
+  // CHECK: Pointer-like and Mappable: !fir.ref<i8>
+  // CHECK: Type category: nonscalar
+
+  // Test array with pointer conversion
+  func.func @_QPtest_alloca_array_ptr() {
+    %c10 = arith.constant 10 : index
+    %0 = fir.alloca !fir.array<10xf32> {bindc_name = "local_array", uniq_name = "_QFtest_alloca_array_ptrElocal_array"}
+    %1 = fir.convert %0 : (!fir.ref<!fir.array<10xf32>>) -> !fir.ref<i8>
+    %2 = acc.copyin varPtr(%1 : !fir.ref<i8>) -> !fir.ref<i8> {name = "local_array", structured = false}
+    acc.enter_data dataOperands(%2 : !fir.ref<i8>)
+    return
+  }
+
+  // CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<i8>) -> !fir.ref<i8> {name = "local_array", structured = false}
+  // CHECK: Pointer-like and Mappable: !fir.ref<i8>
+  // CHECK: Type category: array
+}

``````````

</details>


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


More information about the flang-commits mailing list