diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/pr23273.ll | 17 | 
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  | 

