@@ -551,20 +551,55 @@ class ReshapeOpConversion : public HlfirIntrinsicConversion<hlfir::ReshapeOp> {
551551 }
552552};
553553
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+
554588class LowerHLFIRIntrinsics
555589 : public hlfir::impl::LowerHLFIRIntrinsicsBase<LowerHLFIRIntrinsics> {
556590public:
557591 void runOnOperation () override {
558592 mlir::ModuleOp module = this ->getOperation ();
559593 mlir::MLIRContext *context = &getContext ();
560594 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);
568603
569604 // While conceptually this pass is performing dialect conversion, we use
570605 // pattern rewrites here instead of dialect conversion because this pass
0 commit comments