Skip to content

Commit 9ce66f2

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

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
@@ -1386,7 +1386,7 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
13861386
shape.push_back(arrayType.getSize());
13871387
curType = arrayType.getEltType();
13881388
}
1389-
auto elementType = converter.convertType(curType);
1389+
auto elementType = convertTypeForMemory(converter, curType);
13901390
// FIXME: The element type might not be converted
13911391
if (!elementType)
13921392
return nullptr;
@@ -1401,13 +1401,17 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
14011401
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14021402
mlir::TypeConverter converter;
14031403
converter.addConversion([&](cir::PointerType type) -> mlir::Type {
1404-
auto ty = convertTypeForMemory(converter, type.getPointee());
1404+
auto pointeeType = type.getPointee();
1405+
if (mlir::isa<cir::ArrayType>(pointeeType))
1406+
// A pointer to an array gives the array a reference semantics, lower to a
1407+
// memref.
1408+
return lowerArrayType(mlir::cast<cir::ArrayType>(pointeeType),
1409+
/* hasValueSemantics */ false, converter);
1410+
auto ty = convertTypeForMemory(converter, pointeeType);
14051411
// FIXME: The pointee type might not be converted (e.g. struct)
14061412
if (!ty)
14071413
return nullptr;
1408-
if (isa<cir::ArrayType>(type.getPointee()))
1409-
// An array is already lowered as a memref with reference semantics
1410-
return ty;
1414+
// Each level of pointer becomes a level of memref
14111415
return mlir::MemRefType::get({}, ty);
14121416
});
14131417
converter.addConversion(
@@ -1446,23 +1450,15 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14461450
return mlir::BFloat16Type::get(type.getContext());
14471451
});
14481452
converter.addConversion([&](cir::ArrayType type) -> mlir::Type {
1449-
// Arrays in C/C++ have a reference semantics when not in a
1450-
// class/struct/union, so use a memref.
1451-
return lowerArrayType(type, /* hasValueSemantics */ false, converter);
1453+
// Assume we are in a class/struct/union context with value semantics, so
1454+
// lower as a tensor.
1455+
return lowerArrayType(type, /* hasValueSemantics */ true, converter);
14521456
});
14531457
converter.addConversion([&](cir::VectorType type) -> mlir::Type {
14541458
auto ty = converter.convertType(type.getEltType());
14551459
return mlir::VectorType::get(type.getSize(), ty);
14561460
});
14571461
converter.addConversion([&](cir::StructType type) -> mlir::Type {
1458-
auto convertWithValueSemanticsArray = [&](mlir::Type t) {
1459-
if (mlir::isa<cir::ArrayType>(t))
1460-
// Inside a class/struct/union, an array has value semantics and is
1461-
// lowered as a tensor.
1462-
return lowerArrayType(mlir::cast<cir::ArrayType>(t),
1463-
/* hasValueSemantics */ true, converter);
1464-
return converter.convertType(t);
1465-
};
14661462
// FIXME(cir): create separate unions, struct, and classes types.
14671463
// Convert struct members.
14681464
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1471,13 +1467,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14711467
// TODO(cir): This should be properly validated.
14721468
case cir::StructType::Struct:
14731469
for (auto ty : type.getMembers())
1474-
mlirMembers.push_back(convertWithValueSemanticsArray(ty));
1470+
mlirMembers.push_back(converter.convertType(ty));
14751471
break;
14761472
// Unions are lowered as only the largest member.
14771473
case cir::StructType::Union: {
14781474
auto largestMember = type.getLargestMember(dataLayout);
14791475
if (largestMember)
1480-
mlirMembers.push_back(convertWithValueSemanticsArray(largestMember));
1476+
mlirMembers.push_back(converter.convertType(largestMember));
14811477
break;
14821478
}
14831479
}

0 commit comments

Comments
 (0)