@@ -452,8 +452,8 @@ class CirAttrToValue {
452452 .Case <cir::IntAttr, cir::FPAttr, cir::ConstPtrAttr,
453453 cir::ConstRecordAttr, cir::ConstArrayAttr, cir::ConstVectorAttr,
454454 cir::BoolAttr, cir::ZeroAttr, cir::UndefAttr, cir::PoisonAttr,
455- cir::GlobalViewAttr, cir::VTableAttr, cir::TypeInfoAttr>(
456- [&](auto attrT) { return visitCirAttr (attrT); })
455+ cir::GlobalViewAttr, cir::VTableAttr, cir::TypeInfoAttr,
456+ cir::ComplexAttr>( [&](auto attrT) { return visitCirAttr (attrT); })
457457 .Default ([&](auto attrT) { return mlir::Value (); });
458458 }
459459
@@ -463,6 +463,7 @@ class CirAttrToValue {
463463 mlir::Value visitCirAttr (cir::ConstRecordAttr attr);
464464 mlir::Value visitCirAttr (cir::ConstArrayAttr attr);
465465 mlir::Value visitCirAttr (cir::ConstVectorAttr attr);
466+ mlir::Value visitCirAttr (cir::ComplexAttr attr);
466467 mlir::Value visitCirAttr (cir::BoolAttr attr);
467468 mlir::Value visitCirAttr (cir::ZeroAttr attr);
468469 mlir::Value visitCirAttr (cir::UndefAttr attr);
@@ -647,6 +648,33 @@ mlir::Value CirAttrToValue::visitCirAttr(cir::ConstVectorAttr constVec) {
647648 mlirValues));
648649}
649650
651+ mlir::Value CirAttrToValue::visitCirAttr (cir::ComplexAttr complexAttr) {
652+ auto complexType = mlir::cast<cir::ComplexType>(complexAttr.getType ());
653+ mlir::Type complexElemTy = complexType.getElementType ();
654+ mlir::Type complexElemLLVMTy = converter->convertType (complexElemTy);
655+
656+ mlir::Attribute components[2 ];
657+ if (const auto intType = mlir::dyn_cast<cir::IntType>(complexElemTy)) {
658+ components[0 ] = rewriter.getIntegerAttr (
659+ complexElemLLVMTy,
660+ mlir::cast<cir::IntAttr>(complexAttr.getReal ()).getValue ());
661+ components[1 ] = rewriter.getIntegerAttr (
662+ complexElemLLVMTy,
663+ mlir::cast<cir::IntAttr>(complexAttr.getImag ()).getValue ());
664+ } else {
665+ components[0 ] = rewriter.getFloatAttr (
666+ complexElemLLVMTy,
667+ mlir::cast<cir::FPAttr>(complexAttr.getReal ()).getValue ());
668+ components[1 ] = rewriter.getFloatAttr (
669+ complexElemLLVMTy,
670+ mlir::cast<cir::FPAttr>(complexAttr.getImag ()).getValue ());
671+ }
672+
673+ mlir::Location loc = parentOp->getLoc ();
674+ return rewriter.create <mlir::LLVM::ConstantOp>(
675+ loc, converter->convertType (complexAttr.getType ()),
676+ rewriter.getArrayAttr (components));
677+ }
650678// GlobalViewAttr visitor.
651679mlir::Value CirAttrToValue::visitCirAttr (cir::GlobalViewAttr globalAttr) {
652680 auto module = parentOp->getParentOfType <mlir::ModuleOp>();
@@ -2419,6 +2447,9 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::lowerInitializer(
24192447 } else if (mlir::isa<cir::ConstVectorAttr>(init)) {
24202448 return lowerInitializerForConstVector (rewriter, op, init,
24212449 useInitializerRegion);
2450+ } else if (mlir::isa<cir::ComplexAttr>(init)) {
2451+ return lowerInitializerForConstComplex (rewriter, op, init,
2452+ useInitializerRegion);
24222453 } else if (auto dataMemberAttr = mlir::dyn_cast<cir::DataMemberAttr>(init)) {
24232454 assert (lowerMod && " lower module is not available" );
24242455 mlir::DataLayout layout (op->getParentOfType <mlir::ModuleOp>());
@@ -2455,6 +2486,19 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::lowerInitializerForConstVector(
24552486 return mlir::failure ();
24562487}
24572488
2489+ mlir::LogicalResult CIRToLLVMGlobalOpLowering::lowerInitializerForConstComplex (
2490+ mlir::ConversionPatternRewriter &rewriter, cir::GlobalOp op,
2491+ mlir::Attribute &init, bool &useInitializerRegion) const {
2492+ auto constVec = mlir::cast<cir::ComplexAttr>(init);
2493+ if (auto val = lowerConstComplexAttr (constVec, getTypeConverter ());
2494+ val.has_value ()) {
2495+ init = val.value ();
2496+ useInitializerRegion = false ;
2497+ } else
2498+ useInitializerRegion = true ;
2499+ return mlir::success ();
2500+ }
2501+
24582502mlir::LogicalResult CIRToLLVMGlobalOpLowering::lowerInitializerForConstArray (
24592503 mlir::ConversionPatternRewriter &rewriter, cir::GlobalOp op,
24602504 mlir::Attribute &init, bool &useInitializerRegion) const {
0 commit comments