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/js-graph.h"
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/code-stubs.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/node-properties.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/typer.h"
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED(name, expr) \
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  cached_nodes_[name] ? cached_nodes_[name] : (cached_nodes_[name] = (expr))
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::AllocateInNewSpaceStubConstant() {
20bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return CACHED(kAllocateInNewSpaceStubConstant,
21bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                HeapConstant(isolate()->builtins()->AllocateInNewSpace()));
22bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
23bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
24bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::AllocateInOldSpaceStubConstant() {
25bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return CACHED(kAllocateInOldSpaceStubConstant,
26bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                HeapConstant(isolate()->builtins()->AllocateInOldSpace()));
27bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2913e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochNode* JSGraph::ToNumberBuiltinConstant() {
3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return CACHED(kToNumberBuiltinConstant,
3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                HeapConstant(isolate()->builtins()->ToNumber()));
3213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNode* JSGraph::CEntryStubConstant(int result_size, SaveFPRegsMode save_doubles,
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                  ArgvMode argv_mode, bool builtin_exit_frame) {
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (save_doubles == kDontSaveFPRegs && argv_mode == kArgvOnStack) {
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(result_size >= 1 && result_size <= 3);
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (!builtin_exit_frame) {
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      CachedNode key;
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      if (result_size == 1) {
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        key = kCEntryStub1Constant;
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      } else if (result_size == 2) {
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        key = kCEntryStub2Constant;
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      } else {
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        DCHECK(result_size == 3);
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        key = kCEntryStub3Constant;
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      }
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return CACHED(
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          key, HeapConstant(CEntryStub(isolate(), result_size, save_doubles,
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                       argv_mode, builtin_exit_frame)
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                .GetCode()));
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CachedNode key = builtin_exit_frame
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                         ? kCEntryStub1WithBuiltinExitFrameConstant
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                         : kCEntryStub1Constant;
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return CACHED(key,
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  HeapConstant(CEntryStub(isolate(), result_size, save_doubles,
58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                          argv_mode, builtin_exit_frame)
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                   .GetCode()));
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CEntryStub stub(isolate(), result_size, save_doubles, argv_mode,
62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  builtin_exit_frame);
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return HeapConstant(stub.GetCode());
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* JSGraph::EmptyFixedArrayConstant() {
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kEmptyFixedArrayConstant,
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                HeapConstant(factory()->empty_fixed_array()));
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNode* JSGraph::EmptyStringConstant() {
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return CACHED(kEmptyStringConstant, HeapConstant(factory()->empty_string()));
73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNode* JSGraph::FixedArrayMapConstant() {
76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return CACHED(kFixedArrayMapConstant,
77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                HeapConstant(factory()->fixed_array_map()));
78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNode* JSGraph::FixedDoubleArrayMapConstant() {
81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return CACHED(kFixedDoubleArrayMapConstant,
82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                HeapConstant(factory()->fixed_double_array_map()));
83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
85bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::HeapNumberMapConstant() {
86bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return CACHED(kHeapNumberMapConstant,
87bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                HeapConstant(factory()->heap_number_map()));
88bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
89bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochNode* JSGraph::OptimizedOutConstant() {
913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return CACHED(kOptimizedOutConstant,
923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                HeapConstant(factory()->optimized_out()));
933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::StaleRegisterConstant() {
96bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return CACHED(kStaleRegisterConstant,
97bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                HeapConstant(factory()->stale_register()));
98bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
99bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::UndefinedConstant() {
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kUndefinedConstant, HeapConstant(factory()->undefined_value()));
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::TheHoleConstant() {
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kTheHoleConstant, HeapConstant(factory()->the_hole_value()));
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::TrueConstant() {
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kTrueConstant, HeapConstant(factory()->true_value()));
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::FalseConstant() {
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kFalseConstant, HeapConstant(factory()->false_value()));
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::NullConstant() {
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kNullConstant, HeapConstant(factory()->null_value()));
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::ZeroConstant() {
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kZeroConstant, NumberConstant(0.0));
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::OneConstant() {
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kOneConstant, NumberConstant(1.0));
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::NaNConstant() {
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kNaNConstant,
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                NumberConstant(std::numeric_limits<double>::quiet_NaN()));
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierNode* JSGraph::HeapConstant(Handle<HeapObject> value) {
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node** loc = cache_.FindHeapConstant(value);
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *loc = graph()->NewNode(common()->HeapConstant(value));
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *loc;
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::Constant(Handle<Object> value) {
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dereference the handle to determine if a number constant or other
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // canonicalized node can be used.
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value->IsNumber()) {
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Constant(value->Number());
15413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (value->IsUndefined(isolate())) {
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return UndefinedConstant();
15613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (value->IsTrue(isolate())) {
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return TrueConstant();
15813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (value->IsFalse(isolate())) {
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return FalseConstant();
16013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (value->IsNull(isolate())) {
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return NullConstant();
16213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (value->IsTheHole(isolate())) {
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return TheHoleConstant();
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return HeapConstant(Handle<HeapObject>::cast(value));
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::Constant(double value) {
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (bit_cast<int64_t>(value) == bit_cast<int64_t>(0.0)) return ZeroConstant();
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (bit_cast<int64_t>(value) == bit_cast<int64_t>(1.0)) return OneConstant();
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NumberConstant(value);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::Constant(int32_t value) {
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value == 0) return ZeroConstant();
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value == 1) return OneConstant();
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NumberConstant(value);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNode* JSGraph::Constant(uint32_t value) {
184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (value == 0) return ZeroConstant();
185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (value == 1) return OneConstant();
186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return NumberConstant(value);
187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::Int32Constant(int32_t value) {
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node** loc = cache_.FindInt32Constant(value);
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *loc = graph()->NewNode(common()->Int32Constant(value));
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *loc;
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierNode* JSGraph::Int64Constant(int64_t value) {
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Node** loc = cache_.FindInt64Constant(value);
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *loc = graph()->NewNode(common()->Int64Constant(value));
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return *loc;
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
206bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::RelocatableInt32Constant(int32_t value, RelocInfo::Mode rmode) {
20713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Node** loc = cache_.FindRelocatableInt32Constant(
20813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      value, static_cast<RelocInfoMode>(rmode));
209bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (*loc == nullptr) {
210bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    *loc = graph()->NewNode(common()->RelocatableInt32Constant(value, rmode));
211bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
212bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return *loc;
213bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
214bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
215bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::RelocatableInt64Constant(int64_t value, RelocInfo::Mode rmode) {
21613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Node** loc = cache_.FindRelocatableInt64Constant(
21713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      value, static_cast<RelocInfoMode>(rmode));
218bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (*loc == nullptr) {
219bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    *loc = graph()->NewNode(common()->RelocatableInt64Constant(value, rmode));
220bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
221bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return *loc;
222bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
223bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
224bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochNode* JSGraph::RelocatableIntPtrConstant(intptr_t value,
225bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                         RelocInfo::Mode rmode) {
226bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return kPointerSize == 8
227bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch             ? RelocatableInt64Constant(value, rmode)
228bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch             : RelocatableInt32Constant(static_cast<int>(value), rmode);
229bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::NumberConstant(double value) {
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node** loc = cache_.FindNumberConstant(value);
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *loc = graph()->NewNode(common()->NumberConstant(value));
235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *loc;
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierNode* JSGraph::Float32Constant(float value) {
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Node** loc = cache_.FindFloat32Constant(value);
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *loc = graph()->NewNode(common()->Float32Constant(value));
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return *loc;
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::Float64Constant(double value) {
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node** loc = cache_.FindFloat64Constant(value);
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *loc = graph()->NewNode(common()->Float64Constant(value));
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return *loc;
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
257c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochNode* JSGraph::PointerConstant(intptr_t value) {
258c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Node** loc = cache_.FindPointerConstant(value);
259c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (*loc == nullptr) {
260c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    *loc = graph()->NewNode(common()->PointerConstant(value));
261c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
262c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return *loc;
263c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* JSGraph::ExternalConstant(ExternalReference reference) {
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node** loc = cache_.FindExternalConstant(reference);
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (*loc == nullptr) {
268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *loc = graph()->NewNode(common()->ExternalConstant(reference));
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return *loc;
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* JSGraph::ExternalConstant(Runtime::FunctionId function_id) {
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ExternalConstant(ExternalReference(function_id, isolate()));
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
27813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochNode* JSGraph::EmptyStateValues() {
27962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return CACHED(kEmptyStateValues, graph()->NewNode(common()->StateValues(
28062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                       0, SparseInputMask::Dense())));
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* JSGraph::Dead() {
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CACHED(kDead, graph()->NewNode(common()->Dead()));
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid JSGraph::GetCachedNodes(NodeVector* nodes) {
289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  cache_.GetCachedNodes(nodes);
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(cached_nodes_); i++) {
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (Node* node = cached_nodes_[i]) {
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!node->IsDead()) nodes->push_back(node);
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
300