sunggg opened a new issue, #14287:
URL: https://github.com/apache/tvm/issues/14287

   ### Issue
   Currently, StructInfo can use a local variable to express shape information. 
However, this causes a visibility problem when we output with such StructInfo 
to the outer scope of the current block.  
   
   ### Reproducible Example
   `Reshape` is the representative example. 
   
   ```
   # from tvm.script import ir as I
   # from tvm.script import relax as R
   @I.ir_module
   class Mod:
       @R.function
       def main(x: R.Tensor((16, 16), "float32")):
           with R.dataflow():
               lv = relax.Var("s", R.Shape((4, 4, 4, 4)))
               gv = relax.op.reshape(x, lv)
               R.output(gv)
           return gv
   
   assert relax.analysis.well_formed(Mod)
   ```
   
   When we conduct StructInfo deduction with normalizer, we get the following:
   ```
   # from tvm.script import ir as I
   # from tvm.script import relax as R
   
   @I.ir_module
   class Module:
       @R.function
       def main(
           x: R.Tensor((16, 16), dtype="float32")
       ) -> R.Tensor(dtype="float32", ndim=4):
           s: R.Shape([4, 4, 4, 4])
           with R.dataflow():
               lv: R.Shape([4, 4, 4, 4]) = s
               gv: R.Tensor(lv, dtype="float32") = R.reshape(x, lv)
               R.output(gv)
           return gv
   ```
   
   This fails `well_formed` checker because when we outputs `gv`, we escalate 
its StructInfo together. Since `lv` is not visible to the outer scope of 
dataflow block, we get the following errors:
   ```
   [11:36:43] /home/spark/tvm/src/relax/analysis/well_formed.cc:116: Warning: 
This IR is not well formed: Var s is not defined.
   [11:36:43] /home/spark/tvm/src/relax/analysis/well_formed.cc:116: Warning: 
This IR is not well formed: DataflowVar lv is used outside DataflowBlock.
   [11:36:43] /home/spark/tvm/src/relax/analysis/well_formed.cc:116: Warning: 
This IR is not well formed: DataflowVar lv is not defined.
   ```
   
   ### Ideas
   In our internal discussion with @psrivas2 @slyubomirsky @yongwww, we could 
come up with three options:
   O1: insert `R.output` implicitly for those local variables 
   O2: require explicit `R.output` annotation
   O3: remove lv from tensor struct info (e.g., folding, match_cast)
   
   We would like to hear more thoughts from the community on this matter.
   Thank you in advance!
   


-- 
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]

Reply via email to