diff options
author | Valentin Clement <clementval@gmail.com> | 2022-02-03 15:03:58 +0100 |
---|---|---|
committer | Valentin Clement <clementval@gmail.com> | 2022-02-03 15:04:35 +0100 |
commit | e7361469bbb64d80a70d23bb24d45402b4644e3e (patch) | |
tree | 61c4c40526b383189c3a6bc1878ce13dfa7f38df | |
parent | 1bfbe315a76b40f9c3d4cbc8932b05509c5a7c5e (diff) |
[fir] Add fir.array_amend operation definition
This patch adds the fir.array_amend operation. this op
is used later in upstreaming patches for the F95 compliance.
The `array_amend` operation marks an array value as having been changed via
a reference obtain by an `array_access`. It acts as a logical transaction
log that is used to merge the final result back with an `array_merge_store`
operation.
```mlir
// fetch the value of one of the array value's elements
%1 = fir.array_access %v, %i, %j : (!fir.array<?x?xT>, index, index) -> !fir.ref<T>
// modify the element by storing data using %1 as a reference
%2 = ... %1 ...
// mark the array value
%new_v = fir.array_amend %v, %2 : (!fir.array<?x?xT>, !fir.ref<T>) -> !fir.array<?x?xT>
```
This patch is part of the upstreaming effort from fir-dev branch.
Reviewed By: kiranchandramohan, schweitz
Differential Revision: https://reviews.llvm.org/D112448
Co-authored-by: Eric Schweitz <eschweitz@nvidia.com>
-rw-r--r-- | flang/include/flang/Optimizer/Dialect/FIROps.td | 34 | ||||
-rw-r--r-- | flang/test/Fir/fir-ops.fir | 12 |
2 files changed, 46 insertions, 0 deletions
diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td index 2bb6e2a16421..e79fafad6cd0 100644 --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -1595,6 +1595,40 @@ def fir_ArrayAccessOp : fir_Op<"array_access", [AttrSizedOperandSegments, let verifier = "return ::verify(*this);"; } +def fir_ArrayAmendOp : fir_Op<"array_amend", [NoSideEffect]> { + let summary = "Mark an array value as having been changed by reference."; + + let description = [{ + The `array_amend` operation marks an array value as having been changed via + a reference obtained by an `array_access`. It acts as a logical transaction + log that is used to merge the final result back with an `array_merge_store` + operation. + + ```mlir + // fetch the value of one of the array value's elements + %1 = fir.array_access %v, %i, %j : (!fir.array<?x?xT>, index, index) -> !fir.ref<T> + // modify the element by storing data using %1 as a reference + %2 = ... %1 ... + // mark the array value + %new_v = fir.array_amend %v, %2 : (!fir.array<?x?xT>, !fir.ref<T>) -> !fir.array<?x?xT> + ``` + + More information about `array_amend` and other array operations can be + found in flang/docs/FIRArrayOperations.md. + }]; + + let arguments = (ins + fir_SequenceType:$sequence, + fir_ReferenceType:$memref + ); + + let results = (outs fir_SequenceType); + + let assemblyFormat = [{ + $sequence `,` $memref attr-dict `:` functional-type(operands, results) + }]; +} + def fir_ArrayMergeStoreOp : fir_Op<"array_merge_store", [AttrSizedOperandSegments]> { diff --git a/flang/test/Fir/fir-ops.fir b/flang/test/Fir/fir-ops.fir index 3238e4e7b9ee..38ec7ffe02cd 100644 --- a/flang/test/Fir/fir-ops.fir +++ b/flang/test/Fir/fir-ops.fir @@ -758,3 +758,15 @@ func @array_access_ops(%a : !fir.ref<!fir.array<?x?xf32>>) { // CHECK: %{{.*}} = fir.array_access %{{.*}}, %{{.*}}, %{{.*}} : (!fir.array<?x?xf32>, index, index) -> !fir.ref<f32> return } + +func @array_amend_ops(%a : !fir.ref<!fir.array<?x?xf32>>) { + %c1 = arith.constant 1 : index + %n = arith.constant 0 : index + %m = arith.constant 50 : index + %s = fir.shape %n, %m : (index, index) -> !fir.shape<2> + %v = fir.array_load %a(%s) : (!fir.ref<!fir.array<?x?xf32>>, !fir.shape<2>) -> !fir.array<?x?xf32> + %p = fir.array_access %v, %c1, %c1 : (!fir.array<?x?xf32>, index, index) -> !fir.ref<f32> + %res = fir.array_amend %v, %p : (!fir.array<?x?xf32>, !fir.ref<f32>) -> !fir.array<?x?xf32> + // CHECK: %{{.*}} = fir.array_amend %{{.*}}, %{{.*}} : (!fir.array<?x?xf32>, !fir.ref<f32>) -> !fir.array<?x?xf32> + return +} |