[llvm-branch-commits] [flang] release/21.x: [Flang] Fix ASSIGN statement (#149941) (PR #150228)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 23 07:28:37 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport fc0a978327215aa8883ae6f18d1e316f3c04520a
Requested by: @<!-- -->ceseo
---
Full diff: https://github.com/llvm/llvm-project/pull/150228.diff
2 Files Affected:
- (modified) flang/lib/Lower/Bridge.cpp (+26-2)
- (added) flang/test/Lower/assign-statement.f90 (+12)
``````````diff
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 33c1f1e7a3c3a..1e5e1e85a51d2 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -5504,10 +5504,34 @@ class FirConverter : public Fortran::lower::AbstractConverter {
void genFIR(const Fortran::parser::AssignStmt &stmt) {
const Fortran::semantics::Symbol &symbol =
*std::get<Fortran::parser::Name>(stmt.t).symbol;
+
mlir::Location loc = toLocation();
+ mlir::Type symbolType = genType(symbol);
+ mlir::Value addr = getSymbolAddress(symbol);
+
+ // Handle the case where the assigned variable is declared as a pointer
+ if (auto eleTy = fir::dyn_cast_ptrOrBoxEleTy(symbolType)) {
+ if (auto ptrType = mlir::dyn_cast<fir::PointerType>(eleTy)) {
+ symbolType = ptrType.getEleTy();
+ } else {
+ symbolType = eleTy;
+ }
+ } else if (auto ptrType = mlir::dyn_cast<fir::PointerType>(symbolType)) {
+ symbolType = ptrType.getEleTy();
+ }
+
mlir::Value labelValue = builder->createIntegerConstant(
- loc, genType(symbol), std::get<Fortran::parser::Label>(stmt.t));
- builder->create<fir::StoreOp>(loc, labelValue, getSymbolAddress(symbol));
+ loc, symbolType, std::get<Fortran::parser::Label>(stmt.t));
+
+ // If the address points to a boxed pointer, we need to dereference it
+ if (auto refType = mlir::dyn_cast<fir::ReferenceType>(addr.getType())) {
+ if (auto boxType = mlir::dyn_cast<fir::BoxType>(refType.getEleTy())) {
+ mlir::Value boxValue = builder->create<fir::LoadOp>(loc, addr);
+ addr = builder->create<fir::BoxAddrOp>(loc, boxValue);
+ }
+ }
+
+ builder->create<fir::StoreOp>(loc, labelValue, addr);
}
void genFIR(const Fortran::parser::FormatStmt &) {
diff --git a/flang/test/Lower/assign-statement.f90 b/flang/test/Lower/assign-statement.f90
new file mode 100644
index 0000000000000..342355bf469c8
--- /dev/null
+++ b/flang/test/Lower/assign-statement.f90
@@ -0,0 +1,12 @@
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
+
+ ! CHECK-LABEL: func @_QQmain
+ program main
+ integer :: ip
+ pointer :: ip
+
+ allocate(ip)
+ assign 10 to ip
+ ! CHECK: fir.store %c10_i32 to %11 : !fir.ptr<i32>
+ 10 return
+ end program main
``````````
</details>
https://github.com/llvm/llvm-project/pull/150228
More information about the llvm-branch-commits
mailing list