-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Generalize Coverage Expression simplification #115134
Generalize Coverage Expression simplification #115134
Conversation
…LLVM We compile each test file to LLVM IR assembly, and then pass that IR to a dedicated program that can decode LLVM coverage maps and print them in a more human-readable format. We can then check that output against known-good snapshots. This test suite has some advantages over the existing `run-coverage` tests: - We can test coverage instrumentation without needing to run target binaries. - We can observe subtle improvements/regressions in the underlying coverage mappings that don't make a visible difference to coverage reports.
The output of these tests is too complicated to comfortably verify by hand, but we can still use them to observe changes to the underlying mappings produced by codegen/LLVM.
After coverage instrumentation and MIR transformations, we can sometimes end up with coverage expressions that always have a value of zero. Any expression operand that refers to an always-zero expression can be replaced with a literal `Operand::Zero`, making the emitted coverage mapping data smaller and simpler. This simplification step is mostly redundant with the simplifications performed inline in `expressions_with_regions`, except that it does a slightly more thorough job in some cases (because it checks for always-zero expressions *after* other simplifications). However, adding this simplification step will then let us greatly simplify that code, without affecting the quality of the emitted coverage maps.
The LLVM API that we use to encode coverage mappings already has its own code for removing unused coverage expressions and renumbering the rest. This lets us get rid of our own complex renumbering code, making it easier to refactor our coverage code in other ways.
This extends the current simplification code to not only replace operands by `Zero`, but also to remove trivial `Counter + Zero` expressions and replace those with just `Counter`. Currently this simplification is very simplistic, and does not handle more complex nested expressions such as `(A + B) - B` which could in theory be simplified as well.
r? @b-naber (rustbot has picked a reviewer for you, use r? to override) |
@rustbot label +A-code-coverage |
I think we shouldn't add more simplifications right now, for a few reasons:
I did add some simplification code in 114399, but that was only so that I could remove expression renumbering without making the mappings worse (because the renumbering code also performed a couple of simplifications of its own). |
☔ The latest upstream changes (presumably #115183) made this pull request unmergeable. Please resolve the merge conflicts. |
Other work on the coverage mappings have made this unnecessary |
This extends the current simplification code to not only replace operands by
Zero
, but also to remove trivialCounter + Zero
expressions and replace those with justCounter
.Currently this simplification is very simplistic, and does not handle more complex nested expressions such as
(A + B) - B
which could in theory be simplified as well.This is based on top of #114399 CC @Zalathar