@@ -749,6 +749,44 @@ struct VolatileCastOpConversion
749749 }
750750};
751751
752+ // / Lower `fir.assumed_size_extent` to constant -1 of index type.
753+ struct AssumedSizeExtentOpConversion
754+ : public fir::FIROpConversion<fir::AssumedSizeExtentOp> {
755+ using FIROpConversion::FIROpConversion;
756+
757+ llvm::LogicalResult
758+ matchAndRewrite (fir::AssumedSizeExtentOp op, OpAdaptor,
759+ mlir::ConversionPatternRewriter &rewriter) const override {
760+ mlir::Location loc = op.getLoc ();
761+ mlir::Type ity = lowerTy ().indexType ();
762+ auto cst = fir::genConstantIndex (loc, ity, rewriter, -1 );
763+ rewriter.replaceOp (op, cst.getResult ());
764+ return mlir::success ();
765+ }
766+ };
767+
768+ // / Lower `fir.is_assumed_size_extent` to integer equality with -1.
769+ struct IsAssumedSizeExtentOpConversion
770+ : public fir::FIROpConversion<fir::IsAssumedSizeExtentOp> {
771+ using FIROpConversion::FIROpConversion;
772+
773+ llvm::LogicalResult
774+ matchAndRewrite (fir::IsAssumedSizeExtentOp op, OpAdaptor adaptor,
775+ mlir::ConversionPatternRewriter &rewriter) const override {
776+ mlir::Location loc = op.getLoc ();
777+ mlir::Value val = adaptor.getVal ();
778+ mlir::Type valTy = val.getType ();
779+ // Create constant -1 of the operand type.
780+ auto negOneAttr = rewriter.getIntegerAttr (valTy, -1 );
781+ auto negOne =
782+ mlir::LLVM::ConstantOp::create (rewriter, loc, valTy, negOneAttr);
783+ auto cmp = mlir::LLVM::ICmpOp::create (
784+ rewriter, loc, mlir::LLVM::ICmpPredicate::eq, val, negOne);
785+ rewriter.replaceOp (op, cmp.getResult ());
786+ return mlir::success ();
787+ }
788+ };
789+
752790// / convert value of from-type to value of to-type
753791struct ConvertOpConversion : public fir ::FIROpConversion<fir::ConvertOp> {
754792 using FIROpConversion::FIROpConversion;
@@ -4360,6 +4398,7 @@ void fir::populateFIRToLLVMConversionPatterns(
43604398 AllocaOpConversion, AllocMemOpConversion, BoxAddrOpConversion,
43614399 BoxCharLenOpConversion, BoxDimsOpConversion, BoxEleSizeOpConversion,
43624400 BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion,
4401+ AssumedSizeExtentOpConversion, IsAssumedSizeExtentOpConversion,
43634402 BoxOffsetOpConversion, BoxProcHostOpConversion, BoxRankOpConversion,
43644403 BoxTypeCodeOpConversion, BoxTypeDescOpConversion, CallOpConversion,
43654404 CmpcOpConversion, VolatileCastOpConversion, ConvertOpConversion,
0 commit comments