Skip to content

Commit

Permalink
Auto merge of #133852 - x17jiri:cold_path, r=saethlin
Browse files Browse the repository at this point in the history
improve cold_path()

#120370 added a new instrinsic `cold_path()` and used it to fix `likely` and `unlikely`

However, in order to limit scope, the information about cold code paths is only used in 2-target switch instructions. This is sufficient for `likely` and `unlikely`, but limits usefulness of `cold_path` for idiomatic rust. For example, code like this:

```
if let Some(x) = y { ... }
```

may generate 3-target switch:

```
switch y.discriminator:
0 => true branch
1 = > false branch
_ => unreachable
```

and therefore marking a branch as cold will have no effect.

This PR improves `cold_path()` to work with arbitrary switch instructions.

Note that for 2-target switches, we can use `llvm.expect`, but for multiple targets we need to manually emit branch weights. I checked Clang and it also emits weights in this situation. The Clang's weight calculation is more complex that this PR, which I believe is mainly because `switch` in `C/C++` can have multiple cases going to the same target.
  • Loading branch information
bors committed Feb 18, 2025
2 parents 46a58c0 + 96513a3 commit b219a0e
Showing 0 changed files with 0 additions and 0 deletions.

0 comments on commit b219a0e

Please sign in to comment.