Recognize dense switch statements involving negative and positive cases. - #598
Open
xavierleroy wants to merge 2 commits into
Open
xavierleroy wants to merge 2 commits into
xavierleroy wants to merge 2 commits into
Conversation
Allow jump tables that wrap around 0, as long as they contain the correct actions. This is semantically correct.
…ation of the keys It is common for dense switches to have both negative and positive keys, e.g. -1, 0, 1, 2, 3. This commit use signed min and signed max key values to determine when to produce a jump table.
Contributor
Author
|
I also considered treating |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Currenty,
switchstatements with negative and positive cases, such asare never recognized as dense and never compiled to a jump table. That's because case labels are treated as unsigned, hence any switch involving negative and positive numbers has a very large span and looks very sparse.
This PR changes the computation of the span of a switch to treat labels as signed numbers. Owing to the joys of modulo arithmetic, very little else needs to be changed: the validation of jump tables is relaxed to allow wrap around at 0, which is semantically safe; the translation of decision trees to CminorSel code is unchanged.