Skip to content

Commit adc0320

Browse files
committed
[codegen] do not degenerated fir.box to ptr<struct> in tuple and record
1 parent decd6f9 commit adc0320

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

flang/lib/Optimizer/CodeGen/TypeConverter.h

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,14 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
7979
llvm::SmallVector<mlir::Type, 8> inMembers;
8080
tuple.getFlattenedTypes(inMembers);
8181
llvm::SmallVector<mlir::Type, 8> members;
82-
for (auto mem : inMembers)
83-
members.push_back(convertType(mem).cast<mlir::Type>());
82+
for (auto mem : inMembers) {
83+
// Prevent fir.box from degenerating to a pointer to a descriptor in the
84+
// context of a tuple type.
85+
if (auto box = mem.dyn_cast<fir::BoxType>())
86+
members.push_back(convertBoxTypeAsStruct(box));
87+
else
88+
members.push_back(convertType(mem).cast<mlir::Type>());
89+
}
8490
return mlir::LLVM::LLVMStructType::getLiteral(&getContext(), members,
8591
/*isPacked=*/false);
8692
});
@@ -171,6 +177,13 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
171177
mlir::LLVM::LLVMStructType::getLiteral(&getContext(), parts,
172178
/*isPacked=*/false));
173179
}
180+
/// Convert fir.box type to the corresponding llvm struct type instead of a
181+
/// pointer to this struct type.
182+
mlir::Type convertBoxTypeAsStruct(BoxType box) {
183+
return convertBoxType(box)
184+
.cast<mlir::LLVM::LLVMPointerType>()
185+
.getElementType();
186+
}
174187

175188
// fir.boxproc<any> --> llvm<"{ any*, i8* }">
176189
mlir::Type convertBoxProcType(BoxProcType boxproc) {
@@ -269,8 +282,14 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
269282
auto st = mlir::LLVM::LLVMStructType::getIdentified(&getContext(), name);
270283
identStructCache[name] = st;
271284
llvm::SmallVector<mlir::Type, 8> members;
272-
for (auto mem : derived.getTypeList())
273-
members.push_back(convertType(mem.second).cast<mlir::Type>());
285+
for (auto mem : derived.getTypeList()) {
286+
// Prevent fir.box from degenerating to a pointer to a descriptor in the
287+
// context of a record type.
288+
if (auto box = mem.second.dyn_cast<fir::BoxType>())
289+
members.push_back(convertBoxTypeAsStruct(box));
290+
else
291+
members.push_back(convertType(mem.second).cast<mlir::Type>());
292+
}
274293
(void)st.setBody(members, /*isPacked=*/false);
275294
return st;
276295
}

0 commit comments

Comments
 (0)