diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 7812187fa43..5cb13e3f44c 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -5369,7 +5369,8 @@ ExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source) { MVT::ValueType SourceVT = Source.getValueType(); bool ExpandSource = getTypeAction(SourceVT) == Expand; - if (!isSigned) { + // Special case for i32 source to take advantage of UINTTOFP_I32_F32, etc. + if (!isSigned && SourceVT != MVT::i32) { // The integer value loaded will be incorrectly if the 'sign bit' of the // incoming integer is set. To handle this, we dynamically test to see if // it is set, and, if so, add a fudge factor. diff --git a/test/CodeGen/ARM/fpconv.ll b/test/CodeGen/ARM/fpconv.ll index a2771fea472..23850075d0d 100644 --- a/test/CodeGen/ARM/fpconv.ll +++ b/test/CodeGen/ARM/fpconv.ll @@ -16,8 +16,10 @@ ; RUN: grep fixunssfsi %t ; RUN: grep fixdfsi %t ; RUN: grep fixunsdfsi %t -; RUN: grep floatdisf %t +; RUN: grep floatsisf %t ; RUN: grep floatsidf %t +; RUN: grep floatunsisf %t +; RUN: grep floatunsidf %t ; RUN: llvm-as < %s | llc -march=thumb define float @f1(double %x) {