Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update on "[compiler] ReactiveIR break node and related block structu…
…ring" Extends the sea-of-nodes ReactiveIR exploration from previous PRs. Adds a new BreakNode to represent breaks (and continues, though not handled yet). Along with this change, graph construction now guarantees that there is a control dependency from the terminal of a block on all not-yet-depended-upon nodes in that block. Since nodes in a block will themselves have a transitive control dependency on the block's entry node, this means that there is a transitive control or data dependency from the block terminal through to all the nodes in that block, up to the block entry. BreakNode also has a target, the node that its control would jump to. This unblocks conversion back to HIR or ReactiveFunction, and also provides the necessary information to run (abstract) interpretation using ReactiveIR. This guarantees that nodes remain ordered. It also means that all nodes will appear used, since they are guaranteed to have at least one node dependending on them, the final node of their block. Thus (despite my comments in chat), dead code elimination against ReactiveIR does actually require a bit more than just running RPO and pruning unused nodes — DCE would have to look for nodes that are only used as control nodes, ie whose actual value is unused, and remove those. But we're not planning to use this for DCE anyway so this is more of an observation about the implications for this change. [ghstack-poisoned]
- Loading branch information