You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"description": "Hoists and cancels matching `util.hoistable_conversion` pairs on the\n target op. See the op documentation for the optimizations performed and the\n requirements on the op contents.",
"description": "Returns the nearest symbol table op for each op in the payload, inclusive.\n\n This operation reads the `target` handle and produces the `result`\n handle. This operation emits a definite failure if the nearest symbol table\n is unknown.",
"summary": "Defines a hoistable conversion between inputs and outputs.",
121213
+
"description": "Defines a conversion between some number of inputs and outputs that should\n be hoisted out of loops or canceled where possible.\n\n This is an operation that allows local pattern rewrites to be defined that\n shouldn't modify loop structure to allow that structure to be modified as\n a post-processing step. It is **not** expected to appear in IR long-term,\n and should, if possible, be rewritten away by the same pass that introduced\n it.\n\n The initial motivation for this operation is to enable code such as the\n lowering of an `inner_tiled` operation to platform intrinsics to mark\n marshaling/unmarshaling needed to convert between the types and shapes IREE\n expects and what the platform expects. However, it could be used for other\n cases where, within a loop, we have `arg <- f^{-1}(g(f(arg)))` where the\n $f$ and $f^{-1}$ can be moved out of the loop without sacrificing\n correctness.\n\n In general, this operation executes the contained single-block region once,\n with the arguments of the region bound to its inputs and the returned\n results bound to its outputs. It must always be correct to perform this\n inlining, though it is likely to be less performant.\n\n The `tag` and `inverse_tag` are used to identify pairs of hoistable\n conversions that can cancel with each other. The operations placed in a\n `hoistable_conversion` operation must be such that the following operations\n are correct for a pair of operations F and G such that `tag(F) ==\n inverse_tag(G)` and `inverse_tag(G) == tag(F)`:\n\n 1. If the outputs of F are the inputs of G, the results of G can be\n replaced by the arguments to F\n 2. If the arguments to F are loop iteration arguments and the results of G\n are the subsequent yielded values of those arguments, then\n - Those loop arguments can be replaced by a set of arguments whose types\n match the result types of F / input types of G\n - The initial values of those new loop arguments can be constructed by\n applying F to the previous initial values\n - The results of the loop can be transformed back into their old types\n by applying G to the new results\n - If F is not the only user of those loop-carried arguments, applying G\n to the new arguments inside the loop will preserve correctness\n\n These optimizations are performed by `eliminateHoistableConversions`\n transformation in util optimizations.\n\n These properties allow pure pre-/post-processing of operands, such as\n chains of `shape_cast` operations surrounding the accumulators of intrinsic\n calls, to be pulled out of loops, and to prevent redundant conversions from\n being added after unrolling intrinsics.\n\n Note that these hoistable conversions are **not** expected to commute with\n other hoistable conversions.",
0 commit comments