#
d572cd1b |
| 26-Feb-2023 |
Mehdi Amini <joker.eph@gmail.com> |
Introduce MLIR Op Properties
This new features enabled to dedicate custom storage inline within operations. This storage can be used as an alternative to attributes to store data that is specific to
Introduce MLIR Op Properties
This new features enabled to dedicate custom storage inline within operations. This storage can be used as an alternative to attributes to store data that is specific to an operation. Attribute can also be stored inside the properties storage if desired, but any kind of data can be present as well. This offers a way to store and mutate data without uniquing in the Context like Attribute. See the OpPropertiesTest.cpp for an example where a struct with a std::vector<> is attached to an operation and mutated in-place:
struct TestProperties { int a = -1; float b = -1.; std::vector<int64_t> array = {-33}; };
More complex scheme (including reference-counting) are also possible.
The only constraint to enable storing a C++ object as "properties" on an operation is to implement three functions:
- convert from the candidate object to an Attribute - convert from the Attribute to the candidate object - hash the object
Optional the parsing and printing can also be customized with 2 extra functions.
A new options is introduced to ODS to allow dialects to specify:
let usePropertiesForAttributes = 1;
When set to true, the inherent attributes for all the ops in this dialect will be using properties instead of being stored alongside discardable attributes. The TestDialect showcases this feature.
Another change is that we introduce new APIs on the Operation class to access separately the inherent attributes from the discardable ones. We envision deprecating and removing the `getAttr()`, `getAttrsDictionary()`, and other similar method which don't make the distinction explicit, leading to an entirely separate namespace for discardable attributes.
Differential Revision: https://reviews.llvm.org/D141742
show more ...
|
Revision tags: llvmorg-16.0.0-rc3 |
|
#
f25cfd33 |
| 16-Feb-2023 |
Jeff Niu <jeff@modular.com> |
[mlir] Reintroduce API for creating operations with a DictionaryAttr
This patch reintroduces an API to create operations with a pre-existing DictionaryAttr. This API does not populate the attributes
[mlir] Reintroduce API for creating operations with a DictionaryAttr
This patch reintroduces an API to create operations with a pre-existing DictionaryAttr. This API does not populate the attributes with any default attributes the operation may have, like the API that takes a NamedAttrList does. NamedAttrList is effective at not re-hashing the attributes if no default attributes were added, but this new API speeds up clone-heavy workloads slightly (~5%).
Reviewed By: rriddle
Differential Revision: https://reviews.llvm.org/D144204
show more ...
|
Revision tags: llvmorg-16.0.0-rc2, llvmorg-16.0.0-rc1, llvmorg-17-init |
|
#
5b09ffe6 |
| 21-Jan-2023 |
Mehdi Amini <aminim@google.com> |
Revert "WIP listeners", totally pushed by mistake!
This reverts commit 2e312a7baec5e8d8f841ee819966ff3f53f274c6. Should never have been pushed here...
|
#
2e312a7b |
| 20-Jan-2023 |
Mehdi Amini <aminim@google.com> |
WIP listeners
|
#
0441272c |
| 16-Jan-2023 |
Mehdi Amini <joker.eph@gmail.com> |
Revert "Revert "Refactor OperationName to use virtual tables for dispatch (NFC)""
This streamlines the implementation and makes it so that the virtual tables are in the binary instead of dynamically
Revert "Revert "Refactor OperationName to use virtual tables for dispatch (NFC)""
This streamlines the implementation and makes it so that the virtual tables are in the binary instead of dynamically assembled during initialization. The dynamic allocation size of op registration is also smaller with this change.
This reverts commit 7bf1e441da6b59a25495fde8e34939f93548cc6d and re-introduce e055aad5ffb348472c65dfcbede85f39efe8f906 after fixing the windows crash by making ParseAssemblyFn a unique_function again
Differential Revision: https://reviews.llvm.org/D141492
show more ...
|
#
7bf1e441 |
| 16-Jan-2023 |
Mehdi Amini <joker.eph@gmail.com> |
Revert "Refactor OperationName to use virtual tables for dispatch (NFC)"
This reverts commit e055aad5ffb348472c65dfcbede85f39efe8f906.
This crashes on Windows at the moment for some reasons.
|
#
e055aad5 |
| 12-Jan-2023 |
Mehdi Amini <joker.eph@gmail.com> |
Refactor OperationName to use virtual tables for dispatch (NFC)
This streamlines the implementation and makes it so that the virtual tables are in the binary instead of dynamically assembled during
Refactor OperationName to use virtual tables for dispatch (NFC)
This streamlines the implementation and makes it so that the virtual tables are in the binary instead of dynamically assembled during initialization. The dynamic allocation size of op registration is also smaller with this change.
Differential Revision: https://reviews.llvm.org/D141492
show more ...
|
Revision tags: llvmorg-15.0.7 |
|
#
4d67b278 |
| 08-Jan-2023 |
Jeff Niu <jeff@modular.com> |
[mlir] Add operations to BlockAndValueMapping and rename it to IRMapping
The patch adds operations to `BlockAndValueMapping` and renames it to `IRMapping`. When operations are cloned, old operations
[mlir] Add operations to BlockAndValueMapping and rename it to IRMapping
The patch adds operations to `BlockAndValueMapping` and renames it to `IRMapping`. When operations are cloned, old operations are mapped to the cloned operations. This allows mapping from an operation to a cloned operation. Example:
``` Operation *opWithRegion = ... Operation *opInsideRegion = &opWithRegion->front().front();
IRMapping map Operation *newOpWithRegion = opWithRegion->clone(map); Operation *newOpInsideRegion = map.lookupOrNull(opInsideRegion); ```
Migration instructions: All includes to `mlir/IR/BlockAndValueMapping.h` should be replaced with `mlir/IR/IRMapping.h`. All uses of `BlockAndValueMapping` need to be renamed to `IRMapping`.
Reviewed By: rriddle, mehdi_amini
Differential Revision: https://reviews.llvm.org/D139665
show more ...
|
#
829733af |
| 21-Dec-2022 |
Jacques Pienaar <jpienaar@google.com> |
[mlir] Fix SameOperandsAndResultType to check encoding.
Encoding was accidentally left out here even though it forms part of the type. This is small tightening step and I'll look at follow on to tig
[mlir] Fix SameOperandsAndResultType to check encoding.
Encoding was accidentally left out here even though it forms part of the type. This is small tightening step and I'll look at follow on to tighten more.
Differential Revision: https://reviews.llvm.org/D140445
show more ...
|
Revision tags: llvmorg-15.0.6, llvmorg-15.0.5, llvmorg-15.0.4, llvmorg-15.0.3, working, llvmorg-15.0.2, llvmorg-15.0.1 |
|
#
f55ed889 |
| 18-Sep-2022 |
Kazu Hirata <kazu@google.com> |
[mlir] Use x.empty() instead of llvm::empty(x) (NFC)
I'm planning to deprecate and eventually remove llvm::empty.
Note that no use of llvm::empty requires the ability of llvm::empty to determine th
[mlir] Use x.empty() instead of llvm::empty(x) (NFC)
I'm planning to deprecate and eventually remove llvm::empty.
Note that no use of llvm::empty requires the ability of llvm::empty to determine the emptiness from begin/end only.
show more ...
|
Revision tags: llvmorg-15.0.0, llvmorg-15.0.0-rc3 |
|
#
7d273fde |
| 22-Aug-2022 |
Jacques Pienaar <jpienaar@google.com> |
[mlir] Populate default attributes on op creation
Default attributes were only handled by ODS accessors generated with the intention that these behave as if set attributes. This addresses the long s
[mlir] Populate default attributes on op creation
Default attributes were only handled by ODS accessors generated with the intention that these behave as if set attributes. This addresses the long standing TODO to address this inconsistency. Moving the initialization to construction vs every access. Removing need for duplicated default attribute population in python bindings.
Switch some of the OpenMP ones to optional attribute with default as the currently set default values are not legal. May need to dig more there.
Switched LinAlg generated ones to optional attribute with default as its quite widely used and unclear where it falls on two different interpretations.
Differential Revision: https://reviews.llvm.org/D130916
show more ...
|
#
58a47508 |
| 12-Aug-2022 |
Jeff Niu <jeff@modular.com> |
(Reland) [mlir] Switch segment size attributes to DenseI32ArrayAttr
This reland includes changes to the Python bindings.
Switch variadic operand and result segment size attributes to use the dense
(Reland) [mlir] Switch segment size attributes to DenseI32ArrayAttr
This reland includes changes to the Python bindings.
Switch variadic operand and result segment size attributes to use the dense i32 array. Dense integer arrays were introduced primarily to represent index lists. They are a better fit for segment sizes than dense elements attrs.
Depends on D131801
Reviewed By: rriddle
Differential Revision: https://reviews.llvm.org/D131803
show more ...
|
#
e8e718fa |
| 12-Aug-2022 |
Alex Zinenko <zinenko@google.com> |
Revert "[mlir] Switch segment size attributes to DenseI32ArrayAttr"
This reverts commit 30171e76f0e5ea8037bc4d1450dd3e12af4d9938.
Breaks Python tests in MLIR, missing C API and Python changes.
|
#
30171e76 |
| 11-Aug-2022 |
Jeff Niu <jeff@modular.com> |
[mlir] Switch segment size attributes to DenseI32ArrayAttr
Switch variadic operand and result segment size attributes to use the dense i32 array. Dense integer arrays were introduced primarily to re
[mlir] Switch segment size attributes to DenseI32ArrayAttr
Switch variadic operand and result segment size attributes to use the dense i32 array. Dense integer arrays were introduced primarily to represent index lists. They are a better fit for segment sizes than dense elements attrs.
Depends on D131738
Reviewed By: mehdi_amini
Differential Revision: https://reviews.llvm.org/D131702
show more ...
|
Revision tags: llvmorg-15.0.0-rc2, llvmorg-15.0.0-rc1, llvmorg-16-init |
|
#
0db084d4 |
| 12-Jul-2022 |
Jacques Pienaar <jpienaar@google.com> |
[mlir] Switch create to use NamedAttrList&&
Avoids needing the two parallel functions as NamedAttrList already takes care of caching DictionaryAttr and implicitly can convert from either.
Different
[mlir] Switch create to use NamedAttrList&&
Avoids needing the two parallel functions as NamedAttrList already takes care of caching DictionaryAttr and implicitly can convert from either.
Differential Revision: https://reviews.llvm.org/D129527
show more ...
|
Revision tags: llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4 |
|
#
122e6858 |
| 19-May-2022 |
Alex Zinenko <zinenko@google.com> |
[mlir] do not elide dialect prefix for ops with dots in the name
For the hypothetical "a.b.c" op printed within a region that declares "a" as the default dialect, MLIR would currently elide the "a."
[mlir] do not elide dialect prefix for ops with dots in the name
For the hypothetical "a.b.c" op printed within a region that declares "a" as the default dialect, MLIR would currently elide the "a." prefix and only print "b.c". However, this becomes ambiguous while parsing as "b.c" may be exist as the "c" op in the "b" dialect. If it does not, the parsing currently fails. Do not elide the default dialect if the op name contains further dots to avoid the ambiguity.
See https://discourse.llvm.org/t/dropping-dialect-prefix-for-ops-with-multiple-dots-in-the-name/62562
Reviewed By: rriddle
Differential Revision: https://reviews.llvm.org/D125975
show more ...
|
#
70b69c54 |
| 14-May-2022 |
Mogball <jeffniu22@gmail.com> |
[mlir] Rename Zero* traits to Zero*s
Rename ZeroResult -> ZeroResults ZeroSuccessor -> ZeroSuccessors ZeroRegion -> ZeroRegions
to be in line with ZeroOperands and grammatically correct.
|
Revision tags: llvmorg-14.0.3, llvmorg-14.0.2 |
|
#
a8308020 |
| 21-Apr-2022 |
River Riddle <riddleriver@gmail.com> |
[mlir] Remove special case parsing/printing of `func` operations
This was leftover from when the standard dialect was destroyed, and when FuncOp moved to the func dialect. Now that these transitions
[mlir] Remove special case parsing/printing of `func` operations
This was leftover from when the standard dialect was destroyed, and when FuncOp moved to the func dialect. Now that these transitions have settled a bit we can drop these.
Most updates were handled using a simple regex: replace `^( *)func` with `$1func.func`
Differential Revision: https://reviews.llvm.org/D124146
show more ...
|
#
a41aaf16 |
| 21-Apr-2022 |
Markus Böck <markus.boeck02@gmail.com> |
[mlir] Make `Regions`s `cloneInto` multithread-readable
Prior to this patch, `cloneInto` would do a simple walk over the blocks and contained operations and clone and map them as it encounters them.
[mlir] Make `Regions`s `cloneInto` multithread-readable
Prior to this patch, `cloneInto` would do a simple walk over the blocks and contained operations and clone and map them as it encounters them. As finishing touch it then remaps any successor and operands it has remapped during that process.
This is generally fine, but sadly leads to a lot of uses of both operations and blocks from the source region, in the cloned operations in the target region. Those uses lead to writes in the use-def list of the operations, making `cloneInto` never thread safe.
This patch reimplements `cloneInto` in three steps to avoid ever creating any extra uses on elements in the source region: * It first creates the mapping of all blocks and block operands * It then clones all operations to create the mapping of all operation results, but does not yet clone any regions or set the operands * After all operation results have been mapped, it now sets the operations operands and clones their regions.
That way it is now possible to call `cloneInto` from multiple threads if the Region or Operation is isolated-from-above. This allows creating copies of functions or to use `mlir::inlineCall` with the same source region from multiple threads. In the general case, the method is thread-safe if through cloning, no new uses of `Value`s from outside the cloned Operation/Region are created. This can be ensured by mapping any outside operands via the `BlockAndValueMapping` to `Value`s owned by the caller thread.
While I was at it, I also reworked the `clone` method of `Operation` a little bit and added a proper options class to avoid having a `cloneWithoutRegionsAndOperands` method, and be more extensible in the future. `cloneWithoutRegions` is now also a simple wrapper that calls `clone` with the proper options set. That way all the operation cloning code is now contained solely within `clone`.
Differential Revision: https://reviews.llvm.org/D123917
show more ...
|
#
9a8bb4bc |
| 15-Apr-2022 |
William S. Moses <gh@wsmoses.com> |
[NFC] Update comments
|
Revision tags: llvmorg-14.0.1 |
|
#
ed499ddc |
| 26-Mar-2022 |
William S. Moses <gh@wsmoses.com> |
[MLIR] Fix operation clone
Operation clone is currently faulty.
Suppose you have a block like as follows:
``` (%x0 : i32) { %x1 = f(%x0) return %x1 } ```
The test case we have is that we wa
[MLIR] Fix operation clone
Operation clone is currently faulty.
Suppose you have a block like as follows:
``` (%x0 : i32) { %x1 = f(%x0) return %x1 } ```
The test case we have is that we want to "unroll" this, in which we want to change this to compute `f(f(x0))` instead of just `f(x0)`. We do so by making a copy of the body at the end of the block and set the uses of the argument in the copy operations with the value returned from the original block. This is implemented as follows: 1) map to the block arguments to the returned value (`map[x0] = x1`). 2) clone the body
Now for this small example, this works as intended and we get the following.
``` (%x0 : i32) { %x1 = f(%x0) %x2 = f(%x1) return %x2 } ```
This is because the current logic to clone `x1 = f(x0)` first looks up the arguments in the map (which finds `x0` maps to `x1` from the initialization), and then sets the map of the result to the cloned result (`map[x1] = x2`).
However, this fails if `x0` is not an argument to the op, but instead used inside the region, like below.
``` (%x0 : i32) { %x1 = f() { yield %x0 } return %x1 } ```
This is because cloning an op currently first looks up the args (none), sets the map of the result (`map[%x1] = %x2`), and then clones the regions. This results in the following, which is clearly illegal:
``` (%x0 : i32) { %x1 = f() { yield %x0 } %x2 = f() { yield %x2 } return %x2 } ```
Diving deeper, this is partially due to the ordering (how this PR fixes it), as well as how region cloning works. Namely it will first clone with the mapping, and then it will remap all operands. Since the ordering above now has a map of `x0 -> x1` and `x1 -> x2`, we end up with the incorrect behavior here.
Reviewed By: ftynse
Differential Revision: https://reviews.llvm.org/D122531
show more ...
|
Revision tags: llvmorg-14.0.0, llvmorg-14.0.0-rc4 |
|
#
ed645f63 |
| 10-Mar-2022 |
Chia-hung Duan <chiahungduan@google.com> |
[mlir] Support verification order (3/3)
In this CL, update the function name of verifier according to the behavior. If a verifier needs to access the region then it'll be updated to `verifyRegions`.
[mlir] Support verification order (3/3)
In this CL, update the function name of verifier according to the behavior. If a verifier needs to access the region then it'll be updated to `verifyRegions`.
Reviewed By: rriddle
Differential Revision: https://reviews.llvm.org/D120373
show more ...
|
Revision tags: llvmorg-14.0.0-rc3 |
|
#
27df7158 |
| 07-Mar-2022 |
Sergei Grechanik <sergei.grechanik@intel.com> |
[mlir] Fix dumping invalid ops
This patch fixes the crash when printing some ops (like affine.for and scf.for) when they are dumped in invalid state, e.g. during pattern application. Now the AsmStat
[mlir] Fix dumping invalid ops
This patch fixes the crash when printing some ops (like affine.for and scf.for) when they are dumped in invalid state, e.g. during pattern application. Now the AsmState constructor verifies the operation first and switches to generic operation printing when the verification fails. Also operations are now printed in generic form when emitting diagnostics and the severity level is Error.
Reviewed By: rriddle, mehdi_amini
Differential Revision: https://reviews.llvm.org/D117834
show more ...
|
Revision tags: llvmorg-14.0.0-rc2 |
|
#
23aa5a74 |
| 26-Feb-2022 |
River Riddle <riddleriver@gmail.com> |
[mlir] Rename the Standard dialect to the Func dialect
The last remaining operations in the standard dialect all revolve around FuncOp/function related constructs. This patch simply handles the init
[mlir] Rename the Standard dialect to the Func dialect
The last remaining operations in the standard dialect all revolve around FuncOp/function related constructs. This patch simply handles the initial renaming (which by itself is already huge), but there are a large number of cleanups unlocked/necessary afterwards:
* Removing a bunch of unnecessary dependencies on Func * Cleaning up the From/ToStandard conversion passes * Preparing for the move of FuncOp to the Func dialect
See the discussion at https://discourse.llvm.org/t/standard-dialect-the-final-chapter/6061
Differential Revision: https://reviews.llvm.org/D120624
show more ...
|
Revision tags: llvmorg-14.0.0-rc1 |
|
#
60cac0c0 |
| 06-Feb-2022 |
River Riddle <riddleriver@gmail.com> |
[mlir][NFC] Remove deprecated/old build/fold/parser utilities from OpDefinition
These have generally been replaced by better ODS functionality, and do not need to be explicitly provided anymore.
Di
[mlir][NFC] Remove deprecated/old build/fold/parser utilities from OpDefinition
These have generally been replaced by better ODS functionality, and do not need to be explicitly provided anymore.
Differential Revision: https://reviews.llvm.org/D119065
show more ...
|