Skip to content

Commit 60187d1

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 e776e31 commit 60187d1

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
@@ -572,7 +572,7 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::ConstArrayAttr constArr,
572572
auto loc = parentOp->getLoc();
573573
mlir::Value result;
574574

575-
if (auto zeros = constArr.getTrailingZerosNum()) {
575+
if (constArr.getTrailingZerosNum()) {
576576
auto arrayTy = constArr.getType();
577577
result = rewriter.create<mlir::LLVM::ZeroOp>(
578578
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
@@ -1372,7 +1372,7 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
13721372
patterns.getContext());
13731373
}
13741374

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

14391466
return converter;
14401467
}
14411468

14421469
void ConvertCIRToMLIRPass::runOnOperation() {
14431470
auto module = getOperation();
1444-
1445-
auto converter = prepareTypeConverter();
1471+
mlir::DataLayout dataLayout{module};
1472+
auto converter = prepareTypeConverter(dataLayout);
14461473

14471474
mlir::RewritePatternSet patterns(&getContext());
14481475

0 commit comments

Comments
 (0)