[llvm-branch-commits] [clang] 62eea86 - [CIR] Update isSized with upstreamed types (#143960)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jun 13 11:01:58 PDT 2025
Author: Amr Hesham
Date: 2025-06-13T19:29:21+02:00
New Revision: 62eea86424c4eacd38ad8a03f4bdae78687e3ade
URL: https://github.com/llvm/llvm-project/commit/62eea86424c4eacd38ad8a03f4bdae78687e3ade
DIFF: https://github.com/llvm/llvm-project/commit/62eea86424c4eacd38ad8a03f4bdae78687e3ade.diff
LOG: [CIR] Update isSized with upstreamed types (#143960)
Update `isSized` function with the upstreamed types
Added:
Modified:
clang/lib/CIR/CodeGen/CIRGenBuilder.h
clang/lib/CIR/CodeGen/CIRGenTypes.cpp
clang/test/CIR/CodeGen/array.cpp
Removed:
################################################################################
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
index 36c89809b4d90..a4bc69619d60c 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h
+++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
@@ -139,8 +139,9 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
}
bool isSized(mlir::Type ty) {
- if (mlir::isa<cir::PointerType, cir::ArrayType, cir::BoolType,
- cir::IntType>(ty))
+ if (mlir::isa<cir::PointerType, cir::ArrayType, cir::BoolType, cir::IntType,
+ cir::CIRFPTypeInterface, cir::ComplexType, cir::RecordType>(
+ ty))
return true;
if (const auto vt = mlir::dyn_cast<cir::VectorType>(ty))
diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
index eaba3dfd1105e..bab47924dd719 100644
--- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
@@ -419,6 +419,15 @@ mlir::Type CIRGenTypes::convertType(QualType type) {
case Type::ConstantArray: {
const ConstantArrayType *arrTy = cast<ConstantArrayType>(ty);
mlir::Type elemTy = convertTypeForMem(arrTy->getElementType());
+
+ // TODO(CIR): In LLVM, "lower arrays of undefined struct type to arrays of
+ // i8 just to have a concrete type"
+ if (!builder.isSized(elemTy)) {
+ cgm.errorNYI(SourceLocation(), "arrays of undefined struct type", type);
+ resultType = cgm.UInt32Ty;
+ break;
+ }
+
resultType = cir::ArrayType::get(elemTy, arrTy->getSize().getZExtValue());
break;
}
@@ -432,8 +441,8 @@ mlir::Type CIRGenTypes::convertType(QualType type) {
}
case Type::Enum: {
- const EnumDecl *ED = cast<EnumType>(ty)->getDecl();
- if (auto integerType = ED->getIntegerType(); !integerType.isNull())
+ const EnumDecl *ed = cast<EnumType>(ty)->getDecl();
+ if (auto integerType = ed->getIntegerType(); !integerType.isNull())
return convertType(integerType);
// Return a placeholder 'i32' type. This can be changed later when the
// type is defined (see UpdateCompletedType), but is likely to be the
diff --git a/clang/test/CIR/CodeGen/array.cpp b/clang/test/CIR/CodeGen/array.cpp
index 7b90c1682ec45..26e172a006451 100644
--- a/clang/test/CIR/CodeGen/array.cpp
+++ b/clang/test/CIR/CodeGen/array.cpp
@@ -473,3 +473,26 @@ void func10(int *a) {
// OGCG: %[[ELE:.*]] = getelementptr inbounds i32, ptr %[[TMP_1]], i64 5
// OGCG: %[[TMP_2:.*]] = load i32, ptr %[[ELE]], align 4
// OGCG: store i32 %[[TMP_2]], ptr %[[INIT]], align 4
+
+void func11() { int _Complex a[4]; }
+
+// CIR: %[[ARR:.*]] = cir.alloca !cir.array<!cir.complex<!s32i> x 4>, !cir.ptr<!cir.array<!cir.complex<!s32i> x 4>>, ["a"]
+
+// LLVM: %[[ARR:.*]] = alloca [4 x { i32, i32 }], i64 1, align 16
+
+// OGCG: %[[ARR:.*]] = alloca [4 x { i32, i32 }], align 16
+
+void func12() {
+ struct Point {
+ int x;
+ int y;
+ };
+
+ Point a[4];
+}
+
+// CIR: %[[ARR:.*]] = cir.alloca !cir.array<!rec_Point x 4>, !cir.ptr<!cir.array<!rec_Point x 4>>, ["a"]
+
+// LLVM: %[[ARR:.*]] = alloca [4 x %struct.Point], i64 1, align 16
+
+// OGCG: %[[ARR:.*]] = alloca [4 x %struct.Point], align 16
More information about the llvm-branch-commits
mailing list