Skip to content

Commit da4dbe2

Browse files
committed
[CIR][Lowering][MLIR] Lower class/struct/union to memref by default
Just keep the lowering inside a named_type as a tensor. This fix cir.alloca lowering issue.
1 parent 4a4e8fa commit da4dbe2

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

clang/include/clang/CIR/LowerToMLIR.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
#ifndef CLANG_CIR_LOWERTOMLIR_H
1313
#define CLANG_CIR_LOWERTOMLIR_H
1414

15-
#include "clang/CIR/Dialect/IR/CIRTypes.h"
1615
#include "mlir/Interfaces/DataLayoutInterfaces.h"
1716
#include "mlir/Transforms/DialectConversion.h"
17+
#include "clang/CIR/Dialect/IR/CIRTypes.h"
1818
#include <functional>
1919

2020
namespace cir {

clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,16 +1479,15 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
14791479
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14801480
mlir::TypeConverter converter;
14811481
converter.addConversion([&](cir::PointerType type) -> mlir::Type {
1482-
auto pointeeType = type.getPointee();
1483-
if (mlir::isa<cir::ArrayType>(pointeeType))
1484-
// A pointer to an array gives the array a reference semantics, lower to a
1485-
// memref.
1486-
return lowerArrayType(mlir::cast<cir::ArrayType>(pointeeType),
1487-
/* hasValueSemantics */ false, converter);
1488-
auto ty = convertTypeForMemory(converter, pointeeType);
1489-
// FIXME: The pointee type might not be converted (e.g. struct)
1482+
auto ty = convertTypeForMemory(
1483+
converter, type.getPointee()); // FIXME: The pointee type might not be
1484+
// converted (e.g. struct)
14901485
if (!ty)
14911486
return nullptr;
1487+
if (isa<cir::ArrayType>(type.getPointee()))
1488+
// An array is already lowered as a memref with reference semantics by
1489+
// default
1490+
return ty;
14921491
// Each level of pointer becomes a level of memref
14931492
return mlir::MemRefType::get({}, ty);
14941493
});
@@ -1528,15 +1527,23 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
15281527
return mlir::BFloat16Type::get(type.getContext());
15291528
});
15301529
converter.addConversion([&](cir::ArrayType type) -> mlir::Type {
1531-
// Assume we are in a class/struct/union context with value semantics, so
1532-
// lower as a tensor.
1533-
return lowerArrayType(type, /* hasValueSemantics */ true, converter);
1530+
// Assume we are not in a class/struct/union context with value semantics,
1531+
// so lower it as a memref to provide reference semantics.
1532+
return lowerArrayType(type, /* hasValueSemantics */ false, converter);
15341533
});
15351534
converter.addConversion([&](cir::VectorType type) -> mlir::Type {
15361535
auto ty = converter.convertType(type.getEltType());
15371536
return mlir::VectorType::get(type.getSize(), ty);
15381537
});
15391538
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+
};
15401547
// FIXME(cir): create separate unions, struct, and classes types.
15411548
// Convert struct members.
15421549
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1545,13 +1552,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
15451552
// TODO(cir): This should be properly validated.
15461553
case cir::StructType::Struct:
15471554
for (auto ty : type.getMembers())
1548-
mlirMembers.push_back(converter.convertType(ty));
1555+
mlirMembers.push_back(convertWithValueSemanticsArray(ty));
15491556
break;
15501557
// Unions are lowered as only the largest member.
15511558
case cir::StructType::Union: {
15521559
auto largestMember = type.getLargestMember(dataLayout);
15531560
if (largestMember)
1554-
mlirMembers.push_back(converter.convertType(largestMember));
1561+
mlirMembers.push_back(convertWithValueSemanticsArray(largestMember));
15551562
break;
15561563
}
15571564
}

0 commit comments

Comments
 (0)