diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp --- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp +++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp @@ -196,9 +196,12 @@ mlir::LogicalResult matchAndRewrite(hlfir::AssignOp assign, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override { - rewriter.replaceOpWithNewOp( - assign, getBufferizedExprStorage(adaptor.getOperands()[0]), - getBufferizedExprStorage(adaptor.getOperands()[1])); + llvm::SmallVector 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 --- /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>>>>, %arg1: !fir.box>>) { + %true = arith.constant true + %0 = hlfir.as_expr %arg1 move %true : (!fir.box>>, i1) -> !hlfir.expr<1x!fir.char<1,?>> + hlfir.assign %0 to %arg0 realloc keep_lhs_len : !hlfir.expr<1x!fir.char<1,?>>, !fir.ref>>>> + return +} + +// CHECK-LABEL: func.func @keep_attributes( +// CHECK-SAME: %[[X:.*]]: !fir.ref>>>>, +// CHECK-SAME: %[[Y:.*]]: !fir.box>>) { +// CHECK: hlfir.assign %[[Y]] to %[[X]] realloc keep_lhs_len : !fir.box>>, !fir.ref>>>>