Skip to content

Commit 1097f87

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 c1ddaff commit 1097f87

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
@@ -1399,16 +1399,15 @@ mlir::Type lowerArrayType(cir::ArrayType type, bool hasValueSemantics,
13991399
mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14001400
mlir::TypeConverter converter;
14011401
converter.addConversion([&](cir::PointerType type) -> mlir::Type {
1402-
auto pointeeType = type.getPointee();
1403-
if (mlir::isa<cir::ArrayType>(pointeeType))
1404-
// A pointer to an array gives the array a reference semantics, lower to a
1405-
// memref.
1406-
return lowerArrayType(mlir::cast<cir::ArrayType>(pointeeType),
1407-
/* hasValueSemantics */ false, converter);
1408-
auto ty = convertTypeForMemory(converter, pointeeType);
1409-
// FIXME: The pointee type might not be converted (e.g. struct)
1402+
auto ty = convertTypeForMemory(
1403+
converter, type.getPointee()); // FIXME: The pointee type might not be
1404+
// converted (e.g. struct)
14101405
if (!ty)
14111406
return nullptr;
1407+
if (isa<cir::ArrayType>(type.getPointee()))
1408+
// An array is already lowered as a memref with reference semantics by
1409+
// default
1410+
return ty;
14121411
// Each level of pointer becomes a level of memref
14131412
return mlir::MemRefType::get({}, ty);
14141413
});
@@ -1448,15 +1447,23 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14481447
return mlir::BFloat16Type::get(type.getContext());
14491448
});
14501449
converter.addConversion([&](cir::ArrayType type) -> mlir::Type {
1451-
// Assume we are in a class/struct/union context with value semantics, so
1452-
// lower as a tensor.
1453-
return lowerArrayType(type, /* hasValueSemantics */ true, converter);
1450+
// Assume we are not in a class/struct/union context with value semantics,
1451+
// so lower it as a memref to provide reference semantics.
1452+
return lowerArrayType(type, /* hasValueSemantics */ false, converter);
14541453
});
14551454
converter.addConversion([&](cir::VectorType type) -> mlir::Type {
14561455
auto ty = converter.convertType(type.getEltType());
14571456
return mlir::VectorType::get(type.getSize(), ty);
14581457
});
14591458
converter.addConversion([&](cir::StructType type) -> mlir::Type {
1459+
auto convertWithValueSemanticsArray = [&](mlir::Type t) {
1460+
if (mlir::isa<cir::ArrayType>(t))
1461+
// Inside a class/struct/union, an array has value semantics and is
1462+
// lowered as a tensor.
1463+
return lowerArrayType(mlir::cast<cir::ArrayType>(t),
1464+
/* hasValueSemantics */ true, converter);
1465+
return converter.convertType(t);
1466+
};
14601467
// FIXME(cir): create separate unions, struct, and classes types.
14611468
// Convert struct members.
14621469
llvm::SmallVector<mlir::Type> mlirMembers;
@@ -1465,13 +1472,13 @@ mlir::TypeConverter prepareTypeConverter(mlir::DataLayout &dataLayout) {
14651472
// TODO(cir): This should be properly validated.
14661473
case cir::StructType::Struct:
14671474
for (auto ty : type.getMembers())
1468-
mlirMembers.push_back(converter.convertType(ty));
1475+
mlirMembers.push_back(convertWithValueSemanticsArray(ty));
14691476
break;
14701477
// Unions are lowered as only the largest member.
14711478
case cir::StructType::Union: {
14721479
auto largestMember = type.getLargestMember(dataLayout);
14731480
if (largestMember)
1474-
mlirMembers.push_back(converter.convertType(largestMember));
1481+
mlirMembers.push_back(convertWithValueSemanticsArray(largestMember));
14751482
break;
14761483
}
14771484
}

0 commit comments

Comments
 (0)