Skip to content

Commit 98b2e88

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 0d3fa2d commit 98b2e88

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
@@ -20,7 +20,7 @@ namespace cir {
2020
void populateCIRLoopToSCFConversionPatterns(mlir::RewritePatternSet &patterns,
2121
mlir::TypeConverter &converter);
2222

23-
mlir::TypeConverter prepareTypeConverter();
23+
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout);
2424

2525
void runAtStartOfConvertCIRToMLIRPass(std::function<void(mlir::ConversionTarget)>);
2626

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

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

587-
if (auto zeros = constArr.getTrailingZerosNum()) {
587+
if (constArr.getTrailingZerosNum()) {
588588
auto arrayTy = constArr.getType();
589589
result = rewriter.create<mlir::LLVM::ZeroOp>(
590590
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
@@ -1378,7 +1378,7 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
13781378
patterns.getContext());
13791379
}
13801380

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

14451472
return converter;
14461473
}
14471474

14481475
void ConvertCIRToMLIRPass::runOnOperation() {
14491476
auto module = getOperation();
1450-
1451-
auto converter = prepareTypeConverter();
1477+
mlir::DataLayout dataLayout{module};
1478+
auto converter = prepareTypeConverter(dataLayout);
14521479

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

0 commit comments

Comments
 (0)