Currently, it seems to me that concurrency is only present in MLIR at the level of basic blocks, and at this level it’s very constrained - the description involves no conditional execution.
Has anyone here considered allowing predication at the level of basic blocks? It’s something that has already been explored in SSA literature. It remains well within the bounds of SSA philosophy (static single assignment) but allows the natural expression of synchronous concurrency (as in synchronous languages, well-formed Simulink, embedded computing, etc.). It may be also interesting in the perspective of HW generation.
The idea is to associate a predicate to every operation of a basic block. By default these predicates are “true” (tautology), which corresponds to the current execution model. Execution follows dependencies, but an operation whose predicate is currently “false” will not be executed, nor assign a value to its outputs.
The difficulty is that initialization and single assignment analysis (inside a basic block, at the very least) would require a Boolean analysis, which is more complicated than the current dominance argument.
The advantage is that this would allow the expression of a significant concurrent model (synchronous) while retaining the semantic bases of MLIR SSA and its execution model.
Together with my PhD student, we can write a note argumenting in this direction, but I wanted to first see if we did not overlook some previous work or some fundamental MLIR choices that can not be changed.