mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-27 10:18:36 +00:00
[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>
This commit is contained in:
parent
1bfbe315a7
commit
e7361469bb
@ -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]> {
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user