Skip to content

Commit 110b891

Browse files
authored
[flang] Added lowering for hlfir.cshift operation. (#118918)
1 parent 53fd724 commit 110b891

File tree

2 files changed

+250
-1
lines changed

2 files changed

+250
-1
lines changed

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,37 @@ struct MatmulTransposeOpConversion
463463
}
464464
};
465465

466+
class CShiftOpConversion : public HlfirIntrinsicConversion<hlfir::CShiftOp> {
467+
using HlfirIntrinsicConversion<hlfir::CShiftOp>::HlfirIntrinsicConversion;
468+
469+
llvm::LogicalResult
470+
matchAndRewrite(hlfir::CShiftOp cshift,
471+
mlir::PatternRewriter &rewriter) const override {
472+
fir::FirOpBuilder builder{rewriter, cshift.getOperation()};
473+
const mlir::Location &loc = cshift->getLoc();
474+
475+
llvm::SmallVector<IntrinsicArgument, 3> inArgs;
476+
mlir::Value array = cshift.getArray();
477+
inArgs.push_back({array, array.getType()});
478+
mlir::Value shift = cshift.getShift();
479+
inArgs.push_back({shift, shift.getType()});
480+
inArgs.push_back({cshift.getDim(), builder.getI32Type()});
481+
482+
auto *argLowering = fir::getIntrinsicArgumentLowering("cshift");
483+
llvm::SmallVector<fir::ExtendedValue, 3> args =
484+
lowerArguments(cshift, inArgs, rewriter, argLowering);
485+
486+
mlir::Type scalarResultType =
487+
hlfir::getFortranElementType(cshift.getType());
488+
489+
auto [resultExv, mustBeFreed] =
490+
fir::genIntrinsicCall(builder, loc, "cshift", scalarResultType, args);
491+
492+
processReturnValue(cshift, resultExv, mustBeFreed, builder, rewriter);
493+
return mlir::success();
494+
}
495+
};
496+
466497
class LowerHLFIRIntrinsics
467498
: public hlfir::impl::LowerHLFIRIntrinsicsBase<LowerHLFIRIntrinsics> {
468499
public:
@@ -475,7 +506,8 @@ class LowerHLFIRIntrinsics
475506
AllOpConversion, AnyOpConversion, SumOpConversion,
476507
ProductOpConversion, TransposeOpConversion, CountOpConversion,
477508
DotProductOpConversion, MaxvalOpConversion, MinvalOpConversion,
478-
MinlocOpConversion, MaxlocOpConversion>(context);
509+
MinlocOpConversion, MaxlocOpConversion, CShiftOpConversion>(
510+
context);
479511

480512
// While conceptually this pass is performing dialect conversion, we use
481513
// pattern rewrites here instead of dialect conversion because this pass

0 commit comments

Comments
 (0)