Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
UniverseFly opened this issue Aug 5, 2021 · 1 comment

Comments

@UniverseFly
Copy link
Contributor

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.

@UniverseFly
Copy link
Contributor Author

Fixed in #8706

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant