diff options
author | Dan Gohman <djg@cray.com> | 2007-10-12 14:33:11 +0000 |
---|---|---|
committer | Dan Gohman <djg@cray.com> | 2007-10-12 14:33:11 +0000 |
commit | c68a8de07faba0881b25a8eb9346deced1e024fd (patch) | |
tree | e087255b39a8f7e87e224fe80ecc93e6ed3972c8 /lib | |
parent | ae4c2f8b1a375dc9ecd8305061d35553b2d73536 (diff) | |
download | external_llvm-c68a8de07faba0881b25a8eb9346deced1e024fd.zip external_llvm-c68a8de07faba0881b25a8eb9346deced1e024fd.tar.gz external_llvm-c68a8de07faba0881b25a8eb9346deced1e024fd.tar.bz2 |
Fix some corner cases with vectors in copyToRegs and copyFromRegs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42907 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index d636e8b..c63386c 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -648,7 +648,15 @@ static SDOperand getCopyFromParts(SelectionDAG &DAG, if (MVT::isVector(PartVT)) { assert(MVT::isVector(ValueVT) && "Unknown vector conversion!"); - return DAG.getNode(ISD::BIT_CONVERT, PartVT, Val); + return DAG.getNode(ISD::BIT_CONVERT, ValueVT, Val); + } + + if (MVT::isVector(ValueVT)) { + assert(NumParts == 1 && + MVT::getVectorElementType(ValueVT) == PartVT && + MVT::getVectorNumElements(ValueVT) == 1 && + "Only trivial scalar-to-vector conversions should get here!"); + return DAG.getNode(ISD::BUILD_VECTOR, ValueVT, Val); } if (MVT::isInteger(PartVT) && @@ -746,6 +754,13 @@ static void getCopyToParts(SelectionDAG &DAG, assert(MVT::isVector(ValueVT) && "Not a vector-vector cast?"); Val = DAG.getNode(ISD::BIT_CONVERT, PartVT, Val); + } else if (MVT::isVector(ValueVT)) { + assert(NumParts == 1 && + MVT::getVectorElementType(ValueVT) == PartVT && + MVT::getVectorNumElements(ValueVT) == 1 && + "Only trivial vector-to-scalar conversions should get here!"); + Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, PartVT, Val, + DAG.getConstant(0, PtrVT)); } else if (MVT::isInteger(PartVT) && MVT::isInteger(ValueVT)) { if (PartVT < ValueVT) Val = DAG.getNode(ISD::TRUNCATE, PartVT, Val); |