summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2015-04-20 11:56:59 +0000
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2015-04-20 11:56:59 +0000
commit98c367093d232b1fbf1a75aa6c7d3f0d5f31d51f (patch)
tree988b2fdd01519553d1fd3e220524dea3ae79cf28 /llvm
parent3ff1c381e0baa22e4b265c56c9e49f0132190b45 (diff)
downloadbcm5719-llvm-98c367093d232b1fbf1a75aa6c7d3f0d5f31d51f.tar.gz
bcm5719-llvm-98c367093d232b1fbf1a75aa6c7d3f0d5f31d51f.zip
[X86][FastIsel] Fix assertion failure when selecting int-to-double conversion (PR23273).
This fixes a regression introduced at revision 231243. The target-independent selection algorithm in FastISel knows how to select a SINT_TO_FP if the target is SSE but not AVX. That is because on X86, the tablegen'd 'fastEmit' functions know how to select CVTSI2SSrr and CVTSI2SDrr. Method X86FastISel::X86SelectSIToFP was therefore working under the wrong assumption that the target was AVX. That assumption was incorrect since we can have a target that is neither AVX nor SSE. So, rather than asserting for the presence of AVX, we should have had an early exit from 'X86SelectSIToFP' if the target was not AVX. This patch fixes the issue replacing the invalid assertion with an early exit. Thanks to Dimitry Andric for reporting this problem and for providing a small reproducible testcase. Added test pr23273.ll. llvm-svn: 235295
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/X86FastISel.cpp11
-rw-r--r--llvm/test/CodeGen/X86/pr23273.ll17
2 files changed, 23 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp
index cdf10a73cc6..4d0ea2166c7 100644
--- a/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/llvm/lib/Target/X86/X86FastISel.cpp
@@ -2065,6 +2065,12 @@ bool X86FastISel::X86SelectSelect(const Instruction *I) {
}
bool X86FastISel::X86SelectSIToFP(const Instruction *I) {
+ // The target-independent selection algorithm in FastISel already knows how
+ // to select a SINT_TO_FP if the target is SSE but not AVX.
+ // Early exit if the subtarget doesn't have AVX.
+ if (!Subtarget->hasAVX())
+ return false;
+
if (!I->getOperand(0)->getType()->isIntegerTy(32))
return false;
@@ -2087,11 +2093,6 @@ bool X86FastISel::X86SelectSIToFP(const Instruction *I) {
} else
return false;
- // The target-independent selection algorithm in FastISel already knows how
- // to select a SINT_TO_FP if the target is SSE but not AVX. This code is only
- // reachable if the subtarget has AVX.
- assert(Subtarget->hasAVX() && "Expected a subtarget with AVX!");
-
unsigned ImplicitDefReg = createResultReg(RC);
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
TII.get(TargetOpcode::IMPLICIT_DEF), ImplicitDefReg);
diff --git a/llvm/test/CodeGen/X86/pr23273.ll b/llvm/test/CodeGen/X86/pr23273.ll
new file mode 100644
index 00000000000..2702eb820f2
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr23273.ll
@@ -0,0 +1,17 @@
+; RUN: llc -mtriple=i386-unknown-unknown -mcpu=generic -march=x86 -mattr=-sse2 -fast-isel < %s
+
+; Verify that the backend doesn't crash during fast-isel with an assertion
+; failure when selecting a int-to-double conversion. The fast selection routine
+; for SINT_TO_FP wrongly assumed that the target had at least SSE2.
+
+@a = common global i32 0, align 4
+
+define i32 @pr23273() {
+entry:
+ %0 = load i32, i32* @a, align 4
+ %conv = sitofp i32 %0 to double
+ %call = call i32 @fn1(double %conv)
+ ret i32 0
+}
+
+declare i32 @fn1(double) #1
OpenPOWER on IntegriCloud