Skip to content

Commit 2861ff3

Browse files
committed
[CIR] Lower struct/union/class to tuple
Forward the data layout to the type converter. This is not a current solution since it is not possible for now to have a memref of tuple in MLIR yet.
1 parent 5ac8751 commit 2861ff3

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

clang/include/clang/CIR/LowerToMLIR.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace cir {
1919

2020
void populateCIRLoopToSCFConversionPatterns(mlir::RewritePatternSet &patterns,
2121
mlir::TypeConverter &converter);
22-
mlir::TypeConverter prepareTypeConverter();
22+
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout);
2323
void runAtStartOfConvertCIRToMLIRPass(std::function<void(mlir::ConversionTarget)>);
2424
} // namespace cir
2525

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ mlir::Value CirAttrToValue::visitCirAttr(cir::ConstArrayAttr constArr) {
577577
auto loc = parentOp->getLoc();
578578
mlir::Value result;
579579

580-
if (auto zeros = constArr.getTrailingZerosNum()) {
580+
if (constArr.getTrailingZerosNum()) {
581581
auto arrayTy = constArr.getType();
582582
result = rewriter.create<mlir::LLVM::ZeroOp>(
583583
loc, converter->convertType(arrayTy));

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,7 +1379,7 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
13791379
patterns.getContext());
13801380
}
13811381

1382-
mlir::TypeConverter prepareTypeConverter() {
1382+
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
13831383
mlir::TypeConverter converter;
13841384
converter.addConversion([&](cir::PointerType type) -> mlir::Type {
13851385
auto ty = convertTypeForMemory(converter, type.getPointee());
@@ -1442,14 +1442,41 @@ mlir::TypeConverter prepareTypeConverter() {
14421442
auto ty = converter.convertType(type.getEltType());
14431443
return mlir::VectorType::get(type.getSize(), ty);
14441444
});
1445+
converter.addConversion([&](cir::StructType type) -> mlir::Type {
1446+
// FIXME(cir): create separate unions, struct, and classes types.
1447+
// Convert struct members.
1448+
llvm::SmallVector<mlir::Type> mlirMembers;
1449+
switch (type.getKind()) {
1450+
case cir::StructType::Class:
1451+
// TODO(cir): This should be properly validated.
1452+
case cir::StructType::Struct:
1453+
for (auto ty : type.getMembers())
1454+
mlirMembers.push_back(converter.convertType(ty));
1455+
break;
1456+
// Unions are lowered as only the largest member.
1457+
case cir::StructType::Union: {
1458+
auto largestMember = type.getLargestMember(dataLayout);
1459+
if (largestMember)
1460+
mlirMembers.push_back(converter.convertType(largestMember));
1461+
break;
1462+
}
1463+
}
1464+
1465+
// Struct has a name: lower as an identified struct.
1466+
mlir::TupleType tuple;
1467+
// FIXME(cir): all the following has to be somehow kept. With some
1468+
// attributes?
1469+
tuple = mlir::TupleType::get(type.getContext(), mlirMembers);
1470+
return tuple;
1471+
});
14451472

14461473
return converter;
14471474
}
14481475

14491476
void ConvertCIRToMLIRPass::runOnOperation() {
14501477
auto module = getOperation();
1451-
1452-
auto converter = prepareTypeConverter();
1478+
mlir::DataLayout dataLayout{module};
1479+
auto converter = prepareTypeConverter(dataLayout);
14531480

14541481
mlir::RewritePatternSet patterns(&getContext());
14551482

0 commit comments

Comments
 (0)