summaryrefslogtreecommitdiff
path: root/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp')
-rw-r--r--flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp38
1 files changed, 35 insertions, 3 deletions
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp b/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp
index bfb4148d93bf..091ed7ed999d 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp
@@ -463,6 +463,37 @@ struct MatmulTransposeOpConversion
}
};
+class CShiftOpConversion : public HlfirIntrinsicConversion<hlfir::CShiftOp> {
+ using HlfirIntrinsicConversion<hlfir::CShiftOp>::HlfirIntrinsicConversion;
+
+ llvm::LogicalResult
+ matchAndRewrite(hlfir::CShiftOp cshift,
+ mlir::PatternRewriter &rewriter) const override {
+ fir::FirOpBuilder builder{rewriter, cshift.getOperation()};
+ const mlir::Location &loc = cshift->getLoc();
+
+ llvm::SmallVector<IntrinsicArgument, 3> inArgs;
+ mlir::Value array = cshift.getArray();
+ inArgs.push_back({array, array.getType()});
+ mlir::Value shift = cshift.getShift();
+ inArgs.push_back({shift, shift.getType()});
+ inArgs.push_back({cshift.getDim(), builder.getI32Type()});
+
+ auto *argLowering = fir::getIntrinsicArgumentLowering("cshift");
+ llvm::SmallVector<fir::ExtendedValue, 3> args =
+ lowerArguments(cshift, inArgs, rewriter, argLowering);
+
+ mlir::Type scalarResultType =
+ hlfir::getFortranElementType(cshift.getType());
+
+ auto [resultExv, mustBeFreed] =
+ fir::genIntrinsicCall(builder, loc, "cshift", scalarResultType, args);
+
+ processReturnValue(cshift, resultExv, mustBeFreed, builder, rewriter);
+ return mlir::success();
+ }
+};
+
class LowerHLFIRIntrinsics
: public hlfir::impl::LowerHLFIRIntrinsicsBase<LowerHLFIRIntrinsics> {
public:
@@ -475,7 +506,8 @@ public:
AllOpConversion, AnyOpConversion, SumOpConversion,
ProductOpConversion, TransposeOpConversion, CountOpConversion,
DotProductOpConversion, MaxvalOpConversion, MinvalOpConversion,
- MinlocOpConversion, MaxlocOpConversion>(context);
+ MinlocOpConversion, MaxlocOpConversion, CShiftOpConversion>(
+ context);
// While conceptually this pass is performing dialect conversion, we use
// pattern rewrites here instead of dialect conversion because this pass
@@ -488,8 +520,8 @@ public:
config.enableRegionSimplification =
mlir::GreedySimplifyRegionLevel::Disabled;
- if (mlir::failed(mlir::applyPatternsAndFoldGreedily(
- module, std::move(patterns), config))) {
+ if (mlir::failed(
+ mlir::applyPatternsGreedily(module, std::move(patterns), config))) {
mlir::emitError(mlir::UnknownLoc::get(context),
"failure in HLFIR intrinsic lowering");
signalPassFailure();