Skip to content

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

@UniverseFly

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions