round pointer to alignment without going via int
diff --git a/compiler/rustc_codegen_llvm/src/va_arg.rs b/compiler/rustc_codegen_llvm/src/va_arg.rs
index ce079f3..7eb5d30 100644
--- a/compiler/rustc_codegen_llvm/src/va_arg.rs
+++ b/compiler/rustc_codegen_llvm/src/va_arg.rs
@@ -28,9 +28,12 @@ fn round_pointer_up_to_alignment<'ll>(
align: Align,
ptr_ty: &'ll Type,
) -> &'ll Value {
- let mut ptr_as_int = bx.ptrtoint(addr, bx.cx().type_isize());
- ptr_as_int = round_up_to_alignment(bx, ptr_as_int, align);
- bx.inttoptr(ptr_as_int, ptr_ty)
+ let ptr = bx.inbounds_ptradd(addr, bx.const_i32(align.bytes() as i32 - 1));
+ bx.call_intrinsic(
+ "llvm.ptrmask",
+ &[ptr_ty, bx.type_i32()],
+ &[ptr, bx.const_int(bx.isize_ty, -(align.bytes() as isize) as i64)],
+ )
}
fn emit_direct_ptr_va_arg<'ll, 'tcx>(