Skip to content

Commit 1c4f579

Browse files
committed
[CIR][Lowering] Handle pointer of pointer of struct or array
Remove a shortcut preventing some level of memref recursion.
1 parent 7adf560 commit 1c4f579

File tree

1 file changed

+14
-18
lines changed

1 file changed

+14
-18
lines changed

clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,7 +1467,7 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
14671467
shape.push_back(arrayType.getSize());
14681468
curType = arrayType.getEltType();
14691469
}
1470-
auto elementType = converter.convertType(curType);
1470+
auto elementType = convertTypeForMemory(converter, curType);
14711471
// FIXME: The element type might not be converted
14721472
if (!elementType)
14731473
return nullptr;
@@ -1482,13 +1482,17 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
14821482
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14831483
mlir::TypeConverter converter;
14841484
converter.addConversion([&](cir::PointerType type) -> mlir::Type {
1485-
auto ty = convertTypeForMemory(converter, type.getPointee());
1485+
auto pointeeType = type.getPointee();
1486+
if (mlir::isa<cir::ArrayType>(pointeeType))
1487+
// A pointer to an array gives the array a reference semantics, lower to a
1488+
// memref.
1489+
return lowerArrayType(mlir::cast<cir::ArrayType>(pointeeType),
1490+
/* hasValueSemantics */ false, converter);
1491+
auto ty = convertTypeForMemory(converter, pointeeType);
14861492
// FIXME: The pointee type might not be converted (e.g. struct)
14871493
if (!ty)
14881494
return nullptr;
1489-
if (isa<cir::ArrayType>(type.getPointee()))
1490-
// An array is already lowered as a memref with reference semantics
1491-
return ty;
1495+
// Each level of pointer becomes a level of memref
14921496
return mlir::MemRefType::get({}, ty);
14931497
});
14941498
converter.addConversion(
@@ -1527,23 +1531,15 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
15271531
return mlir::BFloat16Type::get(type.getContext());
15281532
});
15291533
converter.addConversion([&](cir::ArrayType type) -> mlir::Type {
1530-
// Arrays in C/C++ have a reference semantics when not in a
1531-
// class/struct/union, so use a memref.
1532-
return lowerArrayType(type, /* hasValueSemantics */ false, converter);
1534+
// Assume we are in a class/struct/union context with value semantics, so
1535+
// lower as a tensor.
1536+
return lowerArrayType(type, /* hasValueSemantics */ true, converter);
15331537
});
15341538
converter.addConversion([&](cir::VectorType type) -> mlir::Type {
15351539
auto ty = converter.convertType(type.getEltType());
15361540
return mlir::VectorType::get(type.getSize(), ty);
15371541
});
15381542
converter.addConversion([&](cir::StructType type) -> mlir::Type {
1539-
auto convertWithValueSemanticsArray = [&](mlir::Type t) {
1540-
if (mlir::isa<cir::ArrayType>(t))
1541-
// Inside a class/struct/union, an array has value semantics and is
1542-
// lowered as a tensor.
1543-
return lowerArrayType(mlir::cast<cir::ArrayType>(t),
1544-
/* hasValueSemantics */ true, converter);
1545-
return converter.convertType(t);
1546-
};
15471543
// FIXME(cir): create separate unions, struct, and classes types.
15481544
// Convert struct members.
15491545
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1552,13 +1548,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
15521548
// TODO(cir): This should be properly validated.
15531549
case cir::StructType::Struct:
15541550
for (auto ty : type.getMembers())
1555-
mlirMembers.push_back(convertWithValueSemanticsArray(ty));
1551+
mlirMembers.push_back(converter.convertType(ty));
15561552
break;
15571553
// Unions are lowered as only the largest member.
15581554
case cir::StructType::Union: {
15591555
auto largestMember = type.getLargestMember(dataLayout);
15601556
if (largestMember)
1561-
mlirMembers.push_back(convertWithValueSemanticsArray(largestMember));
1557+
mlirMembers.push_back(converter.convertType(largestMember));
15621558
break;
15631559
}
15641560
}

0 commit comments

Comments
 (0)