[PATCH] D27522: [X86] Don't allow floating-point return types when SSE[12] is disabled
Visoiu Mistrih Francis via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 7 07:24:31 PST 2016
thegameg created this revision.
thegameg added reviewers: craig.topper, mkuper, hfinkel, joerg, RKSimon.
thegameg added a subscriber: llvm-commits.
The following program hits a fatal_error in the X86 backend, when the
program is compiled with -mno-sse or -mno-sse2, which is understandable
due to the calling convention:
> float f() { return 0.5f; };
since the error occurs in the backend, there are stack traces and bug
report messages that are generated.
This patch allows clang to avoid crashing and report a proper diagnostic.
No tests are included in this patch, since it was already tested in llvm's codegen test suite.
https://reviews.llvm.org/D27522
Files:
lib/Target/X86/X86ISelLowering.cpp
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp
+++ lib/Target/X86/X86ISelLowering.cpp
@@ -44,6 +44,7 @@
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
+#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
@@ -69,6 +70,14 @@
"rather than promotion."),
cl::Hidden);
+namespace {
+void diagnose_fatal_error(SelectionDAG &DAG, const SDLoc &dl, const char *msg) {
+ MachineFunction &MF = DAG.getMachineFunction();
+ DAG.getContext()->diagnose(
+ DiagnosticInfoUnsupported(*MF.getFunction(), msg, dl.getDebugLoc()));
+}
+}
+
X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
const X86Subtarget &STI)
: TargetLowering(TM), Subtarget(STI) {
@@ -2189,15 +2198,17 @@
// or SSE or MMX vectors.
if ((ValVT == MVT::f32 || ValVT == MVT::f64 ||
VA.getLocReg() == X86::XMM0 || VA.getLocReg() == X86::XMM1) &&
- (Subtarget.is64Bit() && !Subtarget.hasSSE1())) {
- report_fatal_error("SSE register return with SSE disabled");
+ (Subtarget.is64Bit() && !Subtarget.hasSSE1())) {
+ diagnose_fatal_error(DAG, dl, "SSE register return with SSE disabled");
+ VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
}
// Likewise we can't return F64 values with SSE1 only. gcc does so, but
// llvm-gcc has never done it right and no one has noticed, so this
// should be OK for now.
- if (ValVT == MVT::f64 &&
- (Subtarget.is64Bit() && !Subtarget.hasSSE2()))
- report_fatal_error("SSE2 register return with SSE2 disabled");
+ if (ValVT == MVT::f64 && (Subtarget.is64Bit() && !Subtarget.hasSSE2())) {
+ diagnose_fatal_error(DAG, dl, "SSE2 register return with SSE2 disabled");
+ VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
+ }
// Returns in ST0/ST1 are handled specially: these are pushed as operands to
// the RET instruction and handled by the FP Stackifier.
@@ -2477,7 +2488,8 @@
// If this is x86-64, and we disabled SSE, we can't return FP values
if ((CopyVT == MVT::f32 || CopyVT == MVT::f64 || CopyVT == MVT::f128) &&
((Is64Bit || Ins[InsIndex].Flags.isInReg()) && !Subtarget.hasSSE1())) {
- report_fatal_error("SSE register return with SSE disabled");
+ diagnose_fatal_error(DAG, dl, "SSE register return with SSE disabled");
+ VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
}
// If we prefer to use the value in xmm registers, copy it out as f80 and
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27522.80594.patch
Type: text/x-patch
Size: 2776 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161207/36db8a79/attachment.bin>
More information about the llvm-commits
mailing list