C#: Use CFG nodes instead of AST nodes in sign/modulus analysis #4445
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.