diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 5e4a3d6eb26063..72eca4f76c764e 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -9,7 +9,6 @@ // This file implements lowering of CIR operations to LLVMIR. // //===----------------------------------------------------------------------===// - #include "mlir/Conversion/AffineToStandard/AffineToStandard.h" #include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h" #include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h" @@ -1076,6 +1075,17 @@ class CIRConstantLowering rewriter.replaceAllUsesWith(op, initVal); rewriter.eraseOp(op); return mlir::success(); + } else if (auto strTy = op.getType().dyn_cast()) { + if (auto zero = op.getValue().dyn_cast()) { + auto initVal = + lowerCirAttrAsValue(op, zero, rewriter, typeConverter); + rewriter.replaceAllUsesWith(op, initVal); + rewriter.eraseOp(op); + return mlir::success(); + } + + return op.emitError() + << "unsupported lowering for struct constant type " << op.getType(); } else return op.emitError() << "unsupported constant type " << op.getType(); diff --git a/clang/test/CIR/Lowering/struct-init.c b/clang/test/CIR/Lowering/struct-init.c new file mode 100644 index 00000000000000..3c94cf9d5f5023 --- /dev/null +++ b/clang/test/CIR/Lowering/struct-init.c @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM +struct S { + int x; +}; + +// LLVM: define void @zeroInit +// LLVM: [[TMP0:%.*]] = alloca %struct.S, i64 1 +// LLVM: store %struct.S zeroinitializer, ptr [[TMP0]] +void zeroInit() { + struct S s = {0}; +}