| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 void set_assigned_from(LGapNode* n) { assigned_from_.set(n); } | 53 void set_assigned_from(LGapNode* n) { assigned_from_.set(n); } |
| 54 | 54 |
| 55 private: | 55 private: |
| 56 LOperand* operand_; | 56 LOperand* operand_; |
| 57 SetOncePointer<LGapNode> assigned_from_; | 57 SetOncePointer<LGapNode> assigned_from_; |
| 58 bool resolved_; | 58 bool resolved_; |
| 59 int visited_id_; | 59 int visited_id_; |
| 60 }; | 60 }; |
| 61 | 61 |
| 62 | 62 |
| 63 LGapResolver::LGapResolver(const ZoneList<LMoveOperands>* moves, | 63 LGapResolver::LGapResolver() |
| 64 LOperand* marker_operand) | 64 : nodes_(32), |
| 65 : nodes_(4), | |
| 66 identified_cycles_(4), | 65 identified_cycles_(4), |
| 67 result_(4), | 66 result_(16), |
| 68 marker_operand_(marker_operand), | |
| 69 next_visited_id_(0) { | 67 next_visited_id_(0) { |
| 68 } |
| 69 |
| 70 |
| 71 const ZoneList<LMoveOperands>* LGapResolver::Resolve( |
| 72 const ZoneList<LMoveOperands>* moves, |
| 73 LOperand* marker_operand) { |
| 74 nodes_.Rewind(0); |
| 75 identified_cycles_.Rewind(0); |
| 76 result_.Rewind(0); |
| 77 next_visited_id_ = 0; |
| 78 |
| 70 for (int i = 0; i < moves->length(); ++i) { | 79 for (int i = 0; i < moves->length(); ++i) { |
| 71 LMoveOperands move = moves->at(i); | 80 LMoveOperands move = moves->at(i); |
| 72 if (!move.IsRedundant()) RegisterMove(move); | 81 if (!move.IsRedundant()) RegisterMove(move); |
| 73 } | 82 } |
| 74 } | |
| 75 | 83 |
| 76 | |
| 77 const ZoneList<LMoveOperands>* LGapResolver::ResolveInReverseOrder() { | |
| 78 for (int i = 0; i < identified_cycles_.length(); ++i) { | 84 for (int i = 0; i < identified_cycles_.length(); ++i) { |
| 79 ResolveCycle(identified_cycles_[i]); | 85 ResolveCycle(identified_cycles_[i], marker_operand); |
| 80 } | 86 } |
| 81 | 87 |
| 82 int unresolved_nodes; | 88 int unresolved_nodes; |
| 83 do { | 89 do { |
| 84 unresolved_nodes = 0; | 90 unresolved_nodes = 0; |
| 85 for (int j = 0; j < nodes_.length(); j++) { | 91 for (int j = 0; j < nodes_.length(); j++) { |
| 86 LGapNode* node = nodes_[j]; | 92 LGapNode* node = nodes_[j]; |
| 87 if (!node->IsResolved() && node->assigned_from()->IsResolved()) { | 93 if (!node->IsResolved() && node->assigned_from()->IsResolved()) { |
| 88 AddResultMove(node->assigned_from(), node); | 94 AddResultMove(node->assigned_from(), node); |
| 89 node->MarkResolved(); | 95 node->MarkResolved(); |
| 90 } | 96 } |
| 91 if (!node->IsResolved()) ++unresolved_nodes; | 97 if (!node->IsResolved()) ++unresolved_nodes; |
| 92 } | 98 } |
| 93 } while (unresolved_nodes > 0); | 99 } while (unresolved_nodes > 0); |
| 94 return &result_; | 100 return &result_; |
| 95 } | 101 } |
| 96 | 102 |
| 97 | 103 |
| 98 void LGapResolver::AddResultMove(LGapNode* from, LGapNode* to) { | 104 void LGapResolver::AddResultMove(LGapNode* from, LGapNode* to) { |
| 99 AddResultMove(from->operand(), to->operand()); | 105 AddResultMove(from->operand(), to->operand()); |
| 100 } | 106 } |
| 101 | 107 |
| 102 | 108 |
| 103 void LGapResolver::AddResultMove(LOperand* from, LOperand* to) { | 109 void LGapResolver::AddResultMove(LOperand* from, LOperand* to) { |
| 104 result_.Add(LMoveOperands(from, to)); | 110 result_.Add(LMoveOperands(from, to)); |
| 105 } | 111 } |
| 106 | 112 |
| 107 | 113 |
| 108 void LGapResolver::ResolveCycle(LGapNode* start) { | 114 void LGapResolver::ResolveCycle(LGapNode* start, LOperand* marker_operand) { |
| 109 ZoneList<LOperand*> circle_operands(8); | 115 ZoneList<LOperand*> cycle_operands(8); |
| 110 circle_operands.Add(marker_operand_); | 116 cycle_operands.Add(marker_operand); |
| 111 LGapNode* cur = start; | 117 LGapNode* cur = start; |
| 112 do { | 118 do { |
| 113 cur->MarkResolved(); | 119 cur->MarkResolved(); |
| 114 circle_operands.Add(cur->operand()); | 120 cycle_operands.Add(cur->operand()); |
| 115 cur = cur->assigned_from(); | 121 cur = cur->assigned_from(); |
| 116 } while (cur != start); | 122 } while (cur != start); |
| 117 circle_operands.Add(marker_operand_); | 123 cycle_operands.Add(marker_operand); |
| 118 | 124 |
| 119 for (int i = circle_operands.length() - 1; i > 0; --i) { | 125 for (int i = cycle_operands.length() - 1; i > 0; --i) { |
| 120 LOperand* from = circle_operands[i]; | 126 LOperand* from = cycle_operands[i]; |
| 121 LOperand* to = circle_operands[i - 1]; | 127 LOperand* to = cycle_operands[i - 1]; |
| 122 AddResultMove(from, to); | 128 AddResultMove(from, to); |
| 123 } | 129 } |
| 124 } | 130 } |
| 125 | 131 |
| 126 | 132 |
| 127 bool LGapResolver::CanReach(LGapNode* a, LGapNode* b, int visited_id) { | 133 bool LGapResolver::CanReach(LGapNode* a, LGapNode* b, int visited_id) { |
| 128 ASSERT(a != b); | 134 ASSERT(a != b); |
| 129 LGapNode* cur = a; | 135 LGapNode* cur = a; |
| 130 while (cur != b && cur->visited_id() != visited_id && cur->IsAssigned()) { | 136 while (cur != b && cur->visited_id() != visited_id && cur->IsAssigned()) { |
| 131 cur->set_visited_id(visited_id); | 137 cur->set_visited_id(visited_id); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 149 AddResultMove(move.from(), move.to()); | 155 AddResultMove(move.from(), move.to()); |
| 150 } else { | 156 } else { |
| 151 LGapNode* from = LookupNode(move.from()); | 157 LGapNode* from = LookupNode(move.from()); |
| 152 LGapNode* to = LookupNode(move.to()); | 158 LGapNode* to = LookupNode(move.to()); |
| 153 if (to->IsAssigned() && to->assigned_from() == from) { | 159 if (to->IsAssigned() && to->assigned_from() == from) { |
| 154 move.Eliminate(); | 160 move.Eliminate(); |
| 155 return; | 161 return; |
| 156 } | 162 } |
| 157 ASSERT(!to->IsAssigned()); | 163 ASSERT(!to->IsAssigned()); |
| 158 if (CanReach(from, to)) { | 164 if (CanReach(from, to)) { |
| 159 // This introduces a circle. Save. | 165 // This introduces a cycle. Save. |
| 160 identified_cycles_.Add(from); | 166 identified_cycles_.Add(from); |
| 161 } | 167 } |
| 162 to->set_assigned_from(from); | 168 to->set_assigned_from(from); |
| 163 } | 169 } |
| 164 } | 170 } |
| 165 | 171 |
| 166 | 172 |
| 167 LGapNode* LGapResolver::LookupNode(LOperand* operand) { | 173 LGapNode* LGapResolver::LookupNode(LOperand* operand) { |
| 168 for (int i = 0; i < nodes_.length(); ++i) { | 174 for (int i = 0; i < nodes_.length(); ++i) { |
| 169 if (nodes_[i]->operand()->Equals(operand)) return nodes_[i]; | 175 if (nodes_[i]->operand()->Equals(operand)) return nodes_[i]; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 196 stream->Add(" = "); | 202 stream->Add(" = "); |
| 197 from->PrintTo(stream); | 203 from->PrintTo(stream); |
| 198 } | 204 } |
| 199 stream->Add("; "); | 205 stream->Add("; "); |
| 200 } | 206 } |
| 201 } | 207 } |
| 202 } | 208 } |
| 203 | 209 |
| 204 | 210 |
| 205 } } // namespace v8::internal | 211 } } // namespace v8::internal |
| OLD | NEW |