diff --git a/clang/lib/CIR/CodeGen/CIRGenExprConst.cpp b/clang/lib/CIR/CodeGen/CIRGenExprConst.cpp index afa198b1e6d9..9887fff7efeb 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprConst.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprConst.cpp @@ -956,7 +956,6 @@ buildArrayConstant(CIRGenModule &CGM, mlir::Type DesiredType, // Add a zeroinitializer array filler if we have lots of trailing zeroes. unsigned TrailingZeroes = ArrayBound - NonzeroLength; if (TrailingZeroes >= 8) { - //assert(0 && "NYE"); assert(Elements.size() >= NonzeroLength && "missing initializer for non-zero element"); diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 4baaf0914596..000f638f56f5 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -2297,7 +2297,7 @@ ::mlir::Attribute ConstArrayAttr::parse(::mlir::AsmParser &parser, } int zeros = 0; - if (parser.parseComma().succeeded()) { + if (parser.parseOptionalComma().succeeded()) { if (parser.parseInteger(zeros).failed()) return {}; if (parser.parseOptionalKeyword("zeros")) diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 188159cb2e4a..20ea6676900b 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -999,12 +999,12 @@ convertToDenseElementsAttr(mlir::cir::ConstArrayAttr attr, } bool hasTrailingZeros(mlir::cir::ConstArrayAttr attr) { - auto array = attr.getElts().cast(); + auto array = attr.getElts().dyn_cast(); return attr.hasTrailingZeros() || - std::count_if(array.begin(), array.end(), [](auto elt) { + (array && std::count_if(array.begin(), array.end(), [](auto elt) { auto ar = dyn_cast(elt); return ar && hasTrailingZeros(ar); - }); + })); } std::optional diff --git a/clang/test/CIR/CodeGen/const-array.c b/clang/test/CIR/CodeGen/const-array.c new file mode 100644 index 000000000000..42162f50ac6c --- /dev/null +++ b/clang/test/CIR/CodeGen/const-array.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-cir %s -o - | FileCheck %s + +void foo() { + int a[10] = {1}; +} + +// CHECK: cir.func {{.*@foo}} +// CHECK: %0 = cir.alloca !cir.array, cir.ptr >, ["a"] {alignment = 16 : i64} +// CHECK: %1 = cir.const(#cir.const_array<[#cir.int<1> : !s32i], 9 zeros> : !cir.array) : !cir.array +// CHECK: cir.store %1, %0 : !cir.array, cir.ptr > diff --git a/clang/test/CIR/Lowering/const.cir b/clang/test/CIR/Lowering/const.cir index 62d0b1aa2e64..4da51ee8e67f 100644 --- a/clang/test/CIR/Lowering/const.cir +++ b/clang/test/CIR/Lowering/const.cir @@ -15,4 +15,18 @@ module { // CHECK: cir.llvmir.zeroinit : !llvm.array<3 x i32> cir.return } + + cir.func @testArrWithTrailingZeros() { + %0 = cir.alloca !cir.array, cir.ptr >, ["a"] {alignment = 16 : i64} + %1 = cir.const(#cir.const_array<[#cir.int<1> : !s32i], 9 zeros> : !cir.array) : !cir.array + cir.store %1, %0 : !cir.array, cir.ptr > + cir.return + } + // CHECK: llvm.func @testArrWithTrailingZeros() + // CHECK: %0 = llvm.mlir.constant(1 : index) : i64 + // CHECK: %1 = llvm.alloca %0 x !llvm.array<10 x i32> {alignment = 16 : i64} : (i64) -> !llvm.ptr + // CHECK: %2 = cir.llvmir.zeroinit : !llvm.array<10 x i32> + // CHECK: %3 = llvm.mlir.constant(1 : i32) : i32 + // CHECK: %4 = llvm.insertvalue %3, %2[0] : !llvm.array<10 x i32> + }