17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file.
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef V8_COMPILER_NODE_CACHE_H_
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_NODE_CACHE_H_
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/v8.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// A cache for nodes based on a key. Useful for implementing canonicalization of
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// nodes such as constants, parameters, etc.
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <typename Key>
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass NodeCache {
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  explicit NodeCache(int max = 256) : entries_(NULL), size_(0), max_(max) {}
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Search for node associated with {key} and return a pointer to a memory
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // location in this cache that stores an entry for the key. If the location
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // returned by this method contains a non-NULL node, the caller can use that
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // node. Otherwise it is the responsibility of the caller to fill the entry
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // with a new node.
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Note that a previous cache entry may be overwritten if the cache becomes
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // too full or encounters too many hash collisions.
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node** Find(Zone* zone, Key key);
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  struct Entry {
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Key key_;
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* value_;
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  };
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Entry* entries_;  // lazily-allocated hash entries.
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int32_t size_;
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int32_t max_;
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  bool Resize(Zone* zone);
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Various default cache types.
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtypedef NodeCache<int64_t> Int64NodeCache;
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtypedef NodeCache<int32_t> Int32NodeCache;
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtypedef NodeCache<void*> PtrNodeCache;
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace v8::internal::compiler
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_COMPILER_NODE_CACHE_H_
54