[flang][fir] add fir.is_assumed_size codegen (#93953)

Lower to IsAssumedSize runtime call in `--fir-assumed-rank-op` pass.
This commit is contained in:
jeanPerier 2024-06-03 17:14:03 +02:00 committed by GitHub
parent 26ee42a3cf
commit 539dbfcfcf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 65 additions and 0 deletions

View File

@ -27,5 +27,9 @@ void genCopyAndUpdateDescriptor(fir::FirOpBuilder &builder, mlir::Location loc,
mlir::Value newAttribute,
mlir::Value newLowerBounds);
/// Generate call to `IsAssumedSize` runtime routine.
mlir::Value genIsAssumedSize(fir::FirOpBuilder &builder, mlir::Location loc,
mlir::Value box);
} // namespace fir::runtime
#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_SUPPORT_H

View File

@ -44,3 +44,13 @@ void fir::runtime::genCopyAndUpdateDescriptor(fir::FirOpBuilder &builder,
}
builder.create<fir::CallOp>(loc, func, args);
}
mlir::Value fir::runtime::genIsAssumedSize(fir::FirOpBuilder &builder,
mlir::Location loc,
mlir::Value box) {
mlir::func::FuncOp func =
fir::runtime::getRuntimeFunc<mkRTKey(IsAssumedSize)>(loc, builder);
auto fTy = func.getFunctionType();
auto args = fir::runtime::createArguments(builder, loc, fTy, box);
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
}

View File

@ -112,6 +112,31 @@ private:
fir::KindMapping kindMap;
};
class IsAssumedSizeConv : public mlir::OpRewritePattern<fir::IsAssumedSizeOp> {
public:
using OpRewritePattern::OpRewritePattern;
IsAssumedSizeConv(mlir::MLIRContext *context, mlir::SymbolTable *symbolTable,
fir::KindMapping kindMap)
: mlir::OpRewritePattern<fir::IsAssumedSizeOp>(context),
symbolTable{symbolTable}, kindMap{kindMap} {};
mlir::LogicalResult
matchAndRewrite(fir::IsAssumedSizeOp isAssumedSizeOp,
mlir::PatternRewriter &rewriter) const override {
fir::FirOpBuilder builder{rewriter, kindMap, symbolTable};
mlir::Location loc = isAssumedSizeOp.getLoc();
mlir::Value result =
fir::runtime::genIsAssumedSize(builder, loc, isAssumedSizeOp.getVal());
rewriter.replaceOp(isAssumedSizeOp, result);
return mlir::success();
}
private:
mlir::SymbolTable *symbolTable = nullptr;
fir::KindMapping kindMap;
};
/// Convert FIR structured control flow ops to CFG ops.
class AssumedRankOpConversion
: public fir::impl::AssumedRankOpConversionBase<AssumedRankOpConversion> {
@ -123,6 +148,7 @@ public:
fir::KindMapping kindMap = fir::getKindMapping(mod);
mlir::RewritePatternSet patterns(context);
patterns.insert<ReboxAssumedRankConv>(context, &symbolTable, kindMap);
patterns.insert<IsAssumedSizeConv>(context, &symbolTable, kindMap);
mlir::GreedyRewriteConfig config;
config.enableRegionSimplification = false;
(void)applyPatternsAndFoldGreedily(mod, std::move(patterns), config);

View File

@ -0,0 +1,25 @@
// Test fir.is_assumed_size lowering to runtime calls in fir-assumed-rank-op pass.
// RUN: fir-opt -o - --fir-assumed-rank-op %s | FileCheck %s
func.func @test_ranked(%arg0: !fir.class<!fir.array<?xnone>> ) -> i1 {
%1 = fir.is_assumed_size %arg0 : (!fir.class<!fir.array<?xnone>>) -> i1
return %1 : i1
}
func.func @test_assumed_rank(%arg0: !fir.box<!fir.array<*:f32>> ) -> i1 {
%1 = fir.is_assumed_size %arg0 : (!fir.box<!fir.array<*:f32>>) -> i1
return %1 : i1
}
// CHECK-LABEL: func.func @test_ranked(
// CHECK-SAME: %[[VAL_0:.*]]: !fir.class<!fir.array<?xnone>>) -> i1 {
// CHECK: %[[VAL_1:.*]] = fir.convert %[[VAL_0]] : (!fir.class<!fir.array<?xnone>>) -> !fir.box<none>
// CHECK: %[[VAL_2:.*]] = fir.call @_FortranAIsAssumedSize(%[[VAL_1]]) : (!fir.box<none>) -> i1
// CHECK: return %[[VAL_2]] : i1
// CHECK: }
// CHECK-LABEL: func.func @test_assumed_rank(
// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<*:f32>>) -> i1 {
// CHECK: %[[VAL_1:.*]] = fir.convert %[[VAL_0]] : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
// CHECK: %[[VAL_2:.*]] = fir.call @_FortranAIsAssumedSize(%[[VAL_1]]) : (!fir.box<none>) -> i1
// CHECK: return %[[VAL_2]] : i1
// CHECK: }