diff options
| author | bors <bors@rust-lang.org> | 2017-06-07 12:34:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-06-07 12:34:13 +0000 |
| commit | a69cc85909e085b7603471163e83ce1b692b23a0 (patch) | |
| tree | 4a1fc3044babc41e5a88c906b25832dc2852765e | |
| parent | 37b1f6c4f147382cfb8d66e4cce2b9d5a094d8c1 (diff) | |
| parent | 1a2eb4953e2939a0bebeb56ae4a5715fd968a9ae (diff) | |
| download | rust-a69cc85909e085b7603471163e83ce1b692b23a0.tar.gz rust-a69cc85909e085b7603471163e83ce1b692b23a0.zip | |
Auto merge of #42486 - eddyb:issue-39882, r=nikomatsakis
rustc_trans: do not store pair fields if they are ZSTs. Should help with #39882 even if it's not a complete fix AFAICT.
| -rw-r--r-- | src/librustc_trans/mir/operand.rs | 16 | ||||
| -rw-r--r-- | src/test/codegen/mir_zst_stores.rs | 10 |
2 files changed, 20 insertions, 6 deletions
diff --git a/src/librustc_trans/mir/operand.rs b/src/librustc_trans/mir/operand.rs index a12d0fec1cd..1b8a05b6f6c 100644 --- a/src/librustc_trans/mir/operand.rs +++ b/src/librustc_trans/mir/operand.rs @@ -338,8 +338,20 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> { let a = base::from_immediate(bcx, a); let b = base::from_immediate(bcx, b); - bcx.store(a, bcx.struct_gep(lldest, ix0), f_align); - bcx.store(b, bcx.struct_gep(lldest, ix1), f_align); + + // See comment above about zero-sized values. + let (a_zst, b_zst) = common::type_pair_fields(bcx.ccx, operand.ty) + .map_or((false, false), |[a_ty, b_ty]| { + (common::type_is_zero_size(bcx.ccx, a_ty), + common::type_is_zero_size(bcx.ccx, b_ty)) + }); + + if !a_zst { + bcx.store(a, bcx.struct_gep(lldest, ix0), f_align); + } + if !b_zst { + bcx.store(b, bcx.struct_gep(lldest, ix1), f_align); + } } } } diff --git a/src/test/codegen/mir_zst_stores.rs b/src/test/codegen/mir_zst_stores.rs index a2cedc853a1..36602196cef 100644 --- a/src/test/codegen/mir_zst_stores.rs +++ b/src/test/codegen/mir_zst_stores.rs @@ -13,13 +13,15 @@ #![crate_type = "lib"] use std::marker::PhantomData; - +#[derive(Copy, Clone)] struct Zst { phantom: PhantomData<Zst> } // CHECK-LABEL: @mir +// CHECK-NOT: store{{.*}}undef #[no_mangle] -fn mir(){ - // CHECK-NOT: getelementptr - // CHECK-NOT: store{{.*}}undef +fn mir() { let x = Zst { phantom: PhantomData }; + let y = (x, 0); + drop(y); + drop((0, x)); } |
