[flang-commits] [PATCH] D140101: [flang] hlfir.apply codegen
Jean Perier via Phabricator via flang-commits
flang-commits at lists.llvm.org
Thu Dec 15 06:18:08 PST 2022
jeanPerier created this revision.
jeanPerier added reviewers: clementval, PeteSteinfeld.
jeanPerier added a project: Flang.
Herald added subscribers: mehdi_amini, jdoerfert.
Herald added a project: All.
jeanPerier requested review of this revision.
Lower hlfir.apply to hlfir.designate in bufferization.
Depends on D140099 <https://reviews.llvm.org/D140099>
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D140101
Files:
flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
flang/test/HLFIR/apply-codegen.fir
Index: flang/test/HLFIR/apply-codegen.fir
===================================================================
--- /dev/null
+++ flang/test/HLFIR/apply-codegen.fir
@@ -0,0 +1,27 @@
+// Test hlfir.apply code generation
+// RUN: fir-opt %s -bufferize-hlfir | FileCheck %s
+
+func.func @numeric_apply(%arg0 : !fir.ref<!fir.array<100xi32>>) {
+ %expr = hlfir.as_expr %arg0 : (!fir.ref<!fir.array<100xi32>>) -> !hlfir.expr<100xi32>
+ %c42 = arith.constant 42 : index
+ %elem = hlfir.apply %expr, %c42 : (!hlfir.expr<100xi32>, index) -> i32
+ return
+}
+// CHECK-LABEL: func.func @numeric_apply(
+// CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = ".tmp"}
+// CHECK: %[[VAL_9:.*]] = arith.constant 42 : index
+// CHECK: %[[VAL_10:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_9]]) : (!fir.heap<!fir.array<100xi32>>, index) -> !fir.ref<i32>
+// CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>
+
+func.func @character_apply(%arg0 : !fir.ref<!fir.array<?x!fir.char<2,?>>>, %l: index, %n: index) {
+ %shape = fir.shape %n : (index) -> !fir.shape<1>
+ %c:2 = hlfir.declare %arg0(%shape) typeparams %l {uniq_name = "c"} : (!fir.ref<!fir.array<?x!fir.char<2,?>>>, !fir.shape<1>, index) -> (!fir.box<!fir.array<?x!fir.char<2,?>>>, !fir.ref<!fir.array<?x!fir.char<2,?>>>)
+ %expr = hlfir.as_expr %c#0 : (!fir.box<!fir.array<?x!fir.char<2,?>>>) -> !hlfir.expr<?x!fir.char<2,?>>
+ %c42 = arith.constant 42 : index
+ %elem = hlfir.apply %expr, %c42 typeparams %l: (!hlfir.expr<?x!fir.char<2,?>>, index, index) -> !hlfir.expr<!fir.char<2,?>>
+ return
+}
+// CHECK-LABEL: func.func @character_apply(
+// CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) typeparams %[[VAL_1:.*]] {uniq_name = ".tmp"}
+// CHECK: %[[VAL_11:.*]] = arith.constant 42 : index
+// CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_11]]) typeparams %[[VAL_1]] : (!fir.box<!fir.array<?x!fir.char<2,?>>>, index, index) -> !fir.boxchar<2>
Index: flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
===================================================================
--- flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -177,6 +177,26 @@
}
};
+struct ApplyOpConversion : public mlir::OpConversionPattern<hlfir::ApplyOp> {
+ using mlir::OpConversionPattern<hlfir::ApplyOp>::OpConversionPattern;
+ explicit ApplyOpConversion(mlir::MLIRContext *ctx)
+ : mlir::OpConversionPattern<hlfir::ApplyOp>{ctx} {}
+ mlir::LogicalResult
+ matchAndRewrite(hlfir::ApplyOp apply, OpAdaptor adaptor,
+ mlir::ConversionPatternRewriter &rewriter) const override {
+ mlir::Location loc = apply->getLoc();
+ hlfir::Entity bufferizedExpr{getBufferizedExprStorage(adaptor.getExpr())};
+ mlir::Type resultType = hlfir::getVariableElementType(bufferizedExpr);
+ mlir::Value result = rewriter.create<hlfir::DesignateOp>(
+ loc, resultType, bufferizedExpr, adaptor.getIndices(),
+ adaptor.getTypeparams());
+ if (fir::isa_trivial(apply.getType()))
+ result = rewriter.create<fir::LoadOp>(loc, result);
+ rewriter.replaceOp(apply, result);
+ return mlir::success();
+ }
+};
+
struct AssignOpConversion : public mlir::OpConversionPattern<hlfir::AssignOp> {
using mlir::OpConversionPattern<hlfir::AssignOp>::OpConversionPattern;
explicit AssignOpConversion(mlir::MLIRContext *ctx)
@@ -398,12 +418,12 @@
auto module = this->getOperation();
auto *context = &getContext();
mlir::RewritePatternSet patterns(context);
- patterns
- .insert<AsExprOpConversion, AssignOpConversion, AssociateOpConversion,
- ConcatOpConversion, ElementalOpConversion,
- EndAssociateOpConversion, NoReassocOpConversion>(context);
+ patterns.insert<ApplyOpConversion, AsExprOpConversion, AssignOpConversion,
+ AssociateOpConversion, ConcatOpConversion,
+ ElementalOpConversion, EndAssociateOpConversion,
+ NoReassocOpConversion>(context);
mlir::ConversionTarget target(*context);
- target.addIllegalOp<hlfir::AssociateOp, hlfir::ElementalOp,
+ target.addIllegalOp<hlfir::ApplyOp, hlfir::AssociateOp, hlfir::ElementalOp,
hlfir::EndAssociateOp, hlfir::YieldElementOp>();
target.markUnknownOpDynamicallyLegal([](mlir::Operation *op) {
return llvm::all_of(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140101.483158.patch
Type: text/x-patch
Size: 4448 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20221215/3a72b62f/attachment-0001.bin>
More information about the flang-commits
mailing list