Skip to content

Commit 4a63264

Browse files
committed
[flang] Use fir.type_desc in nullify
Do not look for the global early in nullify codegen. The type descriptor can be emitted later and it would raise an error as it could not be found. Use `fir.type_desc` instead so it delays the type descriptor lookup until evrything is emitted. #63775 Reviewed By: vzakhari Differential Revision: https://reviews.llvm.org/D154982
1 parent b0cc947 commit 4a63264

File tree

4 files changed

+9
-15
lines changed

4 files changed

+9
-15
lines changed

flang/lib/Optimizer/Builder/Runtime/Derived.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,15 @@ void fir::runtime::genNullifyDerivedType(fir::FirOpBuilder &builder,
5050
mlir::Location loc, mlir::Value box,
5151
fir::RecordType derivedType,
5252
unsigned rank) {
53-
std::string typeDescName =
54-
fir::NameUniquer::getTypeDescriptorName(derivedType.getName());
55-
fir::GlobalOp typeDescGlobal = builder.getNamedGlobal(typeDescName);
56-
if (!typeDescGlobal)
57-
fir::emitFatalError(loc, "no type descriptor found for NULLIFY");
58-
auto typeDescAddr = builder.create<fir::AddrOfOp>(
59-
loc, fir::ReferenceType::get(typeDescGlobal.getType()),
60-
typeDescGlobal.getSymbol());
53+
mlir::Value typeDesc =
54+
builder.create<fir::TypeDescOp>(loc, mlir::TypeAttr::get(derivedType));
6155
mlir::func::FuncOp callee =
6256
fir::runtime::getRuntimeFunc<mkRTKey(PointerNullifyDerived)>(loc,
6357
builder);
6458
llvm::ArrayRef<mlir::Type> inputTypes = callee.getFunctionType().getInputs();
6559
llvm::SmallVector<mlir::Value> args;
6660
args.push_back(builder.createConvert(loc, inputTypes[0], box));
67-
args.push_back(builder.createConvert(loc, inputTypes[1], typeDescAddr));
61+
args.push_back(builder.createConvert(loc, inputTypes[1], typeDesc));
6862
mlir::Value rankCst = builder.createIntegerConstant(loc, inputTypes[2], rank);
6963
mlir::Value c0 = builder.createIntegerConstant(loc, inputTypes[3], 0);
7064
args.push_back(rankCst);

flang/test/Lower/nullify-polymorphic.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ program test
4444
! CHECK-LABEL: func.func @_QMpolyPtest_nullify()
4545
! CHECK: %[[C_DESC:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>> {bindc_name = "c", uniq_name = "_QMpolyFtest_nullifyEc"}
4646
! CHECK: %{{.*}} = fir.call @_FortranAPointerAllocate(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
47-
! CHECK: %[[DECLARED_TYPE:.*]] = fir.address_of(@_QMpolyE.dt.p1) : !fir.ref<!fir.type<{{.*}}>>
47+
! CHECK: %[[DECLARED_TYPE_DESC:.*]] = fir.type_desc !fir.type<_QMpolyTp1{a:i32,b:i32}>
4848
! CHECK: %[[C_DESC_CAST:.*]] = fir.convert %[[C_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.ref<!fir.box<none>>
49-
! CHECK: %[[TYPE_DESC_CAST:.*]] = fir.convert %[[DECLARED_TYPE]] : (!fir.ref<!fir.type<{{.*}}>>) -> !fir.ref<none>
49+
! CHECK: %[[TYPE_DESC_CAST:.*]] = fir.convert %[[DECLARED_TYPE_DESC]] : (!fir.tdesc<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) -> !fir.ref<none>
5050
! CHECK: %[[RANK:.*]] = arith.constant 0 : i32
5151
! CHECK: %[[CORANK:.*]] = arith.constant 0 : i32
5252
! CHECK: %{{.*}} = fir.call @_FortranAPointerNullifyDerived(%[[C_DESC_CAST]], %[[TYPE_DESC_CAST]], %[[RANK]], %[[CORANK]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.ref<none>, i32, i32) -> none

flang/test/Lower/pointer-disassociate.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ subroutine test_polymorphic_null(p)
113113
end subroutine
114114
! CHECK-LABEL: func.func @_QPtest_polymorphic_null(
115115
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QFtest_polymorphic_nullTt>>>>>
116-
! CHECK: %[[VAL_1:.*]] = fir.address_of(@_QFtest_polymorphic_nullE.dt.t)
116+
! CHECK: %[[VAL_1:.*]] = fir.type_desc !fir.type<_QFtest_polymorphic_nullTt>
117117
! CHECK: %[[VAL_2:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QFtest_polymorphic_nullTt>>>>>) -> !fir.ref<!fir.box<none>>
118-
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<{{.*}}>) -> !fir.ref<none>
118+
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_1]] : (!fir.tdesc<!fir.type<_QFtest_polymorphic_nullTt>>) -> !fir.ref<none>
119119
! CHECK: %[[VAL_4:.*]] = arith.constant 1 : i32
120120
! CHECK: %[[VAL_5:.*]] = arith.constant 0 : i32
121121
! CHECK: %[[VAL_6:.*]] = fir.call @_FortranAPointerNullifyDerived(%[[VAL_2]], %[[VAL_3]], %[[VAL_4]], %[[VAL_5]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.ref<none>, i32, i32) -> none

flang/test/Lower/polymorphic.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,9 @@ subroutine nullify_pointer_array(a)
310310
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>> {fir.bindc_name = "a"}) {
311311
! CHECK: %[[FIELD_P:.*]] = fir.field_index p, !fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>
312312
! CHECK: %[[COORD_P:.*]] = fir.coordinate_of %[[ARG0]], %[[FIELD_P]] : (!fir.ref<!fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>>, !fir.field) -> !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>>>>>
313-
! CHECK: %[[TYPE_DESC_ADDR:.*]] = fir.address_of(@_QMpolymorphic_testE.dt.p3) : !fir.ref<!fir.type<{{.*}}>>
313+
! CHECK: %[[TYPE_DESC:.*]] = fir.type_desc !fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>
314314
! CHECK: %[[CONV_P:.*]] = fir.convert %[[COORD_P]] : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>>>>>) -> !fir.ref<!fir.box<none>>
315-
! CHECK: %[[CONV_TDESC:.*]] = fir.convert %[[TYPE_DESC_ADDR]] : (!fir.ref<!fir.type<{{.*}}>>) -> !fir.ref<none>
315+
! CHECK: %[[CONV_TDESC:.*]] = fir.convert %[[TYPE_DESC]] : (!fir.tdesc<!fir.type<_QMpolymorphic_testTp3{p:!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp3>>>>}>>) -> !fir.ref<none>
316316
! CHECK: %[[C1:.*]] = arith.constant 1 : i32
317317
! CHECK: %[[C0:.*]] = arith.constant 0 : i32
318318
! CHECK: %{{.*}} = fir.call @_FortranAPointerNullifyDerived(%[[CONV_P]], %[[CONV_TDESC]], %[[C1]], %[[C0]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.ref<none>, i32, i32) -> none

0 commit comments

Comments
 (0)