Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4550,10 +4550,17 @@ // void foo(int *X, int i) { X[i & 1235] = 1; } // int bar(int *X, int i) { return X[i & 255]; } SDNode *BinOpLHSVal = LHS->getOperand(0).getNode(); - if ((BinOpLHSVal->getOpcode() != ISD::SHL && + if (((BinOpLHSVal->getOpcode() != ISD::SHL && BinOpLHSVal->getOpcode() != ISD::SRA && BinOpLHSVal->getOpcode() != ISD::SRL) || - !isa(BinOpLHSVal->getOperand(1))) + !isa(BinOpLHSVal->getOperand(1))) && + BinOpLHSVal->getOpcode() != ISD::CopyFromReg && + BinOpLHSVal->getOpcode() != ISD::SELECT) + return SDValue(); + + if ((BinOpLHSVal->getOpcode() == ISD::CopyFromReg || + BinOpLHSVal->getOpcode() == ISD::SELECT) && + N->hasOneUse()) return SDValue(); EVT VT = N->getValueType(0);