diff options
Diffstat (limited to 'lib/CodeGen/SelectionDAG')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 5 | ||||
| -rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp | 1 | ||||
| -rw-r--r-- | lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | 7 | 
3 files changed, 11 insertions, 2 deletions
| diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 43f72c5ef9b4..69cf8d9a909a 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -8547,7 +8547,10 @@ struct MemOpLink {  // base ptr.  struct ConsecutiveMemoryChainSorter {    bool operator()(MemOpLink LHS, MemOpLink RHS) { -    return LHS.OffsetFromBase < RHS.OffsetFromBase; +    return +        LHS.OffsetFromBase < RHS.OffsetFromBase || +        (LHS.OffsetFromBase == RHS.OffsetFromBase && +         LHS.SequenceNum > RHS.SequenceNum);    }  }; diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index 2c3cdccb56e8..3fb2d9bdf55e 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -210,6 +210,7 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {    case ISD::SRL:    case ISD::ROTL:    case ISD::ROTR: +  case ISD::BSWAP:    case ISD::CTLZ:    case ISD::CTTZ:    case ISD::CTLZ_ZERO_UNDEF: diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp index 054e3dd840b5..c1893c9231f0 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp @@ -219,8 +219,11 @@ void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {    DenseMap<long long, SDNode*> O2SMap;  // Map from offset to SDNode.    bool Cluster = false;    SDNode *Base = Node; +  // This algorithm requires a reasonably low use count before finding a match +  // to avoid uselessly blowing up compile time in large blocks. +  unsigned UseCount = 0;    for (SDNode::use_iterator I = Chain->use_begin(), E = Chain->use_end(); -       I != E; ++I) { +       I != E && UseCount < 100; ++I, ++UseCount) {      SDNode *User = *I;      if (User == Node || !Visited.insert(User))        continue; @@ -237,6 +240,8 @@ void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {      if (Offset2 < Offset1)        Base = User;      Cluster = true; +    // Reset UseCount to allow more matches. +    UseCount = 0;    }    if (!Cluster) | 
