zhangyicole opened a new pull request, #12761:
URL: https://github.com/apache/tvm/pull/12761

   Refer to issue https://github.com/apache/tvm/issues/10211. The CSE pass 
can't handle commutativity because the arith system may not be able to do the 
commutativity。
   
   The determination of the equality of two expressions (PrimExpr) is to use 
the method of structured determination, that is, to traverse the hierarchical 
structure of the two expressions, and to judge while traversing, if the 
structures of the two expressions are the same, and the smallest If the child 
nodes (nodes that cannot be traversed, generally such as Var) are the same, the 
expressions are considered to be the same.
   
   Before performing PrimExpr comparison, a series of rewrite rules will be 
used to rewrite expressions to solve some operational problems, such as x * y + 
x * z will be rewritten as x * (y + z), so that to deal with distributivity.
   However, commutativity cannot be rewritten due to the characteristics of 
rewrite (it will fall into an infinite loop). This makes it impossible to 
compare the equality of some expressions, such as a * b *c != a * c * b, (a * 
b) * c != a * (b * c).
   
   To solve this problem, one solution is to sort and rewrite the expressions 
according to the `StructuralHash` of the Var nodes in the expressions before 
comparing the expressions. If two expressions are equivalent if they satisfy 
the commutativity, then they will definitely produce equivalent expressions of 
the same structure after sorting.
   
   Under the assumption that the two expressions have the same structure, the 
determination condition that the two expressions satisfying the commutativity 
are the same can be further refined to the same set of all elements in the 
sub-expressions satisfying the commutativity. The sub-expressions satisfying 
the commutativity in the expression can be grasped by constructing the 
expression syntax tree. The sub-expressions satisfying the commutativity are 
the sub-trees of the expression tree whose child nodes are identical (the child 
nodes are OP).
   
   An example:
   ```
       Var: a, b, c, d, e
   
       StructuralHash(a > b >c >d > e)
   
       cse_var_1  = a * b *c + d + e
   
       cse_var_2 = b * a * c + e + d
   ```
   Sort and rewrite cse_var_1 and cse_var_2, first extract their first 
subexpressions a * b *c and b * a * c, and rewrite them as a * b * c, and then 
extract the sub-expressions again ( a * b *c) + d + e and (a *b * c) + e + d, 
rewriting the sort as (a * b *c) + d + e, get the same expression.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@tvm.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to