1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/value-numbering-reducer.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <cstring>
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/base/functional.h"
10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/compiler/node-properties.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t HashCode(Node* node) {
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t h = base::hash_combine(node->op()->HashCode(), node->InputCount());
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  for (Node* input : node->inputs()) {
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    h = base::hash_combine(h, input->id());
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return h;
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Equals(Node* a, Node* b) {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(a);
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(b);
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(a->op());
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(b->op());
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!a->op()->Equals(b->op())) return false;
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (a->InputCount() != b->InputCount()) return false;
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node::Inputs aInputs = a->inputs();
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node::Inputs bInputs = b->inputs();
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  auto aIt = aInputs.begin();
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  auto bIt = bInputs.begin();
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  auto aEnd = aInputs.end();
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  for (; aIt != aEnd; ++aIt, ++bIt) {
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_NOT_NULL(*aIt);
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_NOT_NULL(*bIt);
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if ((*aIt)->id() != (*bIt)->id()) return false;
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochValueNumberingReducer::ValueNumberingReducer(Zone* temp_zone, Zone* graph_zone)
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    : entries_(nullptr),
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      capacity_(0),
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      size_(0),
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      temp_zone_(temp_zone),
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      graph_zone_(graph_zone) {}
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierValueNumberingReducer::~ValueNumberingReducer() {}
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierReduction ValueNumberingReducer::Reduce(Node* node) {
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!node->op()->HasProperty(Operator::kIdempotent)) return NoChange();
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const size_t hash = HashCode(node);
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!entries_) {
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(size_ == 0);
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(capacity_ == 0);
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Allocate the initial entries and insert the first entry.
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    capacity_ = kInitialCapacity;
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    entries_ = temp_zone()->NewArray<Node*>(kInitialCapacity);
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    memset(entries_, 0, sizeof(*entries_) * kInitialCapacity);
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    entries_[hash & (kInitialCapacity - 1)] = node;
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    size_ = 1;
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return NoChange();
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(size_ < capacity_);
79c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(size_ + size_ / 4 < capacity_);
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const size_t mask = capacity_ - 1;
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t dead = capacity_;
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (size_t i = hash & mask;; i = (i + 1) & mask) {
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Node* entry = entries_[i];
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (!entry) {
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (dead != capacity_) {
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        // Reuse dead entry that we discovered on the way.
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        entries_[dead] = node;
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        // Have to insert a new entry.
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        entries_[i] = node;
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        size_++;
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
95c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        // Resize to keep load factor below 80%
96c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        if (size_ + size_ / 4 >= capacity_) Grow();
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
98c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      DCHECK(size_ + size_ / 4 < capacity_);
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return NoChange();
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (entry == node) {
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // We need to check for a certain class of collisions here. Imagine the
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // following scenario:
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      //
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      //  1. We insert node1 with op1 and certain inputs at index i.
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      //  2. We insert node2 with op2 and certain inputs at index i+1.
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      //  3. Some other reducer changes node1 to op2 and the inputs from node2.
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      //
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // Now we are called again to reduce node1, and we would return NoChange
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // in this case because we find node1 first, but what we should actually
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // do is return Replace(node2) instead.
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      for (size_t j = (i + 1) & mask;; j = (j + 1) & mask) {
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Node* entry = entries_[j];
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (!entry) {
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // No collision, {node} is fine.
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          return NoChange();
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (entry->IsDead()) {
120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          continue;
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        if (entry == node) {
123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          // Collision with ourselves, doesn't count as a real collision.
124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          // Opportunistically clean-up the duplicate entry if we're at the end
125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          // of a bucket.
126c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          if (!entries_[(j + 1) & mask]) {
127c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            entries_[j] = nullptr;
128c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            size_--;
129c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            return NoChange();
130c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          }
131c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          // Otherwise, keep searching for another collision.
132c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          continue;
133c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        }
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (Equals(entry, node)) {
135c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          Reduction reduction = ReplaceIfTypesMatch(node, entry);
136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          if (reduction.Changed()) {
137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            // Overwrite the colliding entry with the actual entry.
138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            entries_[i] = entry;
139c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            // Opportunistically clean-up the duplicate entry if we're at the
140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            // end of a bucket.
141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            if (!entries_[(j + 1) & mask]) {
142c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              entries_[j] = nullptr;
143c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              size_--;
144c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            }
145c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          }
146c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          return reduction;
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Skip dead entries, but remember their indices so we can reuse them.
152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (entry->IsDead()) {
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      dead = i;
154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      continue;
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (Equals(entry, node)) {
157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return ReplaceIfTypesMatch(node, entry);
158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochReduction ValueNumberingReducer::ReplaceIfTypesMatch(Node* node,
163c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                     Node* replacement) {
164c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Make sure the replacement has at least as good type as the original node.
165c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (NodeProperties::IsTyped(replacement) && NodeProperties::IsTyped(node)) {
166c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Type* replacement_type = NodeProperties::GetType(replacement);
167c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Type* node_type = NodeProperties::GetType(node);
168c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (!replacement_type->Is(node_type)) {
169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Ideally, we would set an intersection of {replacement_type} and
170c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // {node_type} here. However, typing of NumberConstants assigns different
171c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // types to constants with the same value (it creates a fresh heap
172c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // number), which would make the intersection empty. To be safe, we use
173c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // the smaller type if the types are comparable.
174c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      if (node_type->Is(replacement_type)) {
175c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        NodeProperties::SetType(replacement, node_type);
176c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      } else {
177c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        // Types are not comparable => do not replace.
178c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        return NoChange();
179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      }
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
182c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return Replace(replacement);
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid ValueNumberingReducer::Grow() {
187c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Allocate a new block of entries double the previous capacity.
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Node** const old_entries = entries_;
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t const old_capacity = capacity_;
190c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  capacity_ *= 2;
191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  entries_ = temp_zone()->NewArray<Node*>(capacity_);
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  memset(entries_, 0, sizeof(*entries_) * capacity_);
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_ = 0;
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t const mask = capacity_ - 1;
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Insert the old entries into the new block (skipping dead nodes).
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (size_t i = 0; i < old_capacity; ++i) {
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Node* const old_entry = old_entries[i];
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (!old_entry || old_entry->IsDead()) continue;
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (size_t j = HashCode(old_entry) & mask;; j = (j + 1) & mask) {
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Node* const entry = entries_[j];
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (entry == old_entry) {
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        // Skip duplicate of the old entry.
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        break;
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (!entry) {
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        entries_[j] = old_entry;
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        size_++;
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        break;
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
218