[opt] Hoist comparisons across selects when it is cheap to do so #3689
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Add a SelectSimplificationPass rewrite to push CompareOp through sel / priority_sel / one_hot_sel when comparing against a literal and the select-like node has ≤1 non-literal arm (including default) plus a single-user guard.
e.g.
The fact we only do it when (at most) one case is non-constant means it should be more area-preserving to push this through. (It does suggest maybe we want some knob like --speculation_level=N similar to how we have --opt_level=N in the future though.)
For one_hot_sel, apply only when the selector is provably exactly-one-hot (IsKnownOneHotSelector), including common “one-hot by construction” patterns.
Extend GenericSelect with a small helper to rebuild the same select-like op with new arms (MakeSelectLikeWithNewArms).
Add query_engine_utils (+ tests) and new select_simplification_pass tests covering prio/sel/onehot, non-commutative operand ordering, and all-literal arms.