mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 06:51:58 +00:00
Fix alignment of stores to scalar pair
The alignment for the second element of a scalar pair is not the same as for the first element. Make sure it is computed correctly based on the element size.
This commit is contained in:
parent
6bfb46e4ac
commit
d8190afbcb
@ -331,11 +331,21 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandValue<V> {
|
||||
bx.store_with_flags(val, dest.llval, dest.align, flags);
|
||||
}
|
||||
OperandValue::Pair(a, b) => {
|
||||
for (i, &x) in [a, b].iter().enumerate() {
|
||||
let llptr = bx.struct_gep(dest.llval, i as u64);
|
||||
let val = base::from_immediate(bx, x);
|
||||
bx.store_with_flags(val, llptr, dest.align, flags);
|
||||
}
|
||||
let (a_scalar, b_scalar) = match dest.layout.abi {
|
||||
layout::Abi::ScalarPair(ref a, ref b) => (a, b),
|
||||
_ => bug!("store_with_flags: invalid ScalarPair layout: {:#?}", dest.layout)
|
||||
};
|
||||
let b_offset = a_scalar.value.size(bx).align_to(b_scalar.value.align(bx).abi);
|
||||
|
||||
let llptr = bx.struct_gep(dest.llval, 0);
|
||||
let val = base::from_immediate(bx, a);
|
||||
let align = dest.align;
|
||||
bx.store_with_flags(val, llptr, align, flags);
|
||||
|
||||
let llptr = bx.struct_gep(dest.llval, 1);
|
||||
let val = base::from_immediate(bx, b);
|
||||
let align = dest.align.restrict_for_offset(b_offset);
|
||||
bx.store_with_flags(val, llptr, align, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
src/test/codegen/issue-56267.rs
Normal file
18
src/test/codegen/issue-56267.rs
Normal file
@ -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 store writing to bar.1 should have alignment 4. Not checking
|
||||
// other stores here, as the alignment will be platform-dependent.
|
||||
|
||||
// CHECK: store i32 [[TMP1:%.+]], i32* [[TMP2:%.+]], align 4
|
||||
#[no_mangle]
|
||||
pub fn test(x: (i32, i32)) -> Foo<(i32, i32)> {
|
||||
Foo { foo: 0, bar: x }
|
||||
}
|
Loading…
Reference in New Issue
Block a user