@@ -1460,7 +1460,7 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
1460
1460
shape.push_back (arrayType.getSize ());
1461
1461
curType = arrayType.getEltType ();
1462
1462
}
1463
- auto elementType = converter. convertType ( curType);
1463
+ auto elementType = convertTypeForMemory (converter, curType);
1464
1464
// FIXME: The element type might not be converted
1465
1465
if (!elementType)
1466
1466
return nullptr ;
@@ -1475,13 +1475,17 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
1475
1475
mlir::TypeConverter prepareTypeConverter (mlir::DataLayout &dataLayout) {
1476
1476
mlir::TypeConverter converter;
1477
1477
converter.addConversion ([&](cir::PointerType type) -> mlir::Type {
1478
- auto ty = convertTypeForMemory (converter, type.getPointee ());
1478
+ auto pointeeType = type.getPointee ();
1479
+ if (mlir::isa<cir::ArrayType>(pointeeType))
1480
+ // A pointer to an array gives the array a reference semantics, lower to a
1481
+ // memref.
1482
+ return lowerArrayType (mlir::cast<cir::ArrayType>(pointeeType),
1483
+ /* hasValueSemantics */ false , converter);
1484
+ auto ty = convertTypeForMemory (converter, pointeeType);
1479
1485
// FIXME: The pointee type might not be converted (e.g. struct)
1480
1486
if (!ty)
1481
1487
return nullptr ;
1482
- if (isa<cir::ArrayType>(type.getPointee ()))
1483
- // An array is already lowered as a memref with reference semantics
1484
- return ty;
1488
+ // Each level of pointer becomes a level of memref
1485
1489
return mlir::MemRefType::get ({}, ty);
1486
1490
});
1487
1491
converter.addConversion (
@@ -1520,23 +1524,15 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
1520
1524
return mlir::BFloat16Type::get (type.getContext ());
1521
1525
});
1522
1526
converter.addConversion ([&](cir::ArrayType type) -> mlir::Type {
1523
- // Arrays in C/C++ have a reference semantics when not in a
1524
- // class/struct/union, so use a memref .
1525
- return lowerArrayType (type, /* hasValueSemantics */ false , converter);
1527
+ // Assume we are in a class/struct/union context with value semantics, so
1528
+ // lower as a tensor .
1529
+ return lowerArrayType (type, /* hasValueSemantics */ true , converter);
1526
1530
});
1527
1531
converter.addConversion ([&](cir::VectorType type) -> mlir::Type {
1528
1532
auto ty = converter.convertType (type.getEltType ());
1529
1533
return mlir::VectorType::get (type.getSize (), ty);
1530
1534
});
1531
1535
converter.addConversion ([&](cir::StructType type) -> mlir::Type {
1532
- auto convertWithValueSemanticsArray = [&](mlir::Type t) {
1533
- if (mlir::isa<cir::ArrayType>(t))
1534
- // Inside a class/struct/union, an array has value semantics and is
1535
- // lowered as a tensor.
1536
- return lowerArrayType (mlir::cast<cir::ArrayType>(t),
1537
- /* hasValueSemantics */ true , converter);
1538
- return converter.convertType (t);
1539
- };
1540
1536
// FIXME(cir): create separate unions, struct, and classes types.
1541
1537
// Convert struct members.
1542
1538
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1545,13 +1541,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
1545
1541
// TODO(cir): This should be properly validated.
1546
1542
case cir::StructType::Struct:
1547
1543
for (auto ty : type.getMembers ())
1548
- mlirMembers.push_back (convertWithValueSemanticsArray (ty));
1544
+ mlirMembers.push_back (converter. convertType (ty));
1549
1545
break ;
1550
1546
// Unions are lowered as only the largest member.
1551
1547
case cir::StructType::Union: {
1552
1548
auto largestMember = type.getLargestMember (dataLayout);
1553
1549
if (largestMember)
1554
- mlirMembers.push_back (convertWithValueSemanticsArray (largestMember));
1550
+ mlirMembers.push_back (converter. convertType (largestMember));
1555
1551
break ;
1556
1552
}
1557
1553
}
0 commit comments