Files
rust/tests/coverage
bors 4ad239f415 Auto merge of #142821 - cjgillot:jump-threading-single, r=saethlin
Compute jump threading opportunities in a single pass

The current implementation of jump threading walks MIR CFG backwards from each `SwitchInt` terminator. This PR replaces this by a single postorder traversal of MIR. In theory, we could do a full fixpoint dataflow analysis, but this has low returns as we forbid threading through a loop header.

The second commit in this PR modifies the carried state to a lighter data structure. The current implementation uses some kind of `IndexVec<ValueIndex, &[Condition]>`. This is needlessly heavy, as the state rarely ever carries more than a few `Condition`s. The first commit replaces this state with a simpler `&[Condition]`, and puts the corresponding `ValueIndex` inside `Condition`.

The three later commits are perf tweaks.

The sixth commit is the main change. Instead of carrying the goto target inside the condition, we maintain a set of conditions associated with each block, and their consequences in following blocks. Think: if this condition is fulfilled in this block, then that condition is fulfilled in that block. This makes the threading algorithm much easier to implement, without the extra bookkeeping of `ThreadingOpportunity` we had.

Later commits modify that algorithm to shrink the set of duplicated blocks. By propagating fulfilled conditions down the CFG, and trimming costly threads.
2025-12-01 23:44:49 +00:00
..
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:45 +01:00
2025-11-12 12:48:27 +01:00
2024-12-13 00:04:56 +00:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:45 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:45 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-01-09 13:55:50 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:45 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:45 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:45 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00
2025-11-12 12:48:27 +01:00

The tests in this directory are shared by two different test modes, and can be run in multiple different ways:

  • ./x.py test coverage-map (compiles to LLVM IR and checks coverage mappings)
  • ./x.py test coverage-run (runs a test binary and checks its coverage report)
  • ./x.py test coverage (runs both coverage-map and coverage-run)

Maintenance note

These tests can be sensitive to small changes in MIR spans or MIR control flow, especially in HIR-to-MIR lowering or MIR optimizations.

If you haven't touched the coverage code directly, and the tests still pass in coverage-run mode, then it should usually be OK to just re-bless the mappings as necessary with ./x.py test coverage-map --bless, without worrying too much about the exact changes.