[clang] 7e01e64 - [X86][vectorcall] Do not consume register for indirect return value (#97939)

via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 8 06:23:11 PDT 2024


Author: Phoebe Wang
Date: 2024-07-08T21:23:08+08:00
New Revision: 7e01e64714eceedaf88c20f67d431a295950eed0

URL: https://github.com/llvm/llvm-project/commit/7e01e64714eceedaf88c20f67d431a295950eed0
DIFF: https://github.com/llvm/llvm-project/commit/7e01e64714eceedaf88c20f67d431a295950eed0.diff

LOG: [X86][vectorcall] Do not consume register for indirect return value (#97939)

This is how MSVC handles it. https://godbolt.org/z/Eav3vx7cd

Added: 
    

Modified: 
    clang/lib/CodeGen/Targets/X86.cpp
    clang/test/CodeGen/stdcall-fastcall.c
    clang/test/CodeGen/vectorcall.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/Targets/X86.cpp b/clang/lib/CodeGen/Targets/X86.cpp
index 3146caba1c6158..1dc3172a6bdf9b 100644
--- a/clang/lib/CodeGen/Targets/X86.cpp
+++ b/clang/lib/CodeGen/Targets/X86.cpp
@@ -469,7 +469,8 @@ bool X86_32ABIInfo::canExpandIndirectArgument(QualType Ty) const {
 ABIArgInfo X86_32ABIInfo::getIndirectReturnResult(QualType RetTy, CCState &State) const {
   // If the return value is indirect, then the hidden argument is consuming one
   // integer register.
-  if (State.FreeRegs) {
+  if (State.CC != llvm::CallingConv::X86_FastCall &&
+      State.CC != llvm::CallingConv::X86_VectorCall && State.FreeRegs) {
     --State.FreeRegs;
     if (!IsMCUABI)
       return getNaturalAlignIndirectInReg(RetTy);

diff  --git a/clang/test/CodeGen/stdcall-fastcall.c b/clang/test/CodeGen/stdcall-fastcall.c
index f6d86d24463f32..5014b7d48e5b9c 100644
--- a/clang/test/CodeGen/stdcall-fastcall.c
+++ b/clang/test/CodeGen/stdcall-fastcall.c
@@ -151,3 +151,9 @@ void bar13(long long a, int b, int c) {
   // CHECK: call x86_fastcallcc void @foo13(i64 noundef %{{.*}}, i32 inreg noundef %{{.*}}, i32 inreg noundef %
   foo13(a, b, c);
 }
+
+struct S2 __attribute__((fastcall)) foo14(int a) {
+  // CHECK-LABEL: define dso_local x86_fastcallcc void @foo14(ptr dead_on_unwind noalias writable sret(%struct.S2) align 4 %agg.result, i32 inreg noundef %a)
+  struct S2 r = {a};
+  return r;
+}

diff  --git a/clang/test/CodeGen/vectorcall.c b/clang/test/CodeGen/vectorcall.c
index 71dc3b0b9585a6..cab7fc0972d7b0 100644
--- a/clang/test/CodeGen/vectorcall.c
+++ b/clang/test/CodeGen/vectorcall.c
@@ -90,7 +90,7 @@ struct HVA4 __vectorcall hva6(struct HVA4 a, struct HVA4 b) { return b;}
 // X64: define dso_local x86_vectorcallcc %struct.HVA4 @"\01hva6@@128"(%struct.HVA4 inreg %a.coerce, ptr noundef %b)
 
 struct HVA5 __vectorcall hva7(void) {struct HVA5 a = {}; return a;}
-// X86: define dso_local x86_vectorcallcc void @"\01hva7@@0"(ptr dead_on_unwind inreg noalias writable sret(%struct.HVA5) align 16 %agg.result)
+// X86: define dso_local x86_vectorcallcc void @"\01hva7@@0"(ptr dead_on_unwind noalias writable sret(%struct.HVA5) align 16 %agg.result)
 // X64: define dso_local x86_vectorcallcc void @"\01hva7@@0"(ptr dead_on_unwind noalias writable sret(%struct.HVA5) align 16 %agg.result)
 
 v4f32 __vectorcall hva8(v4f32 a, v4f32 b, v4f32 c, v4f32 d, int e, v4f32 f) {return f;}


        


More information about the cfe-commits mailing list