about summary refs log tree commit diff
path: root/compiler/rustc_span
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-05-14 05:31:10 +0000
committerbors <bors@rust-lang.org>2023-05-14 05:31:10 +0000
commitbc888958c9e1fdde09791f15d3421bdc3b6d7d29 (patch)
tree7c58f002e19288e067a691a56b09cb71d7b3ad29 /compiler/rustc_span
parentad6ab11234ae885913229f6de2c4465bdc0d76f3 (diff)
parent8fb888dfaa1618838a288c41a8dc8ad24d1dadd5 (diff)
downloadrust-bc888958c9e1fdde09791f15d3421bdc3b6d7d29.tar.gz
rust-bc888958c9e1fdde09791f15d3421bdc3b6d7d29.zip
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 'compiler/rustc_span')
0 files changed, 0 insertions, 0 deletions