diff --git a/compiler/rustc_codegen_llvm/src/abi.rs b/compiler/rustc_codegen_llvm/src/abi.rs index a20801914ad..5b8cc238480 100644 --- a/compiler/rustc_codegen_llvm/src/abi.rs +++ b/compiler/rustc_codegen_llvm/src/abi.rs @@ -59,6 +59,9 @@ impl ArgAttributesExt for ArgAttributes { llattr.apply_llfn(idx, llfn); } } + if let Some(align) = self.pointee_align { + llvm::LLVMRustAddAlignmentAttr(llfn, idx.as_uint(), align.bytes() as u32); + } match self.arg_ext { ArgExtension::None => {} ArgExtension::Zext => llvm::Attribute::ZExt.apply_llfn(idx, llfn), @@ -77,9 +80,6 @@ impl ArgAttributesExt for ArgAttributes { } regular -= ArgAttribute::NonNull; } - if let Some(align) = self.pointee_align { - llvm::LLVMRustAddAlignmentAttr(llfn, idx.as_uint(), align.bytes() as u32); - } for (attr, llattr) in OPTIMIZATION_ATTRIBUTES { if regular.contains(attr) { llattr.apply_llfn(idx, llfn); @@ -105,6 +105,13 @@ impl ArgAttributesExt for ArgAttributes { llattr.apply_callsite(idx, callsite); } } + if let Some(align) = self.pointee_align { + llvm::LLVMRustAddAlignmentCallSiteAttr( + callsite, + idx.as_uint(), + align.bytes() as u32, + ); + } match self.arg_ext { ArgExtension::None => {} ArgExtension::Zext => llvm::Attribute::ZExt.apply_callsite(idx, callsite), @@ -127,13 +134,6 @@ impl ArgAttributesExt for ArgAttributes { } regular -= ArgAttribute::NonNull; } - if let Some(align) = self.pointee_align { - llvm::LLVMRustAddAlignmentCallSiteAttr( - callsite, - idx.as_uint(), - align.bytes() as u32, - ); - } for (attr, llattr) in OPTIMIZATION_ATTRIBUTES { if regular.contains(attr) { llattr.apply_callsite(idx, callsite); diff --git a/src/test/codegen/function-arguments-noopt.rs b/src/test/codegen/function-arguments-noopt.rs index c8c88888978..1d740a4b329 100644 --- a/src/test/codegen/function-arguments-noopt.rs +++ b/src/test/codegen/function-arguments-noopt.rs @@ -23,7 +23,7 @@ pub fn boolean_call(x: bool, f: fn(bool) -> bool) -> bool { f(x) } -// CHECK: define i32* @borrow(i32* %x) +// CHECK: define align 4 i32* @borrow(i32* align 4 %x) #[no_mangle] pub fn borrow(x: &i32) -> &i32 { x @@ -32,7 +32,7 @@ pub fn borrow(x: &i32) -> &i32 { // CHECK-LABEL: @borrow_call #[no_mangle] pub fn borrow_call(x: &i32, f: fn(&i32) -> &i32) -> &i32 { - // CHECK: call i32* %f(i32* %x) + // CHECK: call align 4 i32* %f(i32* align 4 %x) f(x) }