X86: pass swift_async context in R14 on Win64
authorSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 14 Jun 2021 01:22:59 +0000 (18:22 -0700)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 14 Jun 2021 18:02:21 +0000 (11:02 -0700)
Pass swift_async context in a callee-saved register rather than as a
regular parameter.  This is similar to the Swift `self` and `error`
parameters.

llvm/lib/Target/X86/X86CallingConv.td
llvm/test/CodeGen/X86/swift-async-reg-win64.ll [new file with mode: 0644]

index c86d658..98883bb 100644 (file)
@@ -627,6 +627,10 @@ def CC_X86_Win64_C : CallingConv<[
   // Pass SwiftSelf in a callee saved register.
   CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>,
 
+  // Pass SwiftAsync in an otherwise callee saved register so that calls to
+  // normal functions don't need to save it somewhere.
+  CCIfSwiftAsync<CCIfType<[i64], CCAssignToReg<[R14]>>>,
+
   // The 'CFGuardTarget' parameter, if any, is passed in RAX.
   CCIfCFGuardTarget<CCAssignToReg<[RAX]>>,
 
diff --git a/llvm/test/CodeGen/X86/swift-async-reg-win64.ll b/llvm/test/CodeGen/X86/swift-async-reg-win64.ll
new file mode 100644 (file)
index 0000000..96b3ef7
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: llc -mtriple x86_64-unknown-windows-msvc %s -o - | FileCheck %s
+; RUN: llc -mtriple x86_64-unknown-windows-msvc %s -o - -fast-isel | FileCheck %s
+
+define i8* @argument(i8* swiftasync %in) {
+  ret i8* %in
+}
+
+; CHECK-LABEL: argument:
+; CHECK: movq    %r14, %rax
+
+define void @call(i8* %in) {
+  call i8* @argument(i8* swiftasync %in)
+  ret void
+}
+
+; CHECK-LABEL: call:
+; CHECK: movq %rcx, %r14