diff options
author | Bill Wendling <isanbard@gmail.com> | 2014-07-31 18:17:04 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2014-07-31 18:17:04 +0000 |
commit | cdcb17a0baa5ca426d27f76d6eee7799d6b2a53f (patch) | |
tree | 30cb23620038a2389fd27563e46663e930cb8bd9 | |
parent | c81d1326accea4d183e67ca1ea70a3b81ce3c554 (diff) | |
download | llvm-cdcb17a0baa5ca426d27f76d6eee7799d6b2a53f.tar.gz |
Merging r213798:
------------------------------------------------------------------------
r213798 | grosbach | 2014-07-23 13:41:31 -0700 (Wed, 23 Jul 2014) | 7 lines
DAG: fp->int conversion for non-splat constants.
Constant fold the lanes of the input constant build_vector individually
so we correctly handle when the vector elements are not all the same
constant value.
PR20394
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_35@214413 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 23 | ||||
-rw-r--r-- | test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll | 16 |
2 files changed, 26 insertions, 13 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 22379de801e7..a5555364c82a 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2795,11 +2795,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, // Constant fold unary operations with a vector integer operand. if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Operand.getNode())) { - APInt Val; - APInt DummyUndefs; - unsigned SplatBitSize; - bool DummyHasUndefs; - if (BV->isConstantSplat(Val, DummyUndefs, SplatBitSize, DummyHasUndefs)) { + if (BV->isConstant()) { switch (Opcode) { default: // FIXME: Entirely reasonable to perform folding of other unary @@ -2807,13 +2803,16 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, break; case ISD::UINT_TO_FP: case ISD::SINT_TO_FP: { - APFloat APF( - EVTToAPFloatSemantics(VT.getVectorElementType()), - APInt::getNullValue(VT.getVectorElementType().getSizeInBits())); - (void)APF.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP, - APFloat::rmNearestTiesToEven); - - return getConstantFP(APF, VT); + SmallVector<SDValue, 8> Ops; + for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) { + SDValue OpN = BV->getOperand(i); + // Let the above scalar folding handle the conversion of each + // element. + OpN = getNode(ISD::SINT_TO_FP, DL, VT.getVectorElementType(), + OpN); + Ops.push_back(OpN); + } + return getNode(ISD::BUILD_VECTOR, DL, VT, Ops); } } } diff --git a/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll b/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll index d691685f1ddd..86c4eb7c49e8 100644 --- a/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll +++ b/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll @@ -1,7 +1,7 @@ ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s define <4 x float> @foo(<4 x float> %val, <4 x float> %test) nounwind { -; CHECK-LABEL: LCPI0_0 +; CHECK-LABEL: LCPI0_0: ; CHECK-NEXT: .long 1065353216 ## float 1.000000e+00 ; CHECK-NEXT: .long 1065353216 ## float 1.000000e+00 ; CHECK-NEXT: .long 1065353216 ## float 1.000000e+00 @@ -16,3 +16,17 @@ define <4 x float> @foo(<4 x float> %val, <4 x float> %test) nounwind { %result = sitofp <4 x i32> %ext to <4 x float> ret <4 x float> %result } + +define void @bar(<4 x float>* noalias %result) nounwind { +; CHECK-LABEL: LCPI1_0: +; CHECK-NEXT: .long 1082130432 ## float 4.000000e+00 +; CHECK-NEXT: .long 1084227584 ## float 5.000000e+00 +; CHECK-NEXT: .long 1086324736 ## float 6.000000e+00 +; CHECK-NEXT: .long 1088421888 ## float 7.000000e+00 +; CHECK-LABEL: bar: +; CHECK: movaps LCPI1_0(%rip), %xmm0 + + %val = uitofp <4 x i32> <i32 4, i32 5, i32 6, i32 7> to <4 x float> + store <4 x float> %val, <4 x float>* %result + ret void +} |