[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:
parent
26ee42a3cf
commit
539dbfcfcf
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
25
flang/test/Fir/is_assumed_size-codegen.fir
Normal file
25
flang/test/Fir/is_assumed_size-codegen.fir
Normal 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: }
|
Loading…
x
Reference in New Issue
Block a user