Skip to content

Commit d31a7dd

Browse files
authored
Revert " [flang] Rely on global initialization for simpler derived types" (#130278)
Reverts #114002 This causes a regression building cam4_r from spec2017
1 parent 5b3f50e commit d31a7dd

9 files changed

+90
-131
lines changed

flang/include/flang/Optimizer/Support/InternalNames.h

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ static constexpr llvm::StringRef kProcPtrSeparator = ".p.";
3030
static constexpr llvm::StringRef kSpecialBindingSeparator = ".s.";
3131
static constexpr llvm::StringRef kBindingTableSeparator = ".v.";
3232
static constexpr llvm::StringRef boxprocSuffix = "UnboxProc";
33-
static constexpr llvm::StringRef kDerivedTypeInitSuffix = "DerivedInit";
3433

3534
/// Internal name mangling of identifiers
3635
///

flang/lib/Lower/ConvertVariable.cpp

+2-61
Original file line numberDiff line numberDiff line change
@@ -798,67 +798,8 @@ void Fortran::lower::defaultInitializeAtRuntime(
798798
})
799799
.end();
800800
} else {
801-
/// For "simpler" types, relying on "_FortranAInitialize"
802-
/// leads to poor runtime performance. Hence optimize
803-
/// the same.
804-
const Fortran::semantics::DeclTypeSpec *declTy = sym.GetType();
805-
mlir::Type symTy = converter.genType(sym);
806-
const auto *details =
807-
sym.detailsIf<Fortran::semantics::ObjectEntityDetails>();
808-
if (details && !Fortran::semantics::IsPolymorphic(sym) &&
809-
declTy->category() ==
810-
Fortran::semantics::DeclTypeSpec::Category::TypeDerived &&
811-
!mlir::isa<fir::SequenceType>(symTy) &&
812-
!sym.test(Fortran::semantics::Symbol::Flag::OmpPrivate) &&
813-
!sym.test(Fortran::semantics::Symbol::Flag::OmpFirstPrivate)) {
814-
std::string globalName = fir::NameUniquer::doGenerated(
815-
(converter.mangleName(*declTy->AsDerived()) + fir::kNameSeparator +
816-
fir::kDerivedTypeInitSuffix)
817-
.str());
818-
mlir::Location loc = genLocation(converter, sym);
819-
mlir::StringAttr linkage = builder.createInternalLinkage();
820-
fir::GlobalOp global = builder.getNamedGlobal(globalName);
821-
if (!global && details->init()) {
822-
global = builder.createGlobal(loc, symTy, globalName, linkage,
823-
mlir::Attribute{},
824-
/*isConst=*/true,
825-
/*isTarget=*/false,
826-
/*dataAttr=*/{});
827-
Fortran::lower::createGlobalInitialization(
828-
builder, global, [&](fir::FirOpBuilder &builder) {
829-
Fortran::lower::StatementContext stmtCtx(
830-
/*cleanupProhibited=*/true);
831-
fir::ExtendedValue initVal = genInitializerExprValue(
832-
converter, loc, details->init().value(), stmtCtx);
833-
mlir::Value castTo =
834-
builder.createConvert(loc, symTy, fir::getBase(initVal));
835-
builder.create<fir::HasValueOp>(loc, castTo);
836-
});
837-
} else if (!global) {
838-
global = builder.createGlobal(loc, symTy, globalName, linkage,
839-
mlir::Attribute{},
840-
/*isConst=*/true,
841-
/*isTarget=*/false,
842-
/*dataAttr=*/{});
843-
Fortran::lower::createGlobalInitialization(
844-
builder, global, [&](fir::FirOpBuilder &builder) {
845-
Fortran::lower::StatementContext stmtCtx(
846-
/*cleanupProhibited=*/true);
847-
mlir::Value initVal = genDefaultInitializerValue(
848-
converter, loc, sym, symTy, stmtCtx);
849-
mlir::Value castTo = builder.createConvert(loc, symTy, initVal);
850-
builder.create<fir::HasValueOp>(loc, castTo);
851-
});
852-
}
853-
auto addrOf = builder.create<fir::AddrOfOp>(loc, global.resultType(),
854-
global.getSymbol());
855-
fir::LoadOp load = builder.create<fir::LoadOp>(loc, addrOf.getResult());
856-
// FIXME: Use memcpy instead of store.
857-
builder.create<fir::StoreOp>(loc, load, fir::getBase(exv));
858-
} else {
859-
mlir::Value box = builder.createBox(loc, exv);
860-
fir::runtime::genDerivedTypeInitialize(builder, loc, box);
861-
}
801+
mlir::Value box = builder.createBox(loc, exv);
802+
fir::runtime::genDerivedTypeInitialize(builder, loc, box);
862803
}
863804
}
864805

flang/test/Lower/HLFIR/structure-constructor.f90

+42-21
Large diffs are not rendered by default.

flang/test/Lower/OpenMP/private-derived-type.f90

+9-6
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,18 @@ end subroutine s4
2727

2828
! CHECK-LABEL: func.func @_QPs4() {
2929
! Example of how the lowering for regular derived type variables:
30-
! CHECK: %[[VAL_DERIVED_ALLOCA:.*]] = fir.alloca !fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}> {bindc_name = "v", uniq_name = "_QFs4Ev"}
31-
! CHECK: %[[VAL_DERIVED_DECLARE:.*]]:2 = hlfir.declare %[[VAL_DERIVED_ALLOCA]] {{.*}}
32-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QFs4Ty3.DerivedInit) : !fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
33-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] {{.*}}
34-
! CHECK: fir.store %[[LOAD]] to %[[VAL_DERIVED_DECLARE]]#1 : !fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
30+
! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}> {bindc_name = "v", uniq_name = "_QFs4Ev"}
31+
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_8]] {uniq_name = "_QFs4Ev"} : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>, !fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>)
32+
! CHECK: %[[VAL_10:.*]] = fir.embox %[[VAL_9]]#1 : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
33+
! CHECK: %[[VAL_11:.*]] = fir.address_of
34+
! CHECK: %[[VAL_12:.*]] = arith.constant 4 : i32
35+
! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_10]] : (!fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<none>
36+
! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_11]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
37+
! CHECK: fir.call @_FortranAInitialize(%[[VAL_13]], %[[VAL_14]], %[[VAL_12]]) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32) -> ()
3538
! CHECK: omp.parallel {
3639
! CHECK: omp.wsloop private(@[[DERIVED_PRIV]] %{{.*}}#0 -> %{{.*}}, @{{.*}} %{{.*}}#0 -> %{{.*}} : !fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>, !fir.ref<i32>) {
3740
! CHECK: }
38-
! CHECK: %[[VAL_39:.*]] = fir.embox %[[VAL_DERIVED_DECLARE]]#1 : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
41+
! CHECK: %[[VAL_39:.*]] = fir.embox %[[VAL_9]]#1 : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
3942
! CHECK: %[[VAL_40:.*]] = fir.convert %[[VAL_39]] : (!fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<none>
4043
! Check the derived type is destroyed
4144
! CHECK: fir.call @_FortranADestroy(%[[VAL_40]]) fastmath<contract> : (!fir.box<none>) -> ()

flang/test/Lower/default-initialization.f90

+24-24
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ module test_dinit
2121
! Test local scalar is default initialized
2222
! CHECK-LABEL: func @_QMtest_dinitPlocal()
2323
subroutine local
24-
!CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{i:i32}> {bindc_name = "x", uniq_name = "_QMtest_dinitFlocalEx"}
25-
!CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
26-
!CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
27-
!CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
24+
! CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{i:i32}>
25+
! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTt{i:i32}>>
26+
! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
27+
! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
2828
type(t) :: x
2929
print *, x%i
3030
end subroutine
@@ -45,30 +45,30 @@ subroutine local_array()
4545
! scalars.
4646
! CHECK-LABEL: func @_QMtest_dinitPlocal_alloc_comp()
4747
subroutine local_alloc_comp
48-
!CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}> {bindc_name = "x", uniq_name = "_QMtest_dinitFlocal_alloc_compEx"}
49-
!CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt_alloc_comp.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
50-
!CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
51-
!CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
48+
! CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>
49+
! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.box<!fir.type<_QMtest_dinitTt_alloc_comp{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
50+
! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
51+
! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
5252
type(t_alloc_comp) :: x
5353
end subroutine
5454

5555
! Test function results are default initialized.
5656
! CHECK-LABEL: func @_QMtest_dinitPresult() -> !fir.type<_QMtest_dinitTt{i:i32}>
5757
function result()
58-
!CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{i:i32}> {bindc_name = "result", uniq_name = "_QMtest_dinitFresultEresult"}
59-
!CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
60-
!CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
61-
!CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
58+
! CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{i:i32}>
59+
! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTt{i:i32}>>
60+
! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
61+
! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
6262
type(t) :: result
6363
end function
6464

6565
! Test intent(out) dummies are default initialized
6666
! CHECK-LABEL: func @_QMtest_dinitPintent_out(
6767
! CHECK-SAME: %[[x:.*]]: !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
6868
subroutine intent_out(x)
69-
!CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
70-
!CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
71-
!CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>
69+
! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ref<!fir.type<_QMtest_dinitTt{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTt{i:i32}>>
70+
! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
71+
! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
7272
type(t), intent(out) :: x
7373
end subroutine
7474

@@ -94,9 +94,9 @@ subroutine local_eq()
9494
! CHECK: %[[equiv:.*]] = fir.alloca !fir.array<4xi8>
9595
! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[equiv]], %c0{{.*}} : (!fir.ref<!fir.array<4xi8>>, index) -> !fir.ref<i8>
9696
! CHECK: %[[x:.*]] = fir.convert %[[xcoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>
97-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>
98-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>
99-
! CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>
97+
! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTtseq{i:i32}>>
98+
! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
99+
! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
100100
equivalence (x, zi)
101101
print *, i
102102
end subroutine
@@ -112,16 +112,16 @@ subroutine local_eq2()
112112
! CHECK: %[[equiv:.*]] = fir.alloca !fir.array<4xi8>
113113
! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[equiv]], %c0{{.*}} : (!fir.ref<!fir.array<4xi8>>, index) -> !fir.ref<i8>
114114
! CHECK: %[[x:.*]] = fir.convert %[[xcoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>
115-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>
116-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>
117-
! CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>
115+
! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTtseq{i:i32}>>
116+
! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
117+
! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
118118

119119

120120
! CHECK: %[[ycoor:.*]] = fir.coordinate_of %[[equiv]], %c0{{.*}} : (!fir.ref<!fir.array<4xi8>>, index) -> !fir.ref<i8>
121121
! CHECK: %[[y:.*]] = fir.convert %[[ycoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>
122-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>
123-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>
124-
! CHECK: fir.store %[[LOAD]] to %[[y]] : !fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>
122+
! CHECK: %[[ybox:.*]] = fir.embox %[[y]] : (!fir.ptr<!fir.type<_QMtest_dinitTtseq{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTtseq{i:i32}>>
123+
! CHECK: %[[yboxNone:.*]] = fir.convert %[[ybox]]
124+
! CHECK: fir.call @_FortranAInitialize(%[[yboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
125125
equivalence (x, y)
126126
print *, y%i
127127
end subroutine

flang/test/Lower/derived-type-finalization.f90

+2-7
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ subroutine test_target_finalization()
9797

9898
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_target_finalization() {
9999
! CHECK: %[[P:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>> {bindc_name = "p", uniq_name = "_QMderived_type_finalizationFtest_target_finalizationEp"}
100-
! CHECK: %[[ADDR:.*]] = fir.alloca !fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>> {uniq_name = "_QMderived_type_finalizationFtest_target_finalizationEp.addr"}
101-
! CHECK: %[[zero:.*]] = fir.zero_bits !fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
102-
! CHECK: fir.store %[[zero]] to %[[ADDR]] : !fir.ref<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
100+
! CHECK: fir.call @_FortranAInitialize
103101
! CHECK: fir.call @_FortranAPointerAllocateSource
104102
! CHECK: %[[P_BOX_NONE:.*]] = fir.convert %[[P]] : (!fir.ref<!fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>) -> !fir.ref<!fir.box<none>>
105103
! CHECK: %{{.*}} = fir.call @_FortranAPointerDeallocate(%[[P_BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
@@ -201,10 +199,7 @@ subroutine test_avoid_double_finalization(a)
201199
end subroutine
202200

203201
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_avoid_double_finalization(
204-
! CHECK: %[[b:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}> {bindc_name = "b", uniq_name = "_QMderived_type_finalizationFtest_avoid_double_finalizationEb"}
205-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMderived_type_finalizationTt3.DerivedInit) : !fir.ref<!fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}>>
206-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}>>
207-
! CHECK: fir.store %[[LOAD]] to %[[b]] : !fir.ref<!fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}>>
202+
! CHECK: fir.call @_FortranAInitialize(
208203
! CHECK-NOT: fir.call @_FortranADestroy
209204
! CHECK: fir.call @_FortranAAssign(
210205
! CHECK: fir.call @_FortranADestroy(

flang/test/Lower/derived-type-temp.f90

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ program derived_temp_init
1313
y = t2(x)
1414
end
1515

16-
! CHECK: %[[x:.*]] = fir.alloca !fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}> {bindc_name = "x", uniq_name = "_QFEx"}
17-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QFTt1.DerivedInit) : !fir.ref<!fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}>>
18-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}>>
19-
! CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ref<!fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}>>
16+
! CHECK: %[[temp:.*]] = fir.alloca !fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}> {bindc_name = "x", uniq_name = "_QFEx"}
17+
! CHECK: %[[box:.*]] = fir.embox %[[temp]] : (!fir.ref<!fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}>>
18+
! CHECK: %[[box_none:.*]] = fir.convert %[[box]] : (!fir.box<!fir.type<_QFTt1{i:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<none>
19+
! CHECK: fir.call @_FortranAInitialize(%[[box_none]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()

flang/test/Lower/forall/forall-allocatable-2.f90

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ end subroutine forall_with_allocatable2
1818
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}) {
1919
! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
2020
! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}> {bindc_name = "thing", uniq_name = "_QFforall_with_allocatable2Ething"}
21-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QFforall_with_allocatable2Tt.DerivedInit) : !fir.ref<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
22-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
23-
! CHECK: fir.store %[[LOAD]] to %[[VAL_2]] : !fir.ref<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
21+
! CHECK: %[[VAL_3:.*]] = fir.embox %[[VAL_2]] : (!fir.ref<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.box<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
22+
! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,
23+
! CHECK: %[[VAL_5:.*]] = arith.constant {{.*}} : i32
24+
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_3]] : (!fir.box<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.box<none>
25+
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_4]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
26+
! CHECK: fir.call @_FortranAInitialize(%[[VAL_6]], %[[VAL_7]], %[[VAL_5]]) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
2427
! CHECK: %[[VAL_9:.*]] = arith.constant 5 : i32
2528
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index
2629
! CHECK: %[[VAL_11:.*]] = arith.constant 15 : i32

flang/test/Lower/pointer-default-init.f90

+1-4
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@ subroutine test_local()
3838
type(t) :: x
3939
end subroutine
4040
! CHECK-LABEL: func.func @_QPtest_local() {
41-
! CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtestTt{i:i32,x:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> {bindc_name = "x", uniq_name = "_QFtest_localEx"}
42-
! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtestTt.DerivedInit) : !fir.ref<!fir.type<_QMtestTt{i:i32,x:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>
43-
! CHECK: %[[LOAD:.*]] = fir.load %[[ADDR]] : !fir.ref<!fir.type<_QMtestTt{i:i32,x:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>
44-
! CHECK: fir.store %[[LOAD]] to %[[x]] : !fir.ref<!fir.type<_QMtestTt{i:i32,x:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>
41+
! CHECK: fir.call @_FortranAInitialize(
4542

4643
subroutine test_saved()
4744
use test, only : t

0 commit comments

Comments
 (0)