Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.127 -> 1.128 --- Log message: fold insertelement(buildvector) -> buildvector if the inserted element # is a constant. This implements test_constant_insert in CodeGen/Generic/vector.ll --- Diffs of the changes: (+42 -0) DAGCombiner.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.127 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.128 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.127 Thu Mar 16 19:40:33 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Sat Mar 18 19:27:56 2006 @@ -209,6 +209,8 @@ SDOperand visitBR_CC(SDNode *N); SDOperand visitLOAD(SDNode *N); SDOperand visitSTORE(SDNode *N); + SDOperand visitINSERT_VECTOR_ELT(SDNode *N); + SDOperand visitVINSERT_VECTOR_ELT(SDNode *N); SDOperand ReassociateOps(unsigned Opc, SDOperand LHS, SDOperand RHS); @@ -640,6 +642,8 @@ case ISD::BR_CC: return visitBR_CC(N); case ISD::LOAD: return visitLOAD(N); case ISD::STORE: return visitSTORE(N); + case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N); + case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N); } return SDOperand(); } @@ -2290,6 +2294,44 @@ return SDOperand(); } +SDOperand DAGCombiner::visitINSERT_VECTOR_ELT(SDNode *N) { + SDOperand InVec = N->getOperand(0); + SDOperand InVal = N->getOperand(1); + SDOperand EltNo = N->getOperand(2); + + // If the invec is a BUILD_VECTOR and if EltNo is a constant, build a new + // vector with the inserted element. + if (InVec.getOpcode() == ISD::BUILD_VECTOR && isa<ConstantSDNode>(EltNo)) { + unsigned Elt = cast<ConstantSDNode>(EltNo)->getValue(); + std::vector<SDOperand> Ops(InVec.Val->op_begin(), InVec.Val->op_end()); + if (Elt < Ops.size()) + Ops[Elt] = InVal; + return DAG.getNode(ISD::BUILD_VECTOR, InVec.getValueType(), Ops); + } + + return SDOperand(); +} + +SDOperand DAGCombiner::visitVINSERT_VECTOR_ELT(SDNode *N) { + SDOperand InVec = N->getOperand(0); + SDOperand InVal = N->getOperand(1); + SDOperand EltNo = N->getOperand(2); + SDOperand NumElts = N->getOperand(3); + SDOperand EltType = N->getOperand(4); + + // If the invec is a VBUILD_VECTOR and if EltNo is a constant, build a new + // vector with the inserted element. + if (InVec.getOpcode() == ISD::VBUILD_VECTOR && isa<ConstantSDNode>(EltNo)) { + unsigned Elt = cast<ConstantSDNode>(EltNo)->getValue(); + std::vector<SDOperand> Ops(InVec.Val->op_begin(), InVec.Val->op_end()); + if (Elt < Ops.size()-2) + Ops[Elt] = InVal; + return DAG.getNode(ISD::VBUILD_VECTOR, InVec.getValueType(), Ops); + } + + return SDOperand(); +} + SDOperand DAGCombiner::SimplifySelect(SDOperand N0, SDOperand N1, SDOperand N2){ assert(N0.getOpcode() ==ISD::SETCC && "First argument must be a SetCC node!"); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits