@@ -1386,7 +1386,7 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
1386
1386
shape.push_back (arrayType.getSize ());
1387
1387
curType = arrayType.getEltType ();
1388
1388
}
1389
- auto elementType = converter. convertType ( curType);
1389
+ auto elementType = convertTypeForMemory (converter, curType);
1390
1390
// FIXME: The element type might not be converted
1391
1391
if (!elementType)
1392
1392
return nullptr ;
@@ -1401,13 +1401,17 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
1401
1401
mlir::TypeConverter prepareTypeConverter (mlir::DataLayout &dataLayout) {
1402
1402
mlir::TypeConverter converter;
1403
1403
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);
1405
1411
// FIXME: The pointee type might not be converted (e.g. struct)
1406
1412
if (!ty)
1407
1413
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
1411
1415
return mlir::MemRefType::get ({}, ty);
1412
1416
});
1413
1417
converter.addConversion (
@@ -1446,23 +1450,15 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
1446
1450
return mlir::BFloat16Type::get (type.getContext ());
1447
1451
});
1448
1452
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);
1452
1456
});
1453
1457
converter.addConversion ([&](cir::VectorType type) -> mlir::Type {
1454
1458
auto ty = converter.convertType (type.getEltType ());
1455
1459
return mlir::VectorType::get (type.getSize (), ty);
1456
1460
});
1457
1461
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
- };
1466
1462
// FIXME(cir): create separate unions, struct, and classes types.
1467
1463
// Convert struct members.
1468
1464
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1471,13 +1467,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
1471
1467
// TODO(cir): This should be properly validated.
1472
1468
case cir::StructType::Struct:
1473
1469
for (auto ty : type.getMembers ())
1474
- mlirMembers.push_back (convertWithValueSemanticsArray (ty));
1470
+ mlirMembers.push_back (converter. convertType (ty));
1475
1471
break ;
1476
1472
// Unions are lowered as only the largest member.
1477
1473
case cir::StructType::Union: {
1478
1474
auto largestMember = type.getLargestMember (dataLayout);
1479
1475
if (largestMember)
1480
- mlirMembers.push_back (convertWithValueSemanticsArray (largestMember));
1476
+ mlirMembers.push_back (converter. convertType (largestMember));
1481
1477
break ;
1482
1478
}
1483
1479
}
0 commit comments