about summary refs log tree commit diff
path: root/compiler/rustc_errors/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-05-10 20:17:22 +0000
committerbors <bors@rust-lang.org>2024-05-10 20:17:22 +0000
commit6e1d94708a0a4a35ca7e46c6cac98adf62fe800e (patch)
tree9a8282ea1f9f07b94dccc143c778483f4758e5a2 /compiler/rustc_errors/src
parent2cce0885840cd171cb3a8677af795d0abd2dc77c (diff)
parentc38f75c21f016bffbf841ed5abce338f94201bde (diff)
downloadrust-6e1d94708a0a4a35ca7e46c6cac98adf62fe800e.tar.gz
rust-6e1d94708a0a4a35ca7e46c6cac98adf62fe800e.zip
Auto merge of #123886 - scottmcm:more-rvalue-operands, r=matthewjasper
Avoid `alloca`s in codegen for simple `mir::Aggregate` statements

The core idea here is to remove the abstraction penalty of simple newtypes in codegen.

Even something simple like constructing a
```rust
#[repr(transparent)] struct Foo(u32);
```
forces an `alloca` to be generated in nightly right now.

Certainly LLVM can optimize that away, but it would be nice if it didn't have to.

Quick example:
```rust
#[repr(transparent)]
pub struct Transparent32(u32);

#[no_mangle]
pub fn make_transparent(x: u32) -> Transparent32 {
    let a = Transparent32(x);
    a
}
```
on nightly we produce <https://rust.godbolt.org/z/zcvoM79ae>
```llvm
define noundef i32 `@make_transparent(i32` noundef %x) unnamed_addr #0 {
  %a = alloca i32, align 4
  store i32 %x, ptr %a, align 4
  %0 = load i32, ptr %a, align 4, !noundef !3
  ret i32 %0
}
```
but after this PR we produce
```llvm
define noundef i32 `@make_transparent(i32` noundef %x) unnamed_addr #0 {
start:
  ret i32 %x
}
```
(even before the optimizer runs).
Diffstat (limited to 'compiler/rustc_errors/src')
0 files changed, 0 insertions, 0 deletions