diff options
author | bors <bors@rust-lang.org> | 2023-05-14 05:31:10 +0000 |
---|---|---|
committer | bors <bors@rust-lang.org> | 2023-05-14 05:31:10 +0000 |
commit | bc888958c9e1fdde09791f15d3421bdc3b6d7d29 (patch) | |
tree | 7c58f002e19288e067a691a56b09cb71d7b3ad29 /tests/codegen/fewer-names.rs | |
parent | ad6ab11234ae885913229f6de2c4465bdc0d76f3 (diff) | |
parent | 8fb888dfaa1618838a288c41a8dc8ad24d1dadd5 (diff) | |
download | rust-bc888958c9e1fdde09791f15d3421bdc3b6d7d29.tar.gz |
Auto merge of #111440 - cjgillot:refprop-debuginfo, r=oli-obk
Allow MIR debuginfo to point to a variable's address
MIR optimizations currently do not to operate on borrowed locals.
When enabling #106285, many borrows will be left as-is because they are used in debuginfo. This pass allows to replace this pattern directly in MIR debuginfo:
```rust
a => _1
_1 = &raw? mut? _2
```
becomes
```rust
a => &_2
// No statement to borrow _2.
```
This pass is implemented as a drive-by in ReferencePropagation MIR pass.
This transformation allows following following MIR opts to treat _2 as an unborrowed local, and optimize it as such, even in builds with debuginfo.
In codegen, when encountering `a => &..&_2`, we create a list of allocas:
```llvm
store ptr %_2.dbg.spill, ptr %a.ref0.dbg.spill
store ptr %a.ref0.dbg.spill, ptr %a.ref1.dbg.spill
...
call void `@llvm.dbg.declare(metadata` ptr %a.ref{n}.dbg.spill, /* ... */)
```
Caveat: this transformation looses the exact type, we do not differentiate `a` as a immutable, mutable reference or a raw pointer. Everything is declared to `*mut` to codegen. I'm not convinced this is a blocker.
Diffstat (limited to 'tests/codegen/fewer-names.rs')
0 files changed, 0 insertions, 0 deletions