UniverseFly opened a new issue #8666:
URL: https://github.com/apache/tvm/issues/8666
To reproduce the problem:
```python
>>> 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.
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]