From: Mon P Wang Date: Thu, 11 Dec 2008 00:26:16 +0000 (+0000) Subject: Make fix for r60829 less conservative to allow the proper optimization for X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a60b5236c1acd31e2aca5705c8bbbd2946ea0873;p=oota-llvm.git 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 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 7e78923f6d9..ec71f62519b 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(EltNo)) { unsigned Elt = cast(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(InVec.getOperand(2). getOperand(Elt))->getZExtValue(); unsigned NumElems = InVec.getOperand(2).getNumOperands();