Skip to content

[TIR][Python] Misbehavior: {tir.const(1), tir.const(True)} throws ValueError #8666

Description

@UniverseFly

To reproduce the problem:

>>> from tvm import tir
>>> int_1, bool_t = tir.const(1), tir.const(True)
>>> s = {int_1, bool_t}

~tvm/python/tvm/tir/expr.py in __nonzero__(self)
    171     def __nonzero__(self):
    172         raise ValueError(
--> 173             "Cannot use and / or / not operator to Expr, hint: "
    174             + "use tvm.tir.all / tvm.tir.any instead"
    175         )

ValueError: Cannot use and / or / not operator to Expr, hint: use tvm.tir.all / tvm.tir.any instead

After some inspection, I guess I could elaborate on the steps leading to this issue:

  • During the construction of s, the __hash__ of int_1 and bool_t are compared, which are both 1.
  • Since they have the same hash value, Python needs to further consider whether the two objects are the same before finishing set construction, which in turn concerns the __eq__ operator.
  • __eq__ of tir.IntImm calls _ffi_api._OpEQ, which returns a tir.EQ(int_1, bool_t) given that constant folding doesn’t happen.
  • Python wants to convert the this tir.EQ to bool, which calls __bool__ of tir.EQ that inherits __bool__ of tir.ExprOp, which calls __nonzero__, which finally raises ValueError.

I’m not sure whether this problem can be solved through simple fix since it involves the design of the operator sugar of TIR in Python-level.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions