diff options
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 3 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win64-nosse-error.ll | 17 |
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"} + + |