[flang-commits] [flang] e779d54 - [flang][hlfir] Preserve hlfir.assign in the bufferize-hlfir pass

Jean Perier via flang-commits flang-commits at lists.llvm.org
Sun Apr 16 22:48:47 PDT 2023


Author: Jean Perier
Date: 2023-04-17T07:47:53+02:00
New Revision: e779d54d2137c918572f4a70bf5c9341500fab6b

URL: https://github.com/llvm/llvm-project/commit/e779d54d2137c918572f4a70bf5c9341500fab6b
DIFF: https://github.com/llvm/llvm-project/commit/e779d54d2137c918572f4a70bf5c9341500fab6b.diff

LOG: [flang][hlfir] Preserve hlfir.assign in the bufferize-hlfir pass

hlfir.assign must be rewritten in the bufferize pass since its operands,
that can be expressions, may have been updated. This is just
an operand update rewrite. The previous code was replacing the
operation, but it was dropping all hlfir.assign on the floor doing
so. This broke allocatable assignment semantics that use attributes.

Update the operands in place instead to preserve the attributes, if any.

Differential Revision: https://reviews.llvm.org/D148310

Added: 
    flang/test/HLFIR/assign-bufferize.fir

Modified: 
    flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index a361208f8fef2..4b631b2f99a5d 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -196,9 +196,12 @@ struct AssignOpConversion : public mlir::OpConversionPattern<hlfir::AssignOp> {
   mlir::LogicalResult
   matchAndRewrite(hlfir::AssignOp assign, OpAdaptor adaptor,
                   mlir::ConversionPatternRewriter &rewriter) const override {
-    rewriter.replaceOpWithNewOp<hlfir::AssignOp>(
-        assign, getBufferizedExprStorage(adaptor.getOperands()[0]),
-        getBufferizedExprStorage(adaptor.getOperands()[1]));
+    llvm::SmallVector<mlir::Value> newOperands;
+    for (mlir::Value operand : adaptor.getOperands())
+      newOperands.push_back(getBufferizedExprStorage(operand));
+    rewriter.startRootUpdate(assign);
+    assign->setOperands(newOperands);
+    rewriter.finalizeRootUpdate(assign);
     return mlir::success();
   }
 };

diff  --git a/flang/test/HLFIR/assign-bufferize.fir b/flang/test/HLFIR/assign-bufferize.fir
new file mode 100644
index 0000000000000..7c3a6088347f1
--- /dev/null
+++ b/flang/test/HLFIR/assign-bufferize.fir
@@ -0,0 +1,16 @@
+// Test hlfir.assign rewrite in the bufferization pass.
+// Assign in itself is not transformed, but its operands may be
+// expressions that are bufferized and must be updated.
+// RUN: fir-opt %s -bufferize-hlfir | FileCheck %s
+
+func.func @keep_attributes(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,8>>>>>, %arg1: !fir.box<!fir.array<1x!fir.char<1,?>>>) {
+  %true = arith.constant true
+  %0 = hlfir.as_expr %arg1 move %true : (!fir.box<!fir.array<1x!fir.char<1,?>>>, i1) -> !hlfir.expr<1x!fir.char<1,?>>
+  hlfir.assign %0 to %arg0 realloc keep_lhs_len : !hlfir.expr<1x!fir.char<1,?>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,8>>>>>
+  return
+}
+
+// CHECK-LABEL: func.func @keep_attributes(
+// CHECK-SAME: %[[X:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,8>>>>>,
+// CHECK-SAME: %[[Y:.*]]: !fir.box<!fir.array<1x!fir.char<1,?>>>) {
+// CHECK: hlfir.assign %[[Y]] to %[[X]] realloc keep_lhs_len : !fir.box<!fir.array<1x!fir.char<1,?>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,8>>>>>


        


More information about the flang-commits mailing list