[flang-commits] [flang] 41096d1 - [flang] Do not instantiate components in initial targets as objects (#75778)
via flang-commits
flang-commits at lists.llvm.org
Tue Dec 19 01:10:28 PST 2023
Author: jeanPerier
Date: 2023-12-19T10:10:24+01:00
New Revision: 41096d19ab07650747a434345842a9e55fa972d7
URL: https://github.com/llvm/llvm-project/commit/41096d19ab07650747a434345842a9e55fa972d7
DIFF: https://github.com/llvm/llvm-project/commit/41096d19ab07650747a434345842a9e55fa972d7.diff
LOG: [flang] Do not instantiate components in initial targets as objects (#75778)
Lowering was instantiating component symbols (but the last) in initial
target designator as if they were whole objects, leading to collisions
and bugs.
Fixes https://github.com/llvm/llvm-project/issues/75728
Added:
flang/test/Lower/HLFIR/initial-target-component.f90
Modified:
flang/lib/Lower/ConvertVariable.cpp
Removed:
################################################################################
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index 364de33d00a627..ad44de71ee828a 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -238,6 +238,10 @@ mlir::Value Fortran::lower::genInitialDataTarget(
/*nonDeferredParams=*/std::nullopt);
// Pointer initial data target, and NULL(mold).
for (const auto &sym : Fortran::evaluate::CollectSymbols(initialTarget)) {
+ // Derived type component symbols should not be instantiated as objects
+ // on their own.
+ if (sym->owner().IsDerivedType())
+ continue;
// Length parameters processing will need care in global initializer
// context.
if (hasDerivedTypeWithLengthParameters(sym))
diff --git a/flang/test/Lower/HLFIR/initial-target-component.f90 b/flang/test/Lower/HLFIR/initial-target-component.f90
new file mode 100644
index 00000000000000..cfee3adbc70beb
--- /dev/null
+++ b/flang/test/Lower/HLFIR/initial-target-component.f90
@@ -0,0 +1,17 @@
+! Test https://github.com/llvm/llvm-project/issues/75728 fix.
+! RUN: bbc -emit-hlfir -o - -I nw %s | FileCheck %s
+
+subroutine test()
+ type t
+ complex :: z
+ end type
+ type(t), target, save :: obj
+ real, pointer :: p => obj%z%re
+end subroutine
+! CHECK-LABEL: fir.global internal @_QFtestEp : !fir.box<!fir.ptr<f32>> {
+! CHECK-NEXT: %[[VAL_0:.*]] = fir.address_of(@_QFtestEobj) : !fir.ref<!fir.type<_QFtestTt{z:!fir.complex<4>}>>
+! CHECK-NEXT: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFtestEobj"} : (!fir.ref<!fir.type<_QFtestTt{z:!fir.complex<4>}>>) -> (!fir.ref<!fir.type<_QFtestTt{z:!fir.complex<4>}>>, !fir.ref<!fir.type<_QFtestTt{z:!fir.complex<4>}>>)
+! CHECK-NEXT: %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"z"} real : (!fir.ref<!fir.type<_QFtestTt{z:!fir.complex<4>}>>) -> !fir.ref<f32>
+! CHECK-NEXT: %[[VAL_3:.*]] = fir.embox %[[VAL_2]] : (!fir.ref<f32>) -> !fir.box<f32>
+! CHECK-NEXT: %[[VAL_4:.*]] = fir.rebox %[[VAL_3]] : (!fir.box<f32>) -> !fir.box<!fir.ptr<f32>>
+! CHECK-NEXT: fir.has_value %[[VAL_4]] : !fir.box<!fir.ptr<f32>>
More information about the flang-commits
mailing list