@@ -1466,7 +1466,7 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
1466
1466
shape.push_back (arrayType.getSize ());
1467
1467
curType = arrayType.getEltType ();
1468
1468
}
1469
- auto elementType = converter. convertType ( curType);
1469
+ auto elementType = convertTypeForMemory (converter, curType);
1470
1470
// FIXME: The element type might not be converted
1471
1471
if (!elementType)
1472
1472
return nullptr ;
@@ -1481,13 +1481,17 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
1481
1481
mlir::TypeConverter prepareTypeConverter (mlir::DataLayout &dataLayout) {
1482
1482
mlir::TypeConverter converter;
1483
1483
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);
1485
1491
// FIXME: The pointee type might not be converted (e.g. struct)
1486
1492
if (!ty)
1487
1493
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
1491
1495
return mlir::MemRefType::get ({}, ty);
1492
1496
});
1493
1497
converter.addConversion (
@@ -1526,23 +1530,15 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
1526
1530
return mlir::BFloat16Type::get (type.getContext ());
1527
1531
});
1528
1532
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);
1532
1536
});
1533
1537
converter.addConversion ([&](cir::VectorType type) -> mlir::Type {
1534
1538
auto ty = converter.convertType (type.getEltType ());
1535
1539
return mlir::VectorType::get (type.getSize (), ty);
1536
1540
});
1537
1541
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
- };
1546
1542
// FIXME(cir): create separate unions, struct, and classes types.
1547
1543
// Convert struct members.
1548
1544
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1551,13 +1547,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
1551
1547
// TODO(cir): This should be properly validated.
1552
1548
case cir::StructType::Struct:
1553
1549
for (auto ty : type.getMembers ())
1554
- mlirMembers.push_back (convertWithValueSemanticsArray (ty));
1550
+ mlirMembers.push_back (converter. convertType (ty));
1555
1551
break ;
1556
1552
// Unions are lowered as only the largest member.
1557
1553
case cir::StructType::Union: {
1558
1554
auto largestMember = type.getLargestMember (dataLayout);
1559
1555
if (largestMember)
1560
- mlirMembers.push_back (convertWithValueSemanticsArray (largestMember));
1556
+ mlirMembers.push_back (converter. convertType (largestMember));
1561
1557
break ;
1562
1558
}
1563
1559
}
0 commit comments