Skip to content

Commit b2d7d72

Browse files
[AArch64] Use ptrmask for vaarg stack alignment (#92836)
1 parent 1486653 commit b2d7d72

File tree

2 files changed

+11
-32
lines changed

2 files changed

+11
-32
lines changed

clang/lib/CodeGen/Targets/AArch64.cpp

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -750,18 +750,7 @@ Address AArch64ABIInfo::EmitAAPCSVAArg(Address VAListAddr, QualType Ty,
750750
// Again, stack arguments may need realignment. In this case both integer and
751751
// floating-point ones might be affected.
752752
if (!IsIndirect && TyAlign.getQuantity() > 8) {
753-
int Align = TyAlign.getQuantity();
754-
755-
OnStackPtr = CGF.Builder.CreatePtrToInt(OnStackPtr, CGF.Int64Ty);
756-
757-
OnStackPtr = CGF.Builder.CreateAdd(
758-
OnStackPtr, llvm::ConstantInt::get(CGF.Int64Ty, Align - 1),
759-
"align_stack");
760-
OnStackPtr = CGF.Builder.CreateAnd(
761-
OnStackPtr, llvm::ConstantInt::get(CGF.Int64Ty, -Align),
762-
"align_stack");
763-
764-
OnStackPtr = CGF.Builder.CreateIntToPtr(OnStackPtr, CGF.Int8PtrTy);
753+
OnStackPtr = emitRoundPointerUpToAlignment(CGF, OnStackPtr, TyAlign);
765754
}
766755
Address OnStackAddr = Address(OnStackPtr, CGF.Int8Ty,
767756
std::max(CharUnits::fromQuantity(8), TyAlign));

clang/test/CodeGen/aarch64-varargs.c

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ __int128 aligned_int(void) {
6363

6464
// CHECK: [[VAARG_ON_STACK]]
6565
// CHECK: [[STACK:%[a-z_0-9]+]] = load ptr, ptr @the_list
66-
// CHECK: [[STACKINT:%[a-z_0-9]+]] = ptrtoint ptr [[STACK]] to i64
67-
// CHECK: [[ALIGN_STACK:%[a-z_0-9]+]] = add i64 [[STACKINT]], 15
68-
// CHECK: [[ALIGNED_STACK_INT:%[a-z_0-9]+]] = and i64 [[ALIGN_STACK]], -16
69-
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9]+]] = inttoptr i64 [[ALIGNED_STACK_INT]] to ptr
66+
// CHECK: [[STACKINC:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[STACK]], i32 15
67+
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9.]+]] = call ptr @llvm.ptrmask.p0.i64(ptr [[STACKINC]], i64 -16)
7068
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[ALIGNED_STACK_PTR]], i64 16
7169
// CHECK: store ptr [[NEW_STACK]], ptr @the_list
7270
// CHECK: br label %[[VAARG_END]]
@@ -377,10 +375,8 @@ underaligned_int128 underaligned_int128_test(void) {
377375

378376
// CHECK: [[VAARG_ON_STACK]]
379377
// CHECK: [[STACK:%[a-z_0-9]+]] = load ptr, ptr @the_list
380-
// CHECK: [[STACKINT:%[a-z_0-9]+]] = ptrtoint ptr [[STACK]] to i64
381-
// CHECK: [[ALIGN_STACK:%[a-z_0-9]+]] = add i64 [[STACKINT]], 15
382-
// CHECK: [[ALIGNED_STACK_INT:%[a-z_0-9]+]] = and i64 [[ALIGN_STACK]], -16
383-
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9]+]] = inttoptr i64 [[ALIGNED_STACK_INT]] to ptr
378+
// CHECK: [[STACKINC:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[STACK]], i32 15
379+
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9.]+]] = call ptr @llvm.ptrmask.p0.i64(ptr [[STACKINC]], i64 -16)
384380
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[ALIGNED_STACK_PTR]], i64 16
385381
// CHECK: store ptr [[NEW_STACK]], ptr @the_list
386382
// CHECK: br label %[[VAARG_END]]
@@ -414,10 +410,8 @@ overaligned_int128 overaligned_int128_test(void) {
414410

415411
// CHECK: [[VAARG_ON_STACK]]
416412
// CHECK: [[STACK:%[a-z_0-9]+]] = load ptr, ptr @the_list
417-
// CHECK: [[STACKINT:%[a-z_0-9]+]] = ptrtoint ptr [[STACK]] to i64
418-
// CHECK: [[ALIGN_STACK:%[a-z_0-9]+]] = add i64 [[STACKINT]], 15
419-
// CHECK: [[ALIGNED_STACK_INT:%[a-z_0-9]+]] = and i64 [[ALIGN_STACK]], -16
420-
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9]+]] = inttoptr i64 [[ALIGNED_STACK_INT]] to ptr
413+
// CHECK: [[STACKINC:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[STACK]], i32 15
414+
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9.]+]] = call ptr @llvm.ptrmask.p0.i64(ptr [[STACKINC]], i64 -16)
421415
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[ALIGNED_STACK_PTR]], i64 16
422416
// CHECK: store ptr [[NEW_STACK]], ptr @the_list
423417
// CHECK: br label %[[VAARG_END]]
@@ -688,10 +682,8 @@ overaligned_int_struct_member overaligned_int_struct_member_test(void) {
688682

689683
// CHECK: [[VAARG_ON_STACK]]
690684
// CHECK: [[STACK:%[a-z_0-9]+]] = load ptr, ptr @the_list
691-
// CHECK: [[STACKINT:%[a-z_0-9]+]] = ptrtoint ptr [[STACK]] to i64
692-
// CHECK: [[ALIGN_STACK:%[a-z_0-9]+]] = add i64 [[STACKINT]], 15
693-
// CHECK: [[ALIGNED_STACK_INT:%[a-z_0-9]+]] = and i64 [[ALIGN_STACK]], -16
694-
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9]+]] = inttoptr i64 [[ALIGNED_STACK_INT]] to ptr
685+
// CHECK: [[STACKINC:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[STACK]], i32 15
686+
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9.]+]] = call ptr @llvm.ptrmask.p0.i64(ptr [[STACKINC]], i64 -16)
695687
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[ALIGNED_STACK_PTR]], i64 16
696688
// CHECK: store ptr [[NEW_STACK]], ptr @the_list
697689
// CHECK: br label %[[VAARG_END]]
@@ -756,10 +748,8 @@ overaligned_long_long_struct_member overaligned_long_long_struct_member_test(voi
756748

757749
// CHECK: [[VAARG_ON_STACK]]
758750
// CHECK: [[STACK:%[a-z_0-9]+]] = load ptr, ptr @the_list
759-
// CHECK: [[STACKINT:%[a-z_0-9]+]] = ptrtoint ptr [[STACK]] to i64
760-
// CHECK: [[ALIGN_STACK:%[a-z_0-9]+]] = add i64 [[STACKINT]], 15
761-
// CHECK: [[ALIGNED_STACK_INT:%[a-z_0-9]+]] = and i64 [[ALIGN_STACK]], -16
762-
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9]+]] = inttoptr i64 [[ALIGNED_STACK_INT]] to ptr
751+
// CHECK: [[STACKINC:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[STACK]], i32 15
752+
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9.]+]] = call ptr @llvm.ptrmask.p0.i64(ptr [[STACKINC]], i64 -16)
763753
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[ALIGNED_STACK_PTR]], i64 16
764754
// CHECK: store ptr [[NEW_STACK]], ptr @the_list
765755
// CHECK: br label %[[VAARG_END]]

0 commit comments

Comments
 (0)