sgraenitz updated this revision to Diff 462871. sgraenitz added a comment. Herald added a subscriber: hiraditya. Herald added a project: LLVM.
Follow Reid's advice from https://github.com/llvm/llvm-project/issues/56952#issuecomment-1255552565 and fix the instruction sequence expanded from CALL_RVMARKER on Windows (use RCX as target register and not RDI). This way we stay as close as possible to Apple's ABI and GNUstep has the option to implement detection of optimized callers for autorelease optimizations in the future. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D134441/new/ https://reviews.llvm.org/D134441 Files: llvm/lib/Target/X86/X86ExpandPseudo.cpp llvm/test/CodeGen/X86/call-rv-marker.ll Index: llvm/test/CodeGen/X86/call-rv-marker.ll =================================================================== --- llvm/test/CodeGen/X86/call-rv-marker.ll +++ llvm/test/CodeGen/X86/call-rv-marker.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-macosx -verify-machineinstrs -o - %s | FileCheck --check-prefix=CHECK %s +; RUN: llc -mtriple=x86_64-windows-msvc -verify-machineinstrs -o - %s | FileCheck --check-prefix=WINABI %s ; TODO: support marker generation with GlobalISel target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" @@ -33,6 +34,12 @@ ; CHECK-NEXT: popq %rcx ; CHECK-NEXT: retq ; +; WINABI-LABEL: rv_marker_1_retain: +; WINABI: callq foo1 +; WINABI-NEXT: movq %rax, %rcx +; WINABI-NEXT: callq objc_retainAutoreleasedReturnValue +; WINABI-NEXT: nop +; entry: %call = call ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ] ret ptr %call Index: llvm/lib/Target/X86/X86ExpandPseudo.cpp =================================================================== --- llvm/lib/Target/X86/X86ExpandPseudo.cpp +++ llvm/lib/Target/X86/X86ExpandPseudo.cpp @@ -224,9 +224,11 @@ // Emit marker "movq %rax, %rdi". %rdi is not callee-saved, so it cannot be // live across the earlier call. The call to the ObjC runtime function returns // the first argument, so the value of %rax is unchanged after the ObjC - // runtime call. + // runtime call. On Windows targets, the runtime call follows the regular + // x64 calling convention and expects the first argument in %rcx. + auto TargetReg = STI->getTargetTriple().isOSWindows() ? X86::RCX : X86::RDI; auto *Marker = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(X86::MOV64rr)) - .addReg(X86::RDI, RegState::Define) + .addReg(TargetReg, RegState::Define) .addReg(X86::RAX) .getInstr(); if (MI.shouldUpdateCallSiteInfo())
Index: llvm/test/CodeGen/X86/call-rv-marker.ll =================================================================== --- llvm/test/CodeGen/X86/call-rv-marker.ll +++ llvm/test/CodeGen/X86/call-rv-marker.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-macosx -verify-machineinstrs -o - %s | FileCheck --check-prefix=CHECK %s +; RUN: llc -mtriple=x86_64-windows-msvc -verify-machineinstrs -o - %s | FileCheck --check-prefix=WINABI %s ; TODO: support marker generation with GlobalISel target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" @@ -33,6 +34,12 @@ ; CHECK-NEXT: popq %rcx ; CHECK-NEXT: retq ; +; WINABI-LABEL: rv_marker_1_retain: +; WINABI: callq foo1 +; WINABI-NEXT: movq %rax, %rcx +; WINABI-NEXT: callq objc_retainAutoreleasedReturnValue +; WINABI-NEXT: nop +; entry: %call = call ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ] ret ptr %call Index: llvm/lib/Target/X86/X86ExpandPseudo.cpp =================================================================== --- llvm/lib/Target/X86/X86ExpandPseudo.cpp +++ llvm/lib/Target/X86/X86ExpandPseudo.cpp @@ -224,9 +224,11 @@ // Emit marker "movq %rax, %rdi". %rdi is not callee-saved, so it cannot be // live across the earlier call. The call to the ObjC runtime function returns // the first argument, so the value of %rax is unchanged after the ObjC - // runtime call. + // runtime call. On Windows targets, the runtime call follows the regular + // x64 calling convention and expects the first argument in %rcx. + auto TargetReg = STI->getTargetTriple().isOSWindows() ? X86::RCX : X86::RDI; auto *Marker = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(X86::MOV64rr)) - .addReg(X86::RDI, RegState::Define) + .addReg(TargetReg, RegState::Define) .addReg(X86::RAX) .getInstr(); if (MI.shouldUpdateCallSiteInfo())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits