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