diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 1b62e77e168..126aa74463c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2766,11 +2766,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 @@ -2778,13 +2774,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); } } } |

