Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.116 -> 1.117 --- Log message: Add support for target-specific dag combines --- Diffs of the changes: (+58 -13) DAGCombiner.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 58 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.116 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.117 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.116 Tue Feb 28 22:03:14 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Feb 28 22:53:38 2006 @@ -68,6 +68,7 @@ WorkList.end()); } + public: void AddToWorkList(SDNode *N) { WorkList.push_back(N); } @@ -97,6 +98,20 @@ return SDOperand(N, 0); } + SDOperand CombineTo(SDNode *N, SDOperand Res) { + std::vector<SDOperand> To; + To.push_back(Res); + return CombineTo(N, To); + } + + SDOperand CombineTo(SDNode *N, SDOperand Res0, SDOperand Res1) { + std::vector<SDOperand> To; + To.push_back(Res0); + To.push_back(Res1); + return CombineTo(N, To); + } + private: + /// SimplifyDemandedBits - Check the specified integer node value to see if /// it can be simplified or if things is uses can be simplified by bit /// propagation. If so, return true. @@ -137,19 +152,6 @@ return true; } - SDOperand CombineTo(SDNode *N, SDOperand Res) { - std::vector<SDOperand> To; - To.push_back(Res); - return CombineTo(N, To); - } - - SDOperand CombineTo(SDNode *N, SDOperand Res0, SDOperand Res1) { - std::vector<SDOperand> To; - To.push_back(Res0); - To.push_back(Res1); - return CombineTo(N, To); - } - /// visit - call the node-specific routine that knows how to fold each /// particular type of node. SDOperand visit(SDNode *N); @@ -229,6 +231,36 @@ }; } +//===----------------------------------------------------------------------===// +// TargetLowering::DAGCombinerInfo implementation +//===----------------------------------------------------------------------===// + +void TargetLowering::DAGCombinerInfo::AddToWorklist(SDNode *N) { + ((DAGCombiner*)DC)->AddToWorkList(N); +} + +SDOperand TargetLowering::DAGCombinerInfo:: +CombineTo(SDNode *N, const std::vector<SDOperand> &To) { + return ((DAGCombiner*)DC)->CombineTo(N, To); +} + +SDOperand TargetLowering::DAGCombinerInfo:: +CombineTo(SDNode *N, SDOperand Res) { + return ((DAGCombiner*)DC)->CombineTo(N, Res); +} + + +SDOperand TargetLowering::DAGCombinerInfo:: +CombineTo(SDNode *N, SDOperand Res0, SDOperand Res1) { + return ((DAGCombiner*)DC)->CombineTo(N, Res0, Res1); +} + + + + +//===----------------------------------------------------------------------===// + + struct ms { int64_t m; // magic number int64_t s; // shift amount @@ -495,6 +527,11 @@ // changes of the root. HandleSDNode Dummy(DAG.getRoot()); + + /// DagCombineInfo - Expose the DAG combiner to the target combiner impls. + TargetLowering::DAGCombinerInfo + DagCombineInfo(DAG, !RunningAfterLegalize, this); + // while the worklist isn't empty, inspect the node on the end of it and // try and combine it. while (!WorkList.empty()) { @@ -514,6 +551,14 @@ } SDOperand RV = visit(N); + + // If nothing happened, try a target-specific DAG combine. + if (RV.Val == 0) { + if (N->getOpcode() >= ISD::BUILTIN_OP_END || + TLI.hasTargetDAGCombine((ISD::NodeType)N->getOpcode())) + RV = TLI.PerformDAGCombine(N, DagCombineInfo); + } + if (RV.Val) { ++NodesCombined; // If we get back the same node we passed in, rather than a new node or _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits