Skip to content

Commit 0df4463

Browse files
authored
[flang] Replace lowering of character compare. (#155458)
Lower character comparison into hlfir.cmpchar operation and then lower the operation into a runtime call at intrinsic lowering.
1 parent 6bf8046 commit 0df4463

File tree

7 files changed

+292
-37
lines changed

7 files changed

+292
-37
lines changed

flang/lib/Lower/ConvertExprToHLFIR.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include "flang/Optimizer/Builder/Complex.h"
2727
#include "flang/Optimizer/Builder/IntrinsicCall.h"
2828
#include "flang/Optimizer/Builder/MutableBox.h"
29-
#include "flang/Optimizer/Builder/Runtime/Character.h"
3029
#include "flang/Optimizer/Builder/Runtime/Derived.h"
3130
#include "flang/Optimizer/Builder/Runtime/Pointer.h"
3231
#include "flang/Optimizer/Builder/Todo.h"
@@ -1286,16 +1285,8 @@ struct BinaryOp<Fortran::evaluate::Relational<
12861285
fir::FirOpBuilder &builder,
12871286
const Op &op, hlfir::Entity lhs,
12881287
hlfir::Entity rhs) {
1289-
auto [lhsExv, lhsCleanUp] =
1290-
hlfir::translateToExtendedValue(loc, builder, lhs);
1291-
auto [rhsExv, rhsCleanUp] =
1292-
hlfir::translateToExtendedValue(loc, builder, rhs);
1293-
auto cmp = fir::runtime::genCharCompare(
1294-
builder, loc, translateSignedRelational(op.opr), lhsExv, rhsExv);
1295-
if (lhsCleanUp)
1296-
(*lhsCleanUp)();
1297-
if (rhsCleanUp)
1298-
(*rhsCleanUp)();
1288+
auto cmp = hlfir::CmpCharOp::create(
1289+
builder, loc, translateSignedRelational(op.opr), lhs, rhs);
12991290
return hlfir::EntityWithAttributes{cmp};
13001291
}
13011292
};

flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
554588
class LowerHLFIRIntrinsics
555589
: public hlfir::impl::LowerHLFIRIntrinsicsBase<LowerHLFIRIntrinsics> {
556590
public:
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

Comments
 (0)