diff options
| author | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
|---|---|---|
| committer | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
| commit | 38500d63e14ce340236840f60d356cdefb56a52c (patch) | |
| tree | 17edbec446ce9b50d2f215a483b83afb293a635d /flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp | |
| parent | 1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff) | |
| parent | 27f30029741ecf023baece7b3dde1ff9011ffefc (diff) | |
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp')
| -rw-r--r-- | flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp | 38 |
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(); |
