@@ -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+
466497class LowerHLFIRIntrinsics
467498 : public hlfir::impl::LowerHLFIRIntrinsicsBase<LowerHLFIRIntrinsics> {
468499public:
@@ -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