[llvm] r357317 - [X86] When using Win64 ABI, exit with error if SSE is disabled for varargs

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 29 14:30:51 PDT 2019


Author: aemerson
Date: Fri Mar 29 14:30:51 2019
New Revision: 357317

URL: http://llvm.org/viewvc/llvm-project?rev=357317&view=rev
Log:
[X86] When using Win64 ABI, exit with error if SSE is disabled for varargs

We need XMM registers to handle varargs with the Win64 ABI. Before we would
silently generate bad code resulting in an assertion failure elsewhere in the
backend.

Added:
    llvm/trunk/test/CodeGen/X86/win64-nosse-error.ll
Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=357317&r1=357316&r2=357317&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Fri Mar 29 14:30:51 2019
@@ -3780,6 +3780,9 @@ X86TargetLowering::LowerCall(TargetLower
     } else if (VA.isRegLoc()) {
       RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
       if (isVarArg && IsWin64) {
+        if (!Subtarget.hasSSE1())
+          errorUnsupported(
+              DAG, dl, "Win64 ABI varargs functions require SSE to be enabled");
         // Win64 ABI requires argument XMM reg to be copied to the corresponding
         // shadow reg if callee is a varargs function.
         unsigned ShadowReg = 0;

Added: llvm/trunk/test/CodeGen/X86/win64-nosse-error.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win64-nosse-error.ll?rev=357317&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/win64-nosse-error.ll (added)
+++ llvm/trunk/test/CodeGen/X86/win64-nosse-error.ll Fri Mar 29 14:30:51 2019
@@ -0,0 +1,17 @@
+; RUN: not --crash llc %s -mattr="-sse" 2>&1 | FileCheck %s
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-macho"
+
+; Function Attrs: noimplicitfloat noinline noredzone nounwind optnone
+define void @crash() #0 {
+  call void (i32*, ...) @func(i32* null, double undef)
+  ret void
+}
+; CHECK: in function crash void (): Win64 ABI varargs functions require SSE to be enabled
+; Function Attrs: noimplicitfloat noredzone
+declare void @func(i32*, ...)
+
+attributes #0 = { "target-cpu"="x86-64" "target-features"="-sse"}
+
+




More information about the llvm-commits mailing list