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