Skip the balanced switch dispatch optimization for patterns on floating-point inputs #62322
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.
Fixes #62241
The DAG for the scenario
< -40.0 => "Too low", >= -40.0 and < 0 => "Low", ..., double.NaN => "NaN"
has a test fort0 < -40
at the top-level. When that test is false, the next test ist0 >= -40
. When that test is false, we're in the NaN case (NaN is the only possible remaining value so we don't need an explicit test). That DAG is correct.Original DAG:
But the lowering of DAGs can take multiple relational tests on a given input and convert it into a balanced switch dispatch.
That optimization results in a top-level
< 0
test. The< -40.0
and>= -40.0
tests are therefore moved under thetrue
case of that top-level test, and the<= 10
test is under thefalse
case. That is more balanced, but it is incorrect because a NaN input value yields false for any comparison. In that configuration, the path to the NaN case (marked with dotted line) is impossible.Balanced switch dispatch generated by optimization:
I haven't found a way to keep the benefits of the optimization while maintaining proper NaN semantics, so this PR disables the optimization for inputs of floating-point types.
Filed #62390 to explore re-enabling some partial-but-safe optimization.