Index: flang/lib/Optimizer/CodeGen/CodeGen.cpp =================================================================== --- flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -827,6 +827,35 @@ } }; +/// Lower fir.len_param_index +struct LenParamIndexOpConversion + : public FIROpConversion { + using FIROpConversion::FIROpConversion; + + // FIXME: this should be specialized by the runtime target + mlir::LogicalResult + matchAndRewrite(fir::LenParamIndexOp lenp, OpAdaptor, + mlir::ConversionPatternRewriter &rewriter) const override { + mlir::Type ity = lowerTy().indexType(); + mlir::Type onty = lenp.getOnType(); + // size of portable descriptor + const unsigned boxsize = 24; // FIXME + unsigned offset = boxsize; + // add the size of the rows of triples + if (auto arr = onty.dyn_cast()) + offset += 3 * arr.getDimension(); + + // advance over some addendum fields + const unsigned addendumOffset{sizeof(void *) + sizeof(uint64_t)}; + offset += addendumOffset; + // add the offset into the LENs + offset += 0; // FIXME + auto attr = rewriter.getI64IntegerAttr(offset); + rewriter.replaceOpWithNewOp(lenp, ity, attr); + return success(); + } +}; + /// Lower `fir.gentypedesc` to a global constant. struct GenTypeDescOpConversion : public FIROpConversion { using FIROpConversion::FIROpConversion; @@ -2179,14 +2208,15 @@ EmboxProcOpConversion, ExtractValueOpConversion, FieldIndexOpConversion, FirEndOpConversion, HasValueOpConversion, GenTypeDescOpConversion, GlobalLenOpConversion, GlobalOpConversion, InsertOnRangeOpConversion, - InsertValueOpConversion, IsPresentOpConversion, LoadOpConversion, - NegcOpConversion, NoReassocOpConversion, MulcOpConversion, - SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion, - SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion, - ShiftOpConversion, SliceOpConversion, StoreOpConversion, - StringLitOpConversion, SubcOpConversion, UnboxCharOpConversion, - UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion, - ZeroOpConversion>(typeConverter); + InsertValueOpConversion, IsPresentOpConversion, + LenParamIndexOpConversion, LoadOpConversion, NegcOpConversion, + NoReassocOpConversion, MulcOpConversion, SelectCaseOpConversion, + SelectOpConversion, SelectRankOpConversion, SelectTypeOpConversion, + ShapeOpConversion, ShapeShiftOpConversion, ShiftOpConversion, + SliceOpConversion, StoreOpConversion, StringLitOpConversion, + SubcOpConversion, UnboxCharOpConversion, UnboxProcOpConversion, + UndefOpConversion, UnreachableOpConversion, ZeroOpConversion>( + typeConverter); mlir::populateStdToLLVMConversionPatterns(typeConverter, pattern); mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter, pattern); Index: flang/test/Fir/convert-to-llvm-target.fir =================================================================== --- flang/test/Fir/convert-to-llvm-target.fir +++ flang/test/Fir/convert-to-llvm-target.fir @@ -147,3 +147,34 @@ // INT32: %[[len:.*]] = llvm.extractvalue %[[box_char]][1 : i32] : !llvm.struct<(ptr, i32)> // INT32: %{{.*}} = llvm.sext %0 : i32 to i64 // INT32-NEXT: llvm.return + +// ----- + +// Test fir.len_param_index + +func @len_param_index() { + %0 = fir.len_param_index i, !fir.type + %1 = fir.len_param_index f, !fir.type + %3 = fir.len_param_index l, !fir.type + + %4 = fir.len_param_index l1, !fir.type + %5 = fir.len_param_index l2, !fir.type + %6 = fir.len_param_index l, !fir.type + + return + +// INT64-LABEL: llvm.func @len_param_index +// INT64: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT64: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT64: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT64: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT64: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT64: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT32-LABEL: llvm.func @len_param_index +// INT32: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT32: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT32: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT32: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT32: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +// INT32: {{%.*}} = llvm.mlir.constant(40 : i64) : i64 +}