I’m assuming this question is about TIR and not Relax (as Relax also has something called DataflowBlock which is completely different).
When it comes to TIR, the current method of scheduling it involves directly modifying a TIR AST through schedule primitives, and this TIR (Originally mentioned in RFC as TensorIR) has blocks, which eventually gets lowered to a version of TIR without blocks through a combination of a couple of passes.
Earlier, scheduling used to happen directly on Tensor Expressions (TE), and then the scheduled TE used to get lowered directly to TIR, which did not have any blocks. This lowered TIR, is the same as what you get when lowering from TensorIR with blocks as well.
Essentially, after lowering they’re the same, but blocks can appear in TIR when we view it as TensorIR and it gets scheduled directly as opposed to going from TE.
Hope I didn’t confuse you further, feel free to ask more questions if you’re confused