Skip to content

Commit

Permalink
rustc_codegen_llvm: don't overalign loads of pair operands.
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyb committed Nov 28, 2018
1 parent b68fc18 commit 51cf4e9
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
12 changes: 9 additions & 3 deletions src/librustc_codegen_llvm/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -589,17 +589,23 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
});
OperandValue::Immediate(to_immediate(self, llval, place.layout))
} else if let layout::Abi::ScalarPair(ref a, ref b) = place.layout.abi {
let mut load = |i, scalar: &layout::Scalar| {
let b_offset = a.value.size(self).align_to(b.value.align(self).abi);

let mut load = |i, scalar: &layout::Scalar, align| {
let llptr = self.struct_gep(place.llval, i as u64);
let load = self.load(llptr, place.align);
let load = self.load(llptr, align);
scalar_load_metadata(self, load, scalar);
if scalar.is_bool() {
self.trunc(load, self.cx().type_i1())
} else {
load
}
};
OperandValue::Pair(load(0, a), load(1, b))

OperandValue::Pair(
load(0, a, place.align),
load(1, b, place.align.restrict_for_offset(b_offset)),
)
} else {
OperandValue::Ref(place.llval, None, place.align)
};
Expand Down
18 changes: 18 additions & 0 deletions src/test/codegen/issue-56267-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// compile-flags: -C no-prepopulate-passes

#![crate_type="rlib"]

#[allow(dead_code)]
pub struct Foo<T> {
foo: u64,
bar: T,
}

// The load from bar.1 should have alignment 4. Not checking
// other loads here, as the alignment will be platform-dependent.

// CHECK: %{{.+}} = load i32, i32* %{{.+}}, align 4
#[no_mangle]
pub fn test(x: Foo<(i32, i32)>) -> (i32, i32) {
x.bar
}

0 comments on commit 51cf4e9

Please sign in to comment.