Skip to content

Commit bbefd33

Browse files
authored
[CIR] Implement CXXScalarValueInitExpr for ComplexType (#147143)
Implement CXXScalarValueInitExpr support for ComplexType #141365
1 parent fcc09b6 commit bbefd33

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenExprComplex.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class ComplexExprEmitter : public StmtVisitor<ComplexExprEmitter, mlir::Value> {
4747
mlir::Value VisitCallExpr(const CallExpr *e);
4848
mlir::Value VisitCastExpr(CastExpr *e);
4949
mlir::Value VisitChooseExpr(ChooseExpr *e);
50+
mlir::Value VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *e);
5051
mlir::Value VisitDeclRefExpr(DeclRefExpr *e);
5152
mlir::Value VisitGenericSelectionExpr(GenericSelectionExpr *e);
5253
mlir::Value VisitImplicitCastExpr(ImplicitCastExpr *e);
@@ -201,6 +202,13 @@ mlir::Value ComplexExprEmitter::VisitChooseExpr(ChooseExpr *e) {
201202
return Visit(e->getChosenSubExpr());
202203
}
203204

205+
mlir::Value
206+
ComplexExprEmitter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *e) {
207+
mlir::Location loc = cgf.getLoc(e->getExprLoc());
208+
mlir::Type complexTy = cgf.convertType(e->getType());
209+
return builder.getNullValue(complexTy, loc);
210+
}
211+
204212
mlir::Value ComplexExprEmitter::VisitDeclRefExpr(DeclRefExpr *e) {
205213
if (CIRGenFunction::ConstantEmission constant = cgf.tryEmitAsConstant(e))
206214
return emitConstant(constant, e);

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,10 +1044,19 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
10441044
getTypeConverter()));
10451045
return mlir::success();
10461046
} else if (auto complexTy = mlir::dyn_cast<cir::ComplexType>(op.getType())) {
1047-
auto complexAttr = mlir::cast<cir::ConstComplexAttr>(op.getValue());
10481047
mlir::Type complexElemTy = complexTy.getElementType();
10491048
mlir::Type complexElemLLVMTy = typeConverter->convertType(complexElemTy);
10501049

1050+
if (auto zeroInitAttr = mlir::dyn_cast<cir::ZeroAttr>(op.getValue())) {
1051+
mlir::TypedAttr zeroAttr = rewriter.getZeroAttr(complexElemLLVMTy);
1052+
mlir::ArrayAttr array = rewriter.getArrayAttr({zeroAttr, zeroAttr});
1053+
rewriter.replaceOpWithNewOp<mlir::LLVM::ConstantOp>(
1054+
op, getTypeConverter()->convertType(op.getType()), array);
1055+
return mlir::success();
1056+
}
1057+
1058+
auto complexAttr = mlir::cast<cir::ConstComplexAttr>(op.getValue());
1059+
10511060
mlir::Attribute components[2];
10521061
if (mlir::isa<cir::IntType>(complexElemTy)) {
10531062
components[0] = rewriter.getIntegerAttr(

clang/test/CIR/CodeGen/complex.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,24 @@ void foo27(bool cond, int _Complex a, int _Complex b) {
717717
// OGCG: store i32 %[[REAL]], ptr %[[RESULT_REAL_PTR]], align 4
718718
// OGCG: store i32 %[[IMAG]], ptr %[[RESULT_IMAG_PTR]], align 4
719719

720+
void foo28() {
721+
using IntComplex = int _Complex;
722+
int _Complex a = IntComplex();
723+
}
724+
725+
// CIR: %[[INIT:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["a", init]
726+
// CIR: %[[COMPLEX:.*]] = cir.const #cir.zero : !cir.complex<!s32i>
727+
// CIR: cir.store align(4) %[[COMPLEX]], %[[INIT]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
728+
729+
// LLVM: %[[INIT:.*]] = alloca { i32, i32 }, i64 1, align 4
730+
// LLVM: store { i32, i32 } zeroinitializer, ptr %[[INIT]], align 4
731+
732+
// OGCG: %[[INIT:.*]] = alloca { i32, i32 }, align 4
733+
// OGCG: %[[INIT_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[INIT]], i32 0, i32 0
734+
// OGCG: %[[INIT_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[INIT]], i32 0, i32 1
735+
// OGCG: store i32 0, ptr %[[INIT_REAL_PTR]], align 4
736+
// OGCG: store i32 0, ptr %[[INIT_IMAG_PTR]], align 4
737+
720738
void foo29() {
721739
using IntComplex = int _Complex;
722740
int _Complex a = IntComplex{};

0 commit comments

Comments
 (0)