C#: Use CFG nodes instead of AST nodes in sign/modulus analysis - #4445
Merged
Conversation
hvitved
force-pushed
the
csharp/sign-analysis-cfg
branch
2 times, most recently
from
October 13, 2020 13:50
f4cf83e to
5ad29c8
Compare
hvitved
force-pushed
the
csharp/sign-analysis-cfg
branch
3 times, most recently
from
October 14, 2020 10:18
fdaee7d to
de6b13a
Compare
hvitved
force-pushed
the
csharp/sign-analysis-cfg
branch
from
October 14, 2020 11:39
de6b13a to
2af7e1c
Compare
hvitved
marked this pull request as ready for review
October 14, 2020 11:44
Contributor
|
Java changes LGTM. |
tamasvajk
approved these changes
Oct 21, 2020
tamasvajk
left a comment
Contributor
There was a problem hiding this comment.
LGTM, we'll see with RangeAnalysis if I understood everything in the PR. :-)
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.
This PR rewrites sign/modulus analysis for C# to use CFG nodes instead of AST nodes, in order to take CFG splitting into account. For example, in
xexists in two copies in the CFG at the firstSystem.Console.WriteLine(x), and the new analysis is able to deduce that it is strictly positive in the copy forb = trueand strictly negative in the copy forb = false.The implementation uses (a copy of) the
ControlFlowReachabilitylibrary that we also use to take CFG splitting into account in the data-flow library.I had to make two changes in the shared interfaces:
rankedPhiInputis now moved out into the language-specific modules, as we need to rank on two columns for C#. It turned out that the old implementation was partial, which resulted in diverging analysis for loops at the beginning of a callable. The new (total) implementation is based on a similar pattern from the basic block library.getSourceTypepredicate toCastExpr.