The tensor levels are now explicitly categorized into different LoopCondKind to instruct LoopEmitter generate different code for different kinds of condition (e.g., SparseCond, SparseSliceCond, SparseAffineIdxCond, etc)
The process of generating a while loop is now dissembled into three steps and they are dispatched to different LoopCondKind handler.
- Generate LoopCondition (e.g., pos <= posHi for SparseCond, slice.isNonEmpty for SparseAffineIdxCond)
- Generate LoopBody (e.g., compute the coordinates)
- Generate ExtraChecks (e.g., if (onSlice(crd)) for SparseSliceCond)
Add comment, since we document all methods pretty well in this header