Index: src/hydrogen-instructions.cc |
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
index c59c9e4f946847ae25fe2e2ed4018dea796fafa3..9d39d033eb7a9d0cf56c8a24b6b6ef0dbf73f235 100644 |
--- a/src/hydrogen-instructions.cc |
+++ b/src/hydrogen-instructions.cc |
@@ -276,6 +276,15 @@ bool HValue::IsDefinedAfter(HBasicBlock* other) const { |
} |
+HUseListNode* HUseListNode::tail() { |
+ // Skip and remove dead items in the use list. |
+ while (tail_ != NULL && tail_->value()->CheckFlag(HValue::kIsDead)) { |
+ tail_ = tail_->tail_; |
+ } |
+ return tail_; |
+} |
+ |
+ |
HUseIterator::HUseIterator(HUseListNode* head) : next_(head) { |
Advance(); |
} |
@@ -374,7 +383,10 @@ void HValue::DeleteAndReplaceWith(HValue* other) { |
// We replace all uses first, so Delete can assert that there are none. |
if (other != NULL) ReplaceAllUsesWith(other); |
ASSERT(HasNoUses()); |
- ClearOperands(); |
+ // Clearing the operands includes going through the use list of each operand |
+ // to remove this HValue, which can be expensive. Instead, we simply mark it |
+ // as dead and remove it lazily from the operands' use lists. |
+ SetFlag(kIsDead); |
DeleteFromGraph(); |
} |