From 06b8c3ee5b52dc849259655578afca70cb32dda3 Mon Sep 17 00:00:00 2001 From: Colin Pronovost Date: Mon, 24 Sep 2018 23:09:44 -0400 Subject: [PATCH] Rely only on base alignment and offset for computing field alignment Fix #54028 --- src/librustc_codegen_llvm/mir/place.rs | 5 +---- src/test/codegen/align-struct.rs | 10 ++++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/librustc_codegen_llvm/mir/place.rs b/src/librustc_codegen_llvm/mir/place.rs index bc6ebd360e831..e7b6f5908a4d1 100644 --- a/src/librustc_codegen_llvm/mir/place.rs +++ b/src/librustc_codegen_llvm/mir/place.rs @@ -173,10 +173,7 @@ impl PlaceRef<'ll, 'tcx> { let cx = bx.cx; let field = self.layout.field(cx, ix); let offset = self.layout.fields.offset(ix); - let effective_field_align = self.align - .min(self.layout.align) - .min(field.align) - .restrict_for_offset(offset); + let effective_field_align = self.align.restrict_for_offset(offset); let simple = || { // Unions and newtypes only use an offset of 0. diff --git a/src/test/codegen/align-struct.rs b/src/test/codegen/align-struct.rs index bf119da2e829f..887c43c6761e8 100644 --- a/src/test/codegen/align-struct.rs +++ b/src/test/codegen/align-struct.rs @@ -48,6 +48,16 @@ pub fn align64(i : i32) -> Align64 { a64 } +// For issue 54028: make sure that we are specifying the correct alignment for fields of aligned +// structs +// CHECK-LABEL: @align64_load +#[no_mangle] +pub fn align64_load(a: Align64) -> i32 { +// CHECK: [[FIELD:%.*]] = bitcast %Align64* %{{.*}} to i32* +// CHECK: {{%.*}} = load i32, i32* [[FIELD]], align 64 + a.0 +} + // CHECK-LABEL: @nested64 #[no_mangle] pub fn nested64(a: Align64, b: i32, c: i32, d: i8) -> Nested64 {