41
41
#include " mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
42
42
#include " mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
43
43
#include " mlir/Target/LLVMIR/Export.h"
44
+ #include " clang/CIR/Dialect/IR/CIRAttrVisitor.h"
44
45
#include " clang/CIR/Dialect/Passes.h"
45
46
#include " clang/CIR/LoweringHelpers.h"
46
47
#include " clang/CIR/MissingFeatures.h"
@@ -425,32 +426,52 @@ emitCirAttrToMemory(mlir::Operation *parentOp, mlir::Attribute attr,
425
426
}
426
427
427
428
// / Switches on the type of attribute and calls the appropriate conversion.
429
+ class CirAttrToValue : public CirAttrVisitor <CirAttrToValue, mlir::Value> {
430
+ public:
431
+ CirAttrToValue (mlir::Operation *parentOp,
432
+ mlir::ConversionPatternRewriter &rewriter,
433
+ const mlir::TypeConverter *converter,
434
+ mlir::DataLayout const &dataLayout)
435
+ : parentOp(parentOp), rewriter(rewriter), converter(converter),
436
+ dataLayout (dataLayout) {}
437
+
438
+ mlir::Value visitCirIntAttr (cir::IntAttr attr);
439
+ mlir::Value visitCirFPAttr (cir::FPAttr attr);
440
+ mlir::Value visitCirConstPtrAttr (cir::ConstPtrAttr attr);
441
+ mlir::Value visitCirConstStructAttr (cir::ConstStructAttr attr);
442
+ mlir::Value visitCirConstArrayAttr (cir::ConstArrayAttr attr);
443
+ mlir::Value visitCirConstVectorAttr (cir::ConstVectorAttr attr);
444
+ mlir::Value visitCirBoolAttr (cir::BoolAttr attr);
445
+ mlir::Value visitCirZeroAttr (cir::ZeroAttr attr);
446
+ mlir::Value visitCirUndefAttr (cir::UndefAttr attr);
447
+ mlir::Value visitCirPoisonAttr (cir::PoisonAttr attr);
448
+ mlir::Value visitCirGlobalViewAttr (cir::GlobalViewAttr attr);
449
+ mlir::Value visitCirVTableAttr (cir::VTableAttr attr);
450
+ mlir::Value visitCirTypeInfoAttr (cir::TypeInfoAttr attr);
451
+
452
+ private:
453
+ mlir::Operation *parentOp;
454
+ mlir::ConversionPatternRewriter &rewriter;
455
+ const mlir::TypeConverter *converter;
456
+ mlir::DataLayout const &dataLayout;
457
+ };
428
458
429
459
// / IntAttr visitor.
430
- static mlir::Value
431
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::IntAttr intAttr,
432
- mlir::ConversionPatternRewriter &rewriter,
433
- const mlir::TypeConverter *converter) {
460
+ mlir::Value CirAttrToValue::visitCirIntAttr (cir::IntAttr intAttr) {
434
461
auto loc = parentOp->getLoc ();
435
462
return rewriter.create <mlir::LLVM::ConstantOp>(
436
463
loc, converter->convertType (intAttr.getType ()), intAttr.getValue ());
437
464
}
438
465
439
466
// / BoolAttr visitor.
440
- static mlir::Value
441
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::BoolAttr boolAttr,
442
- mlir::ConversionPatternRewriter &rewriter,
443
- const mlir::TypeConverter *converter) {
467
+ mlir::Value CirAttrToValue::visitCirBoolAttr (cir::BoolAttr boolAttr) {
444
468
auto loc = parentOp->getLoc ();
445
469
return rewriter.create <mlir::LLVM::ConstantOp>(
446
470
loc, converter->convertType (boolAttr.getType ()), boolAttr.getValue ());
447
471
}
448
472
449
473
// / ConstPtrAttr visitor.
450
- static mlir::Value
451
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::ConstPtrAttr ptrAttr,
452
- mlir::ConversionPatternRewriter &rewriter,
453
- const mlir::TypeConverter *converter) {
474
+ mlir::Value CirAttrToValue::visitCirConstPtrAttr (cir::ConstPtrAttr ptrAttr) {
454
475
auto loc = parentOp->getLoc ();
455
476
if (ptrAttr.isNullValue ()) {
456
477
return rewriter.create <mlir::LLVM::ZeroOp>(
@@ -465,51 +486,36 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::ConstPtrAttr ptrAttr,
465
486
}
466
487
467
488
// / FPAttr visitor.
468
- static mlir::Value
469
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::FPAttr fltAttr,
470
- mlir::ConversionPatternRewriter &rewriter,
471
- const mlir::TypeConverter *converter) {
489
+ mlir::Value CirAttrToValue::visitCirFPAttr (cir::FPAttr fltAttr) {
472
490
auto loc = parentOp->getLoc ();
473
491
return rewriter.create <mlir::LLVM::ConstantOp>(
474
492
loc, converter->convertType (fltAttr.getType ()), fltAttr.getValue ());
475
493
}
476
494
477
495
// / ZeroAttr visitor.
478
- static mlir::Value
479
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::ZeroAttr zeroAttr,
480
- mlir::ConversionPatternRewriter &rewriter,
481
- const mlir::TypeConverter *converter) {
496
+ mlir::Value CirAttrToValue::visitCirZeroAttr (cir::ZeroAttr zeroAttr) {
482
497
auto loc = parentOp->getLoc ();
483
498
return rewriter.create <mlir::LLVM::ZeroOp>(
484
499
loc, converter->convertType (zeroAttr.getType ()));
485
500
}
486
501
487
502
// / UndefAttr visitor.
488
- static mlir::Value
489
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::UndefAttr undefAttr,
490
- mlir::ConversionPatternRewriter &rewriter,
491
- const mlir::TypeConverter *converter) {
503
+ mlir::Value CirAttrToValue::visitCirUndefAttr (cir::UndefAttr undefAttr) {
492
504
auto loc = parentOp->getLoc ();
493
505
return rewriter.create <mlir::LLVM::UndefOp>(
494
506
loc, converter->convertType (undefAttr.getType ()));
495
507
}
496
508
497
509
// / PoisonAttr visitor.
498
- static mlir::Value
499
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::PoisonAttr poisonAttr,
500
- mlir::ConversionPatternRewriter &rewriter,
501
- const mlir::TypeConverter *converter) {
510
+ mlir::Value CirAttrToValue::visitCirPoisonAttr (cir::PoisonAttr poisonAttr) {
502
511
auto loc = parentOp->getLoc ();
503
512
return rewriter.create <mlir::LLVM::PoisonOp>(
504
513
loc, converter->convertType (poisonAttr.getType ()));
505
514
}
506
515
507
516
// / ConstStruct visitor.
508
- static mlir::Value
509
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::ConstStructAttr constStruct,
510
- mlir::ConversionPatternRewriter &rewriter,
511
- const mlir::TypeConverter *converter,
512
- mlir::DataLayout const &dataLayout) {
517
+ mlir::Value
518
+ CirAttrToValue::visitCirConstStructAttr (cir::ConstStructAttr constStruct) {
513
519
auto llvmTy = converter->convertType (constStruct.getType ());
514
520
auto loc = parentOp->getLoc ();
515
521
mlir::Value result = rewriter.create <mlir::LLVM::UndefOp>(loc, llvmTy);
@@ -525,49 +531,37 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::ConstStructAttr constStruct,
525
531
}
526
532
527
533
// VTableAttr visitor.
528
- static mlir::Value
529
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::VTableAttr vtableArr,
530
- mlir::ConversionPatternRewriter &rewriter,
531
- const mlir::TypeConverter *converter,
532
- mlir::DataLayout const &dataLayout) {
534
+ mlir::Value CirAttrToValue::visitCirVTableAttr (cir::VTableAttr vtableArr) {
533
535
auto llvmTy = converter->convertType (vtableArr.getType ());
534
536
auto loc = parentOp->getLoc ();
535
537
mlir::Value result = rewriter.create <mlir::LLVM::UndefOp>(loc, llvmTy);
536
538
537
539
for (auto [idx, elt] : llvm::enumerate (vtableArr.getVtableData ())) {
538
- mlir::Value init =
539
- lowerCirAttrAsValue (parentOp, elt, rewriter, converter, dataLayout);
540
+ mlir::Value init = visit (elt);
540
541
result = rewriter.create <mlir::LLVM::InsertValueOp>(loc, result, init, idx);
541
542
}
542
543
543
544
return result;
544
545
}
545
546
546
547
// TypeInfoAttr visitor.
547
- static mlir::Value
548
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::TypeInfoAttr typeinfoArr,
549
- mlir::ConversionPatternRewriter &rewriter,
550
- const mlir::TypeConverter *converter,
551
- mlir::DataLayout const &dataLayout) {
548
+ mlir::Value
549
+ CirAttrToValue::visitCirTypeInfoAttr (cir::TypeInfoAttr typeinfoArr) {
552
550
auto llvmTy = converter->convertType (typeinfoArr.getType ());
553
551
auto loc = parentOp->getLoc ();
554
552
mlir::Value result = rewriter.create <mlir::LLVM::UndefOp>(loc, llvmTy);
555
553
556
554
for (auto [idx, elt] : llvm::enumerate (typeinfoArr.getData ())) {
557
- mlir::Value init =
558
- lowerCirAttrAsValue (parentOp, elt, rewriter, converter, dataLayout);
555
+ mlir::Value init = visit (elt);
559
556
result = rewriter.create <mlir::LLVM::InsertValueOp>(loc, result, init, idx);
560
557
}
561
558
562
559
return result;
563
560
}
564
561
565
562
// ConstArrayAttr visitor
566
- static mlir::Value
567
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::ConstArrayAttr constArr,
568
- mlir::ConversionPatternRewriter &rewriter,
569
- const mlir::TypeConverter *converter,
570
- mlir::DataLayout const &dataLayout) {
563
+ mlir::Value
564
+ CirAttrToValue::visitCirConstArrayAttr (cir::ConstArrayAttr constArr) {
571
565
auto llvmTy = converter->convertType (constArr.getType ());
572
566
auto loc = parentOp->getLoc ();
573
567
mlir::Value result;
@@ -610,10 +604,8 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::ConstArrayAttr constArr,
610
604
}
611
605
612
606
// ConstVectorAttr visitor.
613
- static mlir::Value
614
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::ConstVectorAttr constVec,
615
- mlir::ConversionPatternRewriter &rewriter,
616
- const mlir::TypeConverter *converter) {
607
+ mlir::Value
608
+ CirAttrToValue::visitCirConstVectorAttr (cir::ConstVectorAttr constVec) {
617
609
auto llvmTy = converter->convertType (constVec.getType ());
618
610
auto loc = parentOp->getLoc ();
619
611
SmallVector<mlir::Attribute> mlirValues;
@@ -638,11 +630,8 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::ConstVectorAttr constVec,
638
630
}
639
631
640
632
// GlobalViewAttr visitor.
641
- static mlir::Value
642
- lowerCirAttrAsValue (mlir::Operation *parentOp, cir::GlobalViewAttr globalAttr,
643
- mlir::ConversionPatternRewriter &rewriter,
644
- const mlir::TypeConverter *converter,
645
- mlir::DataLayout const &dataLayout) {
633
+ mlir::Value
634
+ CirAttrToValue::visitCirGlobalViewAttr (cir::GlobalViewAttr globalAttr) {
646
635
auto module = parentOp->getParentOfType <mlir::ModuleOp>();
647
636
mlir::Type sourceType;
648
637
unsigned sourceAddrSpace = 0 ;
@@ -716,43 +705,16 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::GlobalViewAttr globalAttr,
716
705
}
717
706
718
707
// / Switches on the type of attribute and calls the appropriate conversion.
719
- mlir::Value lowerCirAttrAsValue (mlir::Operation *parentOp, mlir::Attribute attr,
708
+ mlir::Value lowerCirAttrAsValue (mlir::Operation *parentOp,
709
+ const mlir::Attribute attr,
720
710
mlir::ConversionPatternRewriter &rewriter,
721
711
const mlir::TypeConverter *converter,
722
712
mlir::DataLayout const &dataLayout) {
723
- if (const auto intAttr = mlir::dyn_cast<cir::IntAttr>(attr))
724
- return lowerCirAttrAsValue (parentOp, intAttr, rewriter, converter);
725
- if (const auto fltAttr = mlir::dyn_cast<cir::FPAttr>(attr))
726
- return lowerCirAttrAsValue (parentOp, fltAttr, rewriter, converter);
727
- if (const auto ptrAttr = mlir::dyn_cast<cir::ConstPtrAttr>(attr))
728
- return lowerCirAttrAsValue (parentOp, ptrAttr, rewriter, converter);
729
- if (const auto constStruct = mlir::dyn_cast<cir::ConstStructAttr>(attr))
730
- return lowerCirAttrAsValue (parentOp, constStruct, rewriter, converter,
731
- dataLayout);
732
- if (const auto constArr = mlir::dyn_cast<cir::ConstArrayAttr>(attr))
733
- return lowerCirAttrAsValue (parentOp, constArr, rewriter, converter,
734
- dataLayout);
735
- if (const auto constVec = mlir::dyn_cast<cir::ConstVectorAttr>(attr))
736
- return lowerCirAttrAsValue (parentOp, constVec, rewriter, converter);
737
- if (const auto boolAttr = mlir::dyn_cast<cir::BoolAttr>(attr))
738
- return lowerCirAttrAsValue (parentOp, boolAttr, rewriter, converter);
739
- if (const auto zeroAttr = mlir::dyn_cast<cir::ZeroAttr>(attr))
740
- return lowerCirAttrAsValue (parentOp, zeroAttr, rewriter, converter);
741
- if (const auto undefAttr = mlir::dyn_cast<cir::UndefAttr>(attr))
742
- return lowerCirAttrAsValue (parentOp, undefAttr, rewriter, converter);
743
- if (const auto poisonAttr = mlir::dyn_cast<cir::PoisonAttr>(attr))
744
- return lowerCirAttrAsValue (parentOp, poisonAttr, rewriter, converter);
745
- if (const auto globalAttr = mlir::dyn_cast<cir::GlobalViewAttr>(attr))
746
- return lowerCirAttrAsValue (parentOp, globalAttr, rewriter, converter,
747
- dataLayout);
748
- if (const auto vtableAttr = mlir::dyn_cast<cir::VTableAttr>(attr))
749
- return lowerCirAttrAsValue (parentOp, vtableAttr, rewriter, converter,
750
- dataLayout);
751
- if (const auto typeinfoAttr = mlir::dyn_cast<cir::TypeInfoAttr>(attr))
752
- return lowerCirAttrAsValue (parentOp, typeinfoAttr, rewriter, converter,
753
- dataLayout);
754
-
755
- llvm_unreachable (" unhandled attribute type" );
713
+ CirAttrToValue valueConverter (parentOp, rewriter, converter, dataLayout);
714
+ auto value = valueConverter.visit (attr);
715
+ if (!value)
716
+ llvm_unreachable (" unhandled attribute type" );
717
+ return value;
756
718
}
757
719
758
720
// ===----------------------------------------------------------------------===//
@@ -1734,8 +1696,8 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
1734
1696
// Regardless of the type, we should lower the constant of poison value
1735
1697
// into PoisonOp.
1736
1698
if (auto poisonAttr = mlir::dyn_cast<cir::PoisonAttr>(attr)) {
1737
- rewriter.replaceOp (
1738
- op, lowerCirAttrAsValue (op, poisonAttr, rewriter, getTypeConverter ()));
1699
+ rewriter.replaceOp (op, lowerCirAttrAsValue (op, poisonAttr, rewriter,
1700
+ getTypeConverter (), dataLayout ));
1739
1701
return mlir::success ();
1740
1702
}
1741
1703
0 commit comments