summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp3
-rw-r--r--llvm/test/CodeGen/X86/win64-nosse-error.ll17
2 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a5691cdfc6a..6f9caf1d0bb 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -3780,6 +3780,9 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
} 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;
diff --git a/llvm/test/CodeGen/X86/win64-nosse-error.ll b/llvm/test/CodeGen/X86/win64-nosse-error.ll
new file mode 100644
index 00000000000..0d22adf0a79
--- /dev/null
+++ b/llvm/test/CodeGen/X86/win64-nosse-error.ll
@@ -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"}
+
+
OpenPOWER on IntegriCloud