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