解读 ExprDeepEqual

解读 ExprDeepEqual#

源码:tvm/tir/analysis.h

/*!
 * \brief Compare two expressions recursively and check if they are equal
 *        to each other without var remapping.
 *
 *  This function does not remap variable bindings, it will not
 *  return true for (let x = 1 in x + 1) vs (let y = 1 in y + 1), unless x.same_as(y).
 *
 *  Use StructuralEqual for such cases.
 *
 *  Due to the restriction of not remapping variables, this function can run
 *  faster than StructuralEqual and can be used as a utility function during arithmetic
 *  simplifications.
 *
 * \sa StructuralEqual
 */
struct ExprDeepEqual {
 public:
  TVM_DLL bool operator()(const PrimExpr& lhs, const PrimExpr& rhs) const;
};

ExprDeepEqual 结构体,它用于比较两个表达式是否相等。该结构体包含公共成员函数 operator(),接受两个参数 lhsrhs,分别表示要比较的两个表达式。

该函数的作用是递归地比较两个表达式是否相等,但不进行变量重映射。也就是说,如果两个表达式在不改变变量绑定的情况下相等,则返回 true;否则返回 false

return true for (let x = 1 in x + 1) vs (let y = 1 in y + 1), unless x.same_as(y).

需要注意的是,由于该函数不进行变量重映射,因此在某些情况下可能比 StructuralEqual 运行得更快,并且可以作为算术简化过程中的实用函数使用。

另外,该函数还提供了相关参考文档 \sa StructuralEqual,可能是为了说明在某些情况下可以使用 StructuralEqual 来进行更复杂的变量映射比较。