js-context-specialization.h 2.36 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_JS_CONTEXT_SPECIALIZATION_H_
#define V8_COMPILER_JS_CONTEXT_SPECIALIZATION_H_

#include "src/compiler/graph-reducer.h"

namespace v8 {
namespace internal {
namespace compiler {

14 15 16 17
// Forward declarations.
class JSGraph;
class JSOperatorBuilder;

18 19 20 21 22 23 24 25
// Pair of a context and its distance from some point of reference.
struct OuterContext {
  OuterContext() : context(), distance() {}
  OuterContext(Handle<Context> context_, size_t distance_)
      : context(context_), distance(distance_) {}
  Handle<Context> context;
  size_t distance;
};
26

27
// Specializes a given JSGraph to a given context, potentially constant folding
28
// some {LoadContext} nodes or strength reducing some {StoreContext} nodes.
29 30 31 32
// Additionally, constant-folds the function parameter if {closure} is given.
//
// The context can be the incoming function context or any outer context
// thereof, as indicated by {outer}'s {distance}.
33
class JSContextSpecialization final : public AdvancedReducer {
34
 public:
35
  JSContextSpecialization(Editor* editor, JSGraph* jsgraph,
36
                          Maybe<OuterContext> outer,
37 38 39
                          MaybeHandle<JSFunction> closure)
      : AdvancedReducer(editor),
        jsgraph_(jsgraph),
40
        outer_(outer),
41
        closure_(closure) {}
42

43 44 45 46
  const char* reducer_name() const override {
    return "JSContextSpecialization";
  }

47
  Reduction Reduce(Node* node) final;
48

49
 private:
50
  Reduction ReduceParameter(Node* node);
51
  Reduction ReduceJSLoadContext(Node* node);
52
  Reduction ReduceJSStoreContext(Node* node);
53

54 55 56 57
  Reduction SimplifyJSStoreContext(Node* node, Node* new_context,
                                   size_t new_depth);
  Reduction SimplifyJSLoadContext(Node* node, Node* new_context,
                                  size_t new_depth);
58

59 60
  Isolate* isolate() const;
  JSGraph* jsgraph() const { return jsgraph_; }
61
  Maybe<OuterContext> outer() const { return outer_; }
62
  MaybeHandle<JSFunction> closure() const { return closure_; }
63 64

  JSGraph* const jsgraph_;
65
  Maybe<OuterContext> outer_;
66
  MaybeHandle<JSFunction> closure_;
67

68
  DISALLOW_COPY_AND_ASSIGN(JSContextSpecialization);
69
};
70 71 72 73

}  // namespace compiler
}  // namespace internal
}  // namespace v8
74 75

#endif  // V8_COMPILER_JS_CONTEXT_SPECIALIZATION_H_