The RAW fusion happens only if the produecer block dominates the consumer block.
The WAW pattern also works with the precondition. I.e., if a producer can
dominate the consumer, they can fairly fuse together.
Since they are all tilable, we can think the pattern like this way:
linalg_op1 view tile_loop subview_2 linalg_op2 subview_2
Tile the first Linalg op as same as the second Linalg.
tile_loop subview_1 linalg_op1 subview_1 tile_loop subview_2 liangl_op2 subview_2
Since the first Linalg op is tilable in the same way and the computation are
independently, it's fair to fuse it with the second Linalg op.
tile_loop subview_1 linalg_op1 subview_1 linalg_op2 subview_2
In short, this patch includes:
- Handling both RAW and WAW pattern.
- Adding a interface method to get input and output buffers.
- Exposing a method to get a StringRef of a dependency type.
- Fixing existing WAW tests and add one more use case: initialize the buffer before conv op.