Rust: Implement ConditionalCompletionSplitting
#17657
Merged
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.
This PR implements
ConditionalCompletionSplitting
, similar to how its done for other languages (C#, Ruby, and Swift). The idea is to record information about the Boolean value of sub expressions in order to (a) have all expressions be post-order in the CFG, and (b) provide more accurate information for a future guards library.Examples
Logical negation
Before this PR, logical negation expressions were in fact post-order, but the dominance information was lost. For example, this program
has the following CFGs before and after
Before
After
Logical conjunction
Before
After
Complex nesting
Note how in the after-CFG it is now evident that the
1
expression is guarded bya
matching the0
pattern (and dually that the0
expression is guarded bya
not matching the0
pattern).Before
After