diff options
author | Mon P Wang <wangmp@apple.com> | 2008-12-11 00:26:16 +0000 |
---|---|---|
committer | Mon P Wang <wangmp@apple.com> | 2008-12-11 00:26:16 +0000 |
commit | a60b5236c1acd31e2aca5705c8bbbd2946ea0873 (patch) | |
tree | c2016529e5999540cddbc42b9baaa8225f2b6b4b /lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 0ffa3de9e9b342c0fb529853e14632c66ec9725f (diff) |
Make fix for r60829 less conservative to allow the proper optimization for
vec_extract-sse4.ll.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60865 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 7e78923f6d..ec71f62519 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4884,14 +4884,16 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { if (isa<ConstantSDNode>(EltNo)) { unsigned Elt = cast<ConstantSDNode>(EltNo)->getZExtValue(); bool NewLoad = false; + bool BCNumEltsChanged = false; MVT VT = InVec.getValueType(); MVT EVT = VT.getVectorElementType(); MVT LVT = EVT; if (InVec.getOpcode() == ISD::BIT_CONVERT) { MVT BCVT = InVec.getOperand(0).getValueType(); - if (!BCVT.isVector() || EVT.bitsGT(BCVT.getVectorElementType()) || - VT.getVectorNumElements() != BCVT.getVectorNumElements()) + if (!BCVT.isVector() || EVT.bitsGT(BCVT.getVectorElementType())) return SDValue(); + if (VT.getVectorNumElements() != BCVT.getVectorNumElements()) + BCNumEltsChanged = true; InVec = InVec.getOperand(0); EVT = BCVT.getVectorElementType(); NewLoad = true; @@ -4908,6 +4910,11 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { // (vextract (vector_shuffle (load $addr), v2, <1, u, u, u>), 1) // => // (load $addr+1*size) + + // If the bit convert changed the number of elements, it is unsafe + // to examine the mask. + if (BCNumEltsChanged) + return SDValue(); unsigned Idx = cast<ConstantSDNode>(InVec.getOperand(2). getOperand(Elt))->getZExtValue(); unsigned NumElems = InVec.getOperand(2).getNumOperands(); |