Skip to content

Commit

Permalink
Auto merge of #47007 - eddyb:issue-46897, r=arielb1
Browse files Browse the repository at this point in the history
rustc: don't use union layouts for tagged union enums.

Fixes #46897, fixes #43517 (AFAICT from the testcases).
This PR doesn't add any testcases, we should try to at least get perf ones (cc @Mark-Simulacrum).
I couldn't find an example in those issues where the choice of LLVM array vs struct (with N identical fields) for padding filler types is still needed, *on top of* this change, to prevent excessive LLVM sinking.

r? @arielb1
  • Loading branch information
bors committed Dec 27, 2017
2 parents 3fd27b2 + 97228f5 commit 71ed31f
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 6 deletions.
8 changes: 4 additions & 4 deletions src/librustc/ty/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1655,10 +1655,10 @@ impl<'a, 'tcx> LayoutDetails {
discr,
variants
},
// FIXME(eddyb): using `FieldPlacement::Arbitrary` here results
// in lost optimizations, specifically around allocations, see
// `test/codegen/{alloc-optimisation,vec-optimizes-away}.rs`.
fields: FieldPlacement::Union(1),
fields: FieldPlacement::Arbitrary {
offsets: vec![Size::from_bytes(0)],
memory_index: vec![0]
},
abi,
align,
size
Expand Down
5 changes: 3 additions & 2 deletions src/test/codegen/align-struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,14 @@ pub enum Enum4 {
A(i32),
B(i32),
}
// CHECK: %Enum4 = type { [2 x i32] }
// CHECK: %Enum4 = type { [0 x i32], i32, [1 x i32] }
// CHECK: %"Enum4::A" = type { [1 x i32], i32, [0 x i32] }

pub enum Enum64 {
A(Align64),
B(i32),
}
// CHECK: %Enum64 = type { [16 x i64] }
// CHECK: %Enum64 = type { [0 x i32], i32, [31 x i32] }
// CHECK: %"Enum64::A" = type { [8 x i64], %Align64, [0 x i64] }

// CHECK-LABEL: @align64
Expand Down

0 comments on commit 71ed31f

Please # to comment.