TVMScript also provide `doc.NodeVisitor` and `doc.NodeTransformer` for AST level mutations. In our private fork we collect all lhs variables with multiple `Assign` or `AugAssign` bindings. They are implicitly transformed to scalar buffer load & store during parsing to structure same as @spectrometerHBH's answer.
```python from tvm.script import tir as T @T.prim_func def function(X: T.Buffer([16], "int32")): v = 0 X[0] = v for i in range(10): v = i X[i + 1] = v print(function) # default tir parser output # different assignment to `v` treat as new let bindings @T.prim_func def function(X: T.Buffer((16,), "int32")): v: T.int32 = 0 X[0] = v for i in range(10): v_1: T.int32 = i X[i + 1] = v_1 # scalar transformed output @T.prim_func def function(X: T.Buffer((16,), "int32")): # with T.block("root"): v = T.alloc_buffer((1,), "int32") v[0] = 0 X[0] = v[0] for i in range(10): v[0] = i X[i + 1] = v[0] ``` In llvm-based backends, we could also introduce new storage scope or someother annotations to ensure the scalar buffer allocation map to alloca and finally transform to SSA value via `mem2reg`. One important note is though this behavior is more "pythonic", it break the concise scoping behaviour for default IR parsing. And it may be hard to keep round trip property. So from my understanding it could be useful when we use TVMScript as a programming language, but may not be proper or default behaviour for TVMScript's origin serving purpose. --- [Visit Topic](https://discuss.tvm.apache.org/t/how-to-design-a-local-variable/18490/3) to respond. You are receiving this because you enabled mailing list mode. To unsubscribe from these emails, [click here](https://discuss.tvm.apache.org/email/unsubscribe/45c1cfcbc90a272d36cfca1a92438166918a16175a51f99e467659abbda7d9aa).