@@ -551,20 +551,55 @@ class ReshapeOpConversion : public HlfirIntrinsicConversion<hlfir::ReshapeOp> {
551
551
}
552
552
};
553
553
554
+ class CmpCharOpConversion : public HlfirIntrinsicConversion <hlfir::CmpCharOp> {
555
+ using HlfirIntrinsicConversion<hlfir::CmpCharOp>::HlfirIntrinsicConversion;
556
+
557
+ llvm::LogicalResult
558
+ matchAndRewrite (hlfir::CmpCharOp cmp,
559
+ mlir::PatternRewriter &rewriter) const override {
560
+ fir::FirOpBuilder builder{rewriter, cmp.getOperation ()};
561
+ const mlir::Location &loc = cmp->getLoc ();
562
+ hlfir::Entity lhs{cmp.getLchr ()};
563
+ hlfir::Entity rhs{cmp.getRchr ()};
564
+
565
+ auto [lhsExv, lhsCleanUp] =
566
+ hlfir::translateToExtendedValue (loc, builder, lhs);
567
+ auto [rhsExv, rhsCleanUp] =
568
+ hlfir::translateToExtendedValue (loc, builder, rhs);
569
+
570
+ auto resultVal = fir::runtime::genCharCompare (
571
+ builder, loc, cmp.getPredicate (), lhsExv, rhsExv);
572
+ if (lhsCleanUp || rhsCleanUp) {
573
+ mlir::OpBuilder::InsertionGuard guard (builder);
574
+ builder.setInsertionPointAfter (cmp);
575
+ if (lhsCleanUp)
576
+ (*lhsCleanUp)();
577
+ if (rhsCleanUp)
578
+ (*rhsCleanUp)();
579
+ }
580
+ auto resultEntity = hlfir::EntityWithAttributes{resultVal};
581
+
582
+ processReturnValue (cmp, resultEntity, /* mustBeFreed=*/ false , builder,
583
+ rewriter);
584
+ return mlir::success ();
585
+ }
586
+ };
587
+
554
588
class LowerHLFIRIntrinsics
555
589
: public hlfir::impl::LowerHLFIRIntrinsicsBase<LowerHLFIRIntrinsics> {
556
590
public:
557
591
void runOnOperation () override {
558
592
mlir::ModuleOp module = this ->getOperation ();
559
593
mlir::MLIRContext *context = &getContext ();
560
594
mlir::RewritePatternSet patterns (context);
561
- patterns.insert <
562
- MatmulOpConversion, MatmulTransposeOpConversion, AllOpConversion,
563
- AnyOpConversion, SumOpConversion, ProductOpConversion,
564
- TransposeOpConversion, CountOpConversion, DotProductOpConversion,
565
- MaxvalOpConversion, MinvalOpConversion, MinlocOpConversion,
566
- MaxlocOpConversion, ArrayShiftOpConversion<hlfir::CShiftOp>,
567
- ArrayShiftOpConversion<hlfir::EOShiftOp>, ReshapeOpConversion>(context);
595
+ patterns.insert <MatmulOpConversion, MatmulTransposeOpConversion,
596
+ AllOpConversion, AnyOpConversion, SumOpConversion,
597
+ ProductOpConversion, TransposeOpConversion,
598
+ CountOpConversion, DotProductOpConversion,
599
+ MaxvalOpConversion, MinvalOpConversion, MinlocOpConversion,
600
+ MaxlocOpConversion, ArrayShiftOpConversion<hlfir::CShiftOp>,
601
+ ArrayShiftOpConversion<hlfir::EOShiftOp>,
602
+ ReshapeOpConversion, CmpCharOpConversion>(context);
568
603
569
604
// While conceptually this pass is performing dialect conversion, we use
570
605
// pattern rewrites here instead of dialect conversion because this pass
0 commit comments