Skip to content

Commit

Permalink
rustc_trans: do not store pair fields if they are ZSTs.
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyb committed Jun 6, 2017
1 parent c94a9ac commit 1a2eb49
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
16 changes: 14 additions & 2 deletions src/librustc_trans/mir/operand.rs
Expand Up @@ -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);
}
}
}
}
Expand Down
10 changes: 6 additions & 4 deletions src/test/codegen/mir_zst_stores.rs
Expand Up @@ -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));
}

0 comments on commit 1a2eb49

Please sign in to comment.