summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2014-07-23 20:41:31 +0000
committerJim Grosbach <grosbach@apple.com>2014-07-23 20:41:31 +0000
commit19dd3088c088ecd1bddfcaab46a95d8ac21accc2 (patch)
tree1599ceed49fea7bb1f967002382cde8134dc4bcb /llvm/lib
parent94d908216b7feae26fb367a5d0660ead57097d63 (diff)
downloadbcm5719-llvm-19dd3088c088ecd1bddfcaab46a95d8ac21accc2.tar.gz
bcm5719-llvm-19dd3088c088ecd1bddfcaab46a95d8ac21accc2.zip
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 llvm-svn: 213798
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp23
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);
}
}
}
OpenPOWER on IntegriCloud