Skip to content

Commit ef348cb

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

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
@@ -1466,7 +1466,7 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
14661466
shape.push_back(arrayType.getSize());
14671467
curType = arrayType.getEltType();
14681468
}
1469-
auto elementType = converter.convertType(curType);
1469+
auto elementType = convertTypeForMemory(converter, curType);
14701470
// FIXME: The element type might not be converted
14711471
if (!elementType)
14721472
return nullptr;
@@ -1481,13 +1481,17 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
14811481
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14821482
mlir::TypeConverter converter;
14831483
converter.addConversion([&](cir::PointerType type) -> mlir::Type {
1484-
auto ty = convertTypeForMemory(converter, type.getPointee());
1484+
auto pointeeType = type.getPointee();
1485+
if (mlir::isa<cir::ArrayType>(pointeeType))
1486+
// A pointer to an array gives the array a reference semantics, lower to a
1487+
// memref.
1488+
return lowerArrayType(mlir::cast<cir::ArrayType>(pointeeType),
1489+
/* hasValueSemantics */ false, converter);
1490+
auto ty = convertTypeForMemory(converter, pointeeType);
14851491
// FIXME: The pointee type might not be converted (e.g. struct)
14861492
if (!ty)
14871493
return nullptr;
1488-
if (isa<cir::ArrayType>(type.getPointee()))
1489-
// An array is already lowered as a memref with reference semantics
1490-
return ty;
1494+
// Each level of pointer becomes a level of memref
14911495
return mlir::MemRefType::get({}, ty);
14921496
});
14931497
converter.addConversion(
@@ -1526,23 +1530,15 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
15261530
return mlir::BFloat16Type::get(type.getContext());
15271531
});
15281532
converter.addConversion([&](cir::ArrayType type) -> mlir::Type {
1529-
// Arrays in C/C++ have a reference semantics when not in a
1530-
// class/struct/union, so use a memref.
1531-
return lowerArrayType(type, /* hasValueSemantics */ false, converter);
1533+
// Assume we are in a class/struct/union context with value semantics, so
1534+
// lower as a tensor.
1535+
return lowerArrayType(type, /* hasValueSemantics */ true, converter);
15321536
});
15331537
converter.addConversion([&](cir::VectorType type) -> mlir::Type {
15341538
auto ty = converter.convertType(type.getEltType());
15351539
return mlir::VectorType::get(type.getSize(), ty);
15361540
});
15371541
converter.addConversion([&](cir::StructType type) -> mlir::Type {
1538-
auto convertWithValueSemanticsArray = [&](mlir::Type t) {
1539-
if (mlir::isa<cir::ArrayType>(t))
1540-
// Inside a class/struct/union, an array has value semantics and is
1541-
// lowered as a tensor.
1542-
return lowerArrayType(mlir::cast<cir::ArrayType>(t),
1543-
/* hasValueSemantics */ true, converter);
1544-
return converter.convertType(t);
1545-
};
15461542
// FIXME(cir): create separate unions, struct, and classes types.
15471543
// Convert struct members.
15481544
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1551,13 +1547,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
15511547
// TODO(cir): This should be properly validated.
15521548
case cir::StructType::Struct:
15531549
for (auto ty : type.getMembers())
1554-
mlirMembers.push_back(convertWithValueSemanticsArray(ty));
1550+
mlirMembers.push_back(converter.convertType(ty));
15551551
break;
15561552
// Unions are lowered as only the largest member.
15571553
case cir::StructType::Union: {
15581554
auto largestMember = type.getLargestMember(dataLayout);
15591555
if (largestMember)
1560-
mlirMembers.push_back(convertWithValueSemanticsArray(largestMember));
1556+
mlirMembers.push_back(converter.convertType(largestMember));
15611557
break;
15621558
}
15631559
}

0 commit comments

Comments
 (0)