From 7b5e15945098e9ac16ca94b8cabb8ea7450a1131 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Mon, 7 Oct 2013 19:11:35 +0000 Subject: [PATCH] X86: Fix type check. Just because an integer type is illegal doesn't mean it's i64. Fixes PR17495, where an i24 triggered this code. It's intended to optimize i64 loads on 32 bit x86. llvm-svn: 192123 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 2 +- llvm/test/CodeGen/X86/2011-06-03-x87chain.ll | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 8618853af687..bd5ad4e264fe 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -18823,7 +18823,7 @@ static SDValue PerformSINT_TO_FPCombine(SDNode *N, SelectionDAG &DAG, if (!Ld->isVolatile() && !N->getValueType(0).isVector() && ISD::isNON_EXTLoad(Op0.getNode()) && Op0.hasOneUse() && !XTLI->getSubtarget()->is64Bit() && - !DAG.getTargetLoweringInfo().isTypeLegal(VT)) { + VT == MVT::i64) { SDValue FILDChain = XTLI->BuildFILD(SDValue(N, 0), Ld->getValueType(0), Ld->getChain(), Op0, DAG); DAG.ReplaceAllUsesOfValueWith(Op0.getValue(1), FILDChain.getValue(1)); diff --git a/llvm/test/CodeGen/X86/2011-06-03-x87chain.ll b/llvm/test/CodeGen/X86/2011-06-03-x87chain.ll index ce63c74fbdfd..5275b6889bff 100644 --- a/llvm/test/CodeGen/X86/2011-06-03-x87chain.ll +++ b/llvm/test/CodeGen/X86/2011-06-03-x87chain.ll @@ -29,3 +29,21 @@ entry: store float %conv, float* %f, align 4 ret float %conv } + +define void @PR17495() { +entry: + br i1 undef, label %while.end, label %while.body + +while.body: ; preds = %while.body, %entry + %x.1.copyload = load i24* undef, align 1 + %conv = sitofp i24 %x.1.copyload to float + %div = fmul float %conv, 0x3E80000000000000 + store float %div, float* undef, align 4 + br i1 false, label %while.end, label %while.body + +while.end: ; preds = %while.body, %entry + ret void + +; CHECK-LABEL: @PR17495 +; CHECK-NOT: fildll +}