## Motivation
As we have replaced `truncdiv`/`truncmod` by `floordiv`/`floormod` in most 
places, there's a large demand for simplification to know the sign of the 
expression. For example, knowing the tensor shape bound can help reduce the 
if/else conditions significantly.

Here's an example of generated cuda code for the tvm program posted in this 
[troubleshooting](https://discuss.tvm.ai/t/significant-increase-in-the-amount-of-cuda-code-gen-after-migrating-indexdiv-mod-to-floordiv-mod/)

* without knowing `tindex >= 0`:  
https://gist.github.com/yzhliu/f1aa7c1f25cfd8788cda75a350c4b274
* knowing that `tindex >= 0`: 
https://gist.github.com/yzhliu/217e997157efcfc2a34e5c27b357fcaa

## Approach

* Following [the 
disucss](https://discuss.tvm.ai/t/discuss-embed-more-bound-information-into-var-or-expr/),
 we would like to introduce `AssertLowerBound`, `tvm.placeholder` and 
`tvm.compute` inserts `assert_lower_bound(i, 0)` automatically.

```cpp
class AssertLowerBound : public ExprNode {
 public:
  Expr value;
  Expr bound;

  void VisitAttrs(AttrVisitor* v) {
    v->Visit("value", &value);
    v->Visit("bound", &bound);
  }

  TVM_DLL static Expr make(Expr value, Expr bound);

  static constexpr const char* _type_key = "AssertLowerBound";
  TVM_DECLARE_NODE_TYPE_INFO(AssertLowerBound, ExprNode);
};
```

* `ConstIntBoundAnalyzer` will recognize `AssertLowerBound` and generate the 
Bound accordingly for the variables.
* Modify `CodeGenC` and `CodeGenLLVM` to support `AssertLowerBound` - simply 
replace with its value. (Should we insert extra assertion instructions?)

Here is a draft of the implement: 
https://github.com/apache/incubator-tvm/pull/4486

@tqchen @icemelon9 @reminisce 



-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/apache/incubator-tvm/issues/4487

Reply via email to