llvm-project icon indicating copy to clipboard operation
llvm-project copied to clipboard

[X86_64] fix SSE type error in vaarg.

Open CoTinker opened this issue 1 year ago • 4 comments

tweak the position of the ++neededSSE when Lo is NoClass and Hi is SSE. Fix #86371.

CoTinker avatar Mar 23 '24 04:03 CoTinker

@llvm/pr-subscribers-clang

@llvm/pr-subscribers-backend-x86

Author: Longsheng Mou (CoTinker)

Changes

tweak the position of the ++neededSSE when Lo is NoClass and Hi is SSE. Fix #86371.


Full diff: https://github.com/llvm/llvm-project/pull/86377.diff

2 Files Affected:

  • (modified) clang/lib/CodeGen/Targets/X86.cpp (+1-2)
  • (modified) clang/test/CodeGenCXX/x86_64-vaarg.cpp (+15)
diff --git a/clang/lib/CodeGen/Targets/X86.cpp b/clang/lib/CodeGen/Targets/X86.cpp
index 1ec0f159ebcb8a..6931768147a9b2 100644
--- a/clang/lib/CodeGen/Targets/X86.cpp
+++ b/clang/lib/CodeGen/Targets/X86.cpp
@@ -2788,12 +2788,11 @@ X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned freeIntRegs,
     // memory), except in situations involving unions.
   case X87Up:
   case SSE:
+    ++neededSSE;
     HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
 
     if (Lo == NoClass)  // Pass HighPart at offset 8 in memory.
       return ABIArgInfo::getDirect(HighPart, 8);
-
-    ++neededSSE;
     break;
 
     // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
diff --git a/clang/test/CodeGenCXX/x86_64-vaarg.cpp b/clang/test/CodeGenCXX/x86_64-vaarg.cpp
index f0177906a09a81..82c32329502816 100644
--- a/clang/test/CodeGenCXX/x86_64-vaarg.cpp
+++ b/clang/test/CodeGenCXX/x86_64-vaarg.cpp
@@ -21,3 +21,18 @@ empty empty_record_test(int z, ...) {
   __builtin_va_start(list, z);
   return __builtin_va_arg(list, empty);
 }
+
+typedef struct {
+  struct{} a;
+  double b;
+} s1;
+
+// CHECK-LABEL: define{{.*}} double @{{.*}}f
+// CHECK: vaarg.in_reg:
+// CHECK: vaarg.in_mem:
+// CHECK: vaarg.end:
+s1 f(int z, ...) {
+  __builtin_va_list list;
+  __builtin_va_start(list, z);
+  return __builtin_va_arg(list, s1);
+}

llvmbot avatar Mar 23 '24 04:03 llvmbot

@llvm/pr-subscribers-clang-codegen

Author: Longsheng Mou (CoTinker)

Changes

tweak the position of the ++neededSSE when Lo is NoClass and Hi is SSE. Fix #86371.


Full diff: https://github.com/llvm/llvm-project/pull/86377.diff

2 Files Affected:

  • (modified) clang/lib/CodeGen/Targets/X86.cpp (+1-2)
  • (modified) clang/test/CodeGenCXX/x86_64-vaarg.cpp (+15)
diff --git a/clang/lib/CodeGen/Targets/X86.cpp b/clang/lib/CodeGen/Targets/X86.cpp
index 1ec0f159ebcb8a..6931768147a9b2 100644
--- a/clang/lib/CodeGen/Targets/X86.cpp
+++ b/clang/lib/CodeGen/Targets/X86.cpp
@@ -2788,12 +2788,11 @@ X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned freeIntRegs,
     // memory), except in situations involving unions.
   case X87Up:
   case SSE:
+    ++neededSSE;
     HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
 
     if (Lo == NoClass)  // Pass HighPart at offset 8 in memory.
       return ABIArgInfo::getDirect(HighPart, 8);
-
-    ++neededSSE;
     break;
 
     // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
diff --git a/clang/test/CodeGenCXX/x86_64-vaarg.cpp b/clang/test/CodeGenCXX/x86_64-vaarg.cpp
index f0177906a09a81..82c32329502816 100644
--- a/clang/test/CodeGenCXX/x86_64-vaarg.cpp
+++ b/clang/test/CodeGenCXX/x86_64-vaarg.cpp
@@ -21,3 +21,18 @@ empty empty_record_test(int z, ...) {
   __builtin_va_start(list, z);
   return __builtin_va_arg(list, empty);
 }
+
+typedef struct {
+  struct{} a;
+  double b;
+} s1;
+
+// CHECK-LABEL: define{{.*}} double @{{.*}}f
+// CHECK: vaarg.in_reg:
+// CHECK: vaarg.in_mem:
+// CHECK: vaarg.end:
+s1 f(int z, ...) {
+  __builtin_va_list list;
+  __builtin_va_start(list, z);
+  return __builtin_va_arg(list, s1);
+}

llvmbot avatar Mar 23 '24 04:03 llvmbot

:white_check_mark: With the latest revision this PR passed the Python code formatter.

github-actions[bot] avatar Mar 23 '24 04:03 github-actions[bot]

:white_check_mark: With the latest revision this PR passed the C/C++ code formatter.

github-actions[bot] avatar Mar 23 '24 04:03 github-actions[bot]

Thanks.

CoTinker avatar Mar 26 '24 01:03 CoTinker

/cherry-pick https://github.com/llvm/llvm-project/commit/9c8dd5e6f6bd93deb95de9642632223f54a18a11

AZero13 avatar Mar 26 '24 16:03 AZero13

/cherry-pick https://github.com/llvm/llvm-project/commit/9c8dd5e6f6bd93deb95de9642632223f54a18a11

Error: Command failed due to missing milestone.

llvmbot avatar Mar 26 '24 17:03 llvmbot