Index: llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -623,7 +623,7 @@ uint64_t StackOffset = Assigner.StackOffset; if (F.isVarArg()) { auto &Subtarget = MF.getSubtarget(); - if (!Subtarget.isTargetDarwin()) { + if (!Subtarget.isTargetDarwin() || Subtarget.isCallingConvWin64(F.getCallingConv())) { // FIXME: we need to reimplement saveVarArgsRegisters from // AArch64ISelLowering. return false; Index: llvm/test/CodeGen/AArch64/aarch64_win64cc_vararg.ll =================================================================== --- llvm/test/CodeGen/AArch64/aarch64_win64cc_vararg.ll +++ llvm/test/CodeGen/AArch64/aarch64_win64cc_vararg.ll @@ -1,7 +1,24 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s +; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel=1 -global-isel-abort=0 | FileCheck %s --check-prefix=CHECK-DARWIN define win64cc void @pass_va(i32 %count, ...) nounwind { +; CHECK-LINUX-LABEL: pass_va: +; CHECK-LINUX: // %bb.0: // %entry +; CHECK-LINUX-NEXT: sub sp, sp, #96 +; CHECK-LINUX-NEXT: add x8, sp, #40 +; CHECK-LINUX-NEXT: add x0, sp, #40 +; CHECK-LINUX-NEXT: stp x30, x18, [sp, #16] // 16-byte Folded Spill +; CHECK-LINUX-NEXT: stp x3, x4, [sp, #56] +; CHECK-LINUX-NEXT: stp x1, x2, [sp, #40] +; CHECK-LINUX-NEXT: stp x5, x6, [sp, #72] +; CHECK-LINUX-NEXT: str x7, [sp, #88] +; CHECK-LINUX-NEXT: str x8, [sp, #8] +; CHECK-LINUX-NEXT: bl other_func +; CHECK-LINUX-NEXT: ldp x30, x18, [sp, #16] // 16-byte Folded Reload +; CHECK-LINUX-NEXT: add sp, sp, #96 +; CHECK-LINUX-NEXT: ret +; ; CHECK-LABEL: pass_va: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: sub sp, sp, #96 @@ -17,6 +34,22 @@ ; CHECK-NEXT: ldp x30, x18, [sp, #16] // 16-byte Folded Reload ; CHECK-NEXT: add sp, sp, #96 ; CHECK-NEXT: ret +; +; CHECK-DARWIN-LABEL: pass_va: +; CHECK-DARWIN: ; %bb.0: ; %entry +; CHECK-DARWIN-NEXT: str x18, [sp, #-96]! ; 8-byte Folded Spill +; CHECK-DARWIN-NEXT: add x8, sp, #40 +; CHECK-DARWIN-NEXT: add x0, sp, #40 +; CHECK-DARWIN-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill +; CHECK-DARWIN-NEXT: stp x3, x4, [sp, #56] +; CHECK-DARWIN-NEXT: stp x1, x2, [sp, #40] +; CHECK-DARWIN-NEXT: stp x5, x6, [sp, #72] +; CHECK-DARWIN-NEXT: str x7, [sp, #88] +; CHECK-DARWIN-NEXT: str x8, [sp, #8] +; CHECK-DARWIN-NEXT: bl _other_func +; CHECK-DARWIN-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload +; CHECK-DARWIN-NEXT: ldr x18, [sp], #96 ; 8-byte Folded Reload +; CHECK-DARWIN-NEXT: ret entry: %ap = alloca ptr, align 8 call void @llvm.va_start(ptr %ap) @@ -31,6 +64,15 @@ declare void @llvm.va_copy(ptr, ptr) nounwind define win64cc ptr @f9(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, i64 %a8, ...) nounwind { +; CHECK-LINUX-LABEL: f9: +; CHECK-LINUX: // %bb.0: // %entry +; CHECK-LINUX-NEXT: str x18, [sp, #-16]! // 8-byte Folded Spill +; CHECK-LINUX-NEXT: add x8, sp, #24 +; CHECK-LINUX-NEXT: add x0, sp, #24 +; CHECK-LINUX-NEXT: str x8, [sp, #8] +; CHECK-LINUX-NEXT: ldr x18, [sp], #16 // 8-byte Folded Reload +; CHECK-LINUX-NEXT: ret +; ; CHECK-LABEL: f9: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: str x18, [sp, #-16]! // 8-byte Folded Spill @@ -39,6 +81,15 @@ ; CHECK-NEXT: str x8, [sp, #8] ; CHECK-NEXT: ldr x18, [sp], #16 // 8-byte Folded Reload ; CHECK-NEXT: ret +; +; CHECK-DARWIN-LABEL: f9: +; CHECK-DARWIN: ; %bb.0: ; %entry +; CHECK-DARWIN-NEXT: str x18, [sp, #-16]! ; 8-byte Folded Spill +; CHECK-DARWIN-NEXT: add x8, sp, #24 +; CHECK-DARWIN-NEXT: add x0, sp, #24 +; CHECK-DARWIN-NEXT: str x8, [sp, #8] +; CHECK-DARWIN-NEXT: ldr x18, [sp], #16 ; 8-byte Folded Reload +; CHECK-DARWIN-NEXT: ret entry: %ap = alloca ptr, align 8 call void @llvm.va_start(ptr %ap) @@ -47,6 +98,15 @@ } define win64cc ptr @f8(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, ...) nounwind { +; CHECK-LINUX-LABEL: f8: +; CHECK-LINUX: // %bb.0: // %entry +; CHECK-LINUX-NEXT: str x18, [sp, #-16]! // 8-byte Folded Spill +; CHECK-LINUX-NEXT: add x8, sp, #16 +; CHECK-LINUX-NEXT: add x0, sp, #16 +; CHECK-LINUX-NEXT: str x8, [sp, #8] +; CHECK-LINUX-NEXT: ldr x18, [sp], #16 // 8-byte Folded Reload +; CHECK-LINUX-NEXT: ret +; ; CHECK-LABEL: f8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: str x18, [sp, #-16]! // 8-byte Folded Spill @@ -55,6 +115,15 @@ ; CHECK-NEXT: str x8, [sp, #8] ; CHECK-NEXT: ldr x18, [sp], #16 // 8-byte Folded Reload ; CHECK-NEXT: ret +; +; CHECK-DARWIN-LABEL: f8: +; CHECK-DARWIN: ; %bb.0: ; %entry +; CHECK-DARWIN-NEXT: str x18, [sp, #-16]! ; 8-byte Folded Spill +; CHECK-DARWIN-NEXT: add x8, sp, #16 +; CHECK-DARWIN-NEXT: add x0, sp, #16 +; CHECK-DARWIN-NEXT: str x8, [sp, #8] +; CHECK-DARWIN-NEXT: ldr x18, [sp], #16 ; 8-byte Folded Reload +; CHECK-DARWIN-NEXT: ret entry: %ap = alloca ptr, align 8 call void @llvm.va_start(ptr %ap) @@ -63,6 +132,16 @@ } define win64cc ptr @f7(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, ...) nounwind { +; CHECK-LINUX-LABEL: f7: +; CHECK-LINUX: // %bb.0: // %entry +; CHECK-LINUX-NEXT: str x18, [sp, #-32]! // 8-byte Folded Spill +; CHECK-LINUX-NEXT: add x8, sp, #24 +; CHECK-LINUX-NEXT: add x0, sp, #24 +; CHECK-LINUX-NEXT: str x7, [sp, #24] +; CHECK-LINUX-NEXT: str x8, [sp, #8] +; CHECK-LINUX-NEXT: ldr x18, [sp], #32 // 8-byte Folded Reload +; CHECK-LINUX-NEXT: ret +; ; CHECK-LABEL: f7: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: str x18, [sp, #-32]! // 8-byte Folded Spill @@ -72,6 +151,16 @@ ; CHECK-NEXT: str x8, [sp, #8] ; CHECK-NEXT: ldr x18, [sp], #32 // 8-byte Folded Reload ; CHECK-NEXT: ret +; +; CHECK-DARWIN-LABEL: f7: +; CHECK-DARWIN: ; %bb.0: ; %entry +; CHECK-DARWIN-NEXT: str x18, [sp, #-32]! ; 8-byte Folded Spill +; CHECK-DARWIN-NEXT: add x8, sp, #24 +; CHECK-DARWIN-NEXT: add x0, sp, #24 +; CHECK-DARWIN-NEXT: str x7, [sp, #24] +; CHECK-DARWIN-NEXT: str x8, [sp, #8] +; CHECK-DARWIN-NEXT: ldr x18, [sp], #32 ; 8-byte Folded Reload +; CHECK-DARWIN-NEXT: ret entry: %ap = alloca ptr, align 8 call void @llvm.va_start(ptr %ap)