blob: 28b1d4982f05c82fc67770e0c22f78013c81a3cd [file] [log] [blame]
barraclough@apple.com2302c042011-03-14 23:31:00 +00001/*
mark.lam@apple.comde0dba72018-04-18 03:31:09 +00002 * Copyright (C) 2011-2018 Apple Inc. All rights reserved.
barraclough@apple.com2302c042011-03-14 23:31:00 +00003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
ryanhaddad@apple.com22104f52016-09-28 17:08:17 +000026#pragma once
barraclough@apple.com2302c042011-03-14 23:31:00 +000027
barraclough@apple.com50d09502011-10-13 22:11:13 +000028#if ENABLE(DFG_JIT)
29
ggaren@apple.com9e5a7612017-05-13 04:59:35 +000030#include "B3SparseCollection.h"
saambarati1@gmail.comb4f28a52014-12-05 05:58:07 +000031#include "BasicBlockLocation.h"
fpizlo@apple.com594887a2011-09-06 09:23:55 +000032#include "CodeBlock.h"
fpizlo@apple.come5abbae2012-03-19 21:44:23 +000033#include "DFGAdjacencyList.h"
fpizlo@apple.coma0fb09052014-01-07 04:52:48 +000034#include "DFGArithMode.h"
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +000035#include "DFGArrayMode.h"
fpizlo@apple.com0bef2a12014-02-10 19:26:29 +000036#include "DFGCommon.h"
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +000037#include "DFGEpoch.h"
oliver@apple.com9e1c8092013-07-25 04:03:16 +000038#include "DFGLazyJSValue.h"
fpizlo@apple.com6b62eaf2015-08-03 23:13:56 +000039#include "DFGMultiGetByOffsetData.h"
fpizlo@apple.com0bef2a12014-02-10 19:26:29 +000040#include "DFGNodeFlags.h"
fpizlo@apple.com6793a322014-02-12 05:42:32 +000041#include "DFGNodeOrigin.h"
fpizlo@apple.comd7897b12012-03-12 23:15:45 +000042#include "DFGNodeType.h"
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +000043#include "DFGObjectMaterializationData.h"
fpizlo@apple.com280ef002016-04-05 22:13:16 +000044#include "DFGOpInfo.h"
sbarati@apple.com239d20b2017-01-26 23:50:58 +000045#include "DFGRegisteredStructure.h"
46#include "DFGRegisteredStructureSet.h"
fpizlo@apple.com0728b8a2014-07-23 01:19:50 +000047#include "DFGTransition.h"
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +000048#include "DFGUseKind.h"
fpizlo@apple.com4ffd3952011-10-12 02:05:53 +000049#include "DFGVariableAccessData.h"
fpizlo@apple.com51614cc2014-02-17 06:35:32 +000050#include "GetByIdVariant.h"
fpizlo@apple.com0bef2a12014-02-10 19:26:29 +000051#include "JSCJSValue.h"
52#include "Operands.h"
fpizlo@apple.com43219522014-02-25 02:02:50 +000053#include "PutByIdVariant.h"
fpizlo@apple.com0bef2a12014-02-10 19:26:29 +000054#include "SpeculatedType.h"
saambarati1@gmail.comdaf10202014-10-01 20:47:51 +000055#include "TypeLocation.h"
fpizlo@apple.com594887a2011-09-06 09:23:55 +000056#include "ValueProfile.h"
sbarati@apple.com972e8172016-08-28 23:31:46 +000057#include <type_traits>
oliver@apple.com827d2cf2013-07-25 04:04:45 +000058#include <wtf/ListDump.h>
fpizlo@apple.com6e693702017-03-14 21:37:41 +000059#include <wtf/LoggingHashSet.h>
barraclough@apple.com74213b42011-04-16 01:19:27 +000060
fpizlo@apple.com4a528d02016-05-11 00:08:50 +000061namespace JSC {
62
utatane.tea@gmail.com9d300ae2016-10-04 19:34:52 +000063namespace DOMJIT {
utatane.tea@gmail.com90399a22016-10-24 23:34:32 +000064class GetterSetter;
utatane.tea@gmail.comaf9b93f2017-05-27 19:03:41 +000065class CallDOMGetterSnippet;
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +000066class Signature;
utatane.tea@gmail.com9d300ae2016-10-04 19:34:52 +000067}
68
fpizlo@apple.com4a528d02016-05-11 00:08:50 +000069namespace Profiler {
70class ExecutionCounter;
71}
72
utatane.tea@gmail.comaf9b93f2017-05-27 19:03:41 +000073class Snippet;
74
fpizlo@apple.com4a528d02016-05-11 00:08:50 +000075namespace DFG {
barraclough@apple.com2302c042011-03-14 23:31:00 +000076
oliver@apple.com827d2cf2013-07-25 04:04:45 +000077class Graph;
fpizlo@apple.com8ff74712015-03-17 15:50:44 +000078class PromotedLocationDescriptor;
oliver@apple.com426f5b02013-07-25 04:04:27 +000079struct BasicBlock;
80
fpizlo@apple.com9800ede2014-09-20 17:59:58 +000081struct StorageAccessData {
82 PropertyOffset offset;
83 unsigned identifierNumber;
84};
85
fpizlo@apple.com43219522014-02-25 02:02:50 +000086struct MultiPutByOffsetData {
87 unsigned identifierNumber;
88 Vector<PutByIdVariant, 2> variants;
89
90 bool writesStructures() const;
91 bool reallocatesStorage() const;
92};
93
fpizlo@apple.coma772c6b2018-05-19 22:00:21 +000094struct MatchStructureVariant {
95 RegisteredStructure structure;
96 bool result;
97};
98
99struct MatchStructureData {
100 Vector<MatchStructureVariant, 2> variants;
101};
102
fpizlo@apple.comf7b42982012-10-25 17:09:42 +0000103struct NewArrayBufferData {
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +0000104 union {
105 struct {
106 unsigned vectorLengthHint;
keith_miller@apple.comc02f5d32018-05-22 18:04:31 +0000107 unsigned indexingMode;
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +0000108 };
109 uint64_t asQuadWord;
110 };
fpizlo@apple.comf7b42982012-10-25 17:09:42 +0000111};
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +0000112static_assert(sizeof(IndexingType) <= sizeof(unsigned), "");
113static_assert(sizeof(NewArrayBufferData) == sizeof(uint64_t), "");
fpizlo@apple.comf7b42982012-10-25 17:09:42 +0000114
sbarati@apple.com1c010822018-08-21 06:05:21 +0000115struct DataViewData {
116 union {
117 struct {
118 uint8_t byteSize;
119 bool isSigned;
120 bool isFloatingPoint; // Used for the DataViewSet node.
121 TriState isLittleEndian;
122 };
123 uint64_t asQuadWord;
124 };
125};
126static_assert(sizeof(DataViewData) == sizeof(uint64_t), "");
127
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +0000128struct BranchTarget {
129 BranchTarget()
130 : block(0)
fpizlo@apple.combeef4522014-04-16 22:44:00 +0000131 , count(PNaN)
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +0000132 {
133 }
134
135 explicit BranchTarget(BasicBlock* block)
136 : block(block)
fpizlo@apple.combeef4522014-04-16 22:44:00 +0000137 , count(PNaN)
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +0000138 {
139 }
140
141 void setBytecodeIndex(unsigned bytecodeIndex)
142 {
143 block = bitwise_cast<BasicBlock*>(static_cast<uintptr_t>(bytecodeIndex));
144 }
145 unsigned bytecodeIndex() const { return bitwise_cast<uintptr_t>(block); }
146
147 void dump(PrintStream&) const;
148
149 BasicBlock* block;
150 float count;
151};
152
153struct BranchData {
154 static BranchData withBytecodeIndices(
155 unsigned takenBytecodeIndex, unsigned notTakenBytecodeIndex)
156 {
157 BranchData result;
158 result.taken.block = bitwise_cast<BasicBlock*>(static_cast<uintptr_t>(takenBytecodeIndex));
159 result.notTaken.block = bitwise_cast<BasicBlock*>(static_cast<uintptr_t>(notTakenBytecodeIndex));
160 return result;
161 }
162
163 unsigned takenBytecodeIndex() const { return taken.bytecodeIndex(); }
164 unsigned notTakenBytecodeIndex() const { return notTaken.bytecodeIndex(); }
165
166 BasicBlock*& forCondition(bool condition)
167 {
168 if (condition)
169 return taken.block;
170 return notTaken.block;
171 }
172
173 BranchTarget taken;
174 BranchTarget notTaken;
175};
176
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000177// The SwitchData and associated data structures duplicate the information in
178// JumpTable. The DFG may ultimately end up using the JumpTable, though it may
179// instead decide to do something different - this is entirely up to the DFG.
180// These data structures give the DFG a higher-level semantic description of
181// what is going on, which will allow it to make the right decision.
oliver@apple.com6ce44682013-07-25 04:03:03 +0000182//
183// Note that there will never be multiple SwitchCases in SwitchData::cases that
184// have the same SwitchCase::value, since the bytecode's JumpTables never have
185// duplicates - since the JumpTable maps a value to a target. It's a
186// one-to-many mapping. So we may have duplicate targets, but never duplicate
187// values.
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000188struct SwitchCase {
189 SwitchCase()
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000190 {
191 }
192
oliver@apple.com426f5b02013-07-25 04:04:27 +0000193 SwitchCase(LazyJSValue value, BasicBlock* target)
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000194 : value(value)
195 , target(target)
196 {
197 }
198
oliver@apple.com426f5b02013-07-25 04:04:27 +0000199 static SwitchCase withBytecodeIndex(LazyJSValue value, unsigned bytecodeIndex)
200 {
201 SwitchCase result;
202 result.value = value;
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +0000203 result.target.setBytecodeIndex(bytecodeIndex);
oliver@apple.com426f5b02013-07-25 04:04:27 +0000204 return result;
205 }
206
oliver@apple.com9e1c8092013-07-25 04:03:16 +0000207 LazyJSValue value;
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +0000208 BranchTarget target;
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000209};
210
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000211struct SwitchData {
212 // Initializes most fields to obviously invalid values. Anyone
213 // constructing this should make sure to initialize everything they
214 // care about manually.
215 SwitchData()
rmorisset@apple.com4ccbcf12019-03-12 19:07:04 +0000216 : switchTableIndex(UINT_MAX)
217 , kind(static_cast<SwitchKind>(-1))
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000218 , didUseJumpTable(false)
219 {
220 }
221
222 Vector<SwitchCase> cases;
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +0000223 BranchTarget fallThrough;
keith_miller@apple.com6c2ac2e2018-03-08 02:26:55 +0000224 size_t switchTableIndex;
rmorisset@apple.com4ccbcf12019-03-12 19:07:04 +0000225 SwitchKind kind;
oliver@apple.com9b7647b2013-07-25 04:03:00 +0000226 bool didUseJumpTable;
227};
228
sbarati@apple.com8bd925d2017-09-05 03:21:33 +0000229struct EntrySwitchData {
230 Vector<BasicBlock*> cases;
231};
232
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +0000233struct CallVarargsData {
234 int firstVarArgOffset;
235};
236
237struct LoadVarargsData {
fpizlo@apple.comce99ff52015-05-22 18:48:03 +0000238 VirtualRegister start; // Local for the first element. This is the first actual argument, not this.
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +0000239 VirtualRegister count; // Local for the count.
240 VirtualRegister machineStart;
241 VirtualRegister machineCount;
242 unsigned offset; // Which array element to start with. Usually this is 0.
243 unsigned mandatoryMinimum; // The number of elements on the stack that must be initialized; if the array is too short then the missing elements must get undefined. Does not include "this".
244 unsigned limit; // Maximum number of elements to load. Includes "this".
245};
246
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +0000247struct StackAccessData {
248 StackAccessData()
249 : format(DeadFlush)
250 {
251 }
252
253 StackAccessData(VirtualRegister local, FlushFormat format)
254 : local(local)
255 , format(format)
256 {
257 }
258
259 VirtualRegister local;
260 VirtualRegister machineLocal;
261 FlushFormat format;
262
263 FlushedAt flushedAt() { return FlushedAt(format, machineLocal); }
264};
265
utatane.tea@gmail.comc9d8f862016-10-28 22:57:10 +0000266struct CallDOMGetterData {
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000267 FunctionPtr<OperationPtrTag> customAccessorGetter;
utatane.tea@gmail.comf496c6b2017-07-27 12:35:49 +0000268 const DOMJIT::GetterSetter* domJIT { nullptr };
utatane.tea@gmail.comaf9b93f2017-05-27 19:03:41 +0000269 DOMJIT::CallDOMGetterSnippet* snippet { nullptr };
utatane.tea@gmail.com8b636472016-10-28 23:19:06 +0000270 unsigned identifierNumber { 0 };
utatane.tea@gmail.com90399a22016-10-24 23:34:32 +0000271};
272
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +0000273enum class BucketOwnerType : uint32_t {
274 Map,
275 Set
276};
277
barraclough@apple.com2302c042011-03-14 23:31:00 +0000278// === Node ===
279//
280// Node represents a single operation in the data flow graph.
281struct Node {
ggaren@apple.com9e5a7612017-05-13 04:59:35 +0000282 WTF_MAKE_FAST_ALLOCATED;
commit-queue@webkit.orgaa93e082016-07-28 01:36:44 +0000283public:
fpizlo@apple.com6e693702017-03-14 21:37:41 +0000284 static const char HashSetTemplateInstantiationString[];
285
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +0000286 enum VarArgTag { VarArg };
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +0000287
fpizlo@apple.comd8dd0532012-09-13 04:18:52 +0000288 Node() { }
289
fpizlo@apple.com6793a322014-02-12 05:42:32 +0000290 Node(NodeType op, NodeOrigin nodeOrigin, const AdjacencyList& children)
291 : origin(nodeOrigin)
fpizlo@apple.comf45e88b2013-01-20 19:29:50 +0000292 , children(children)
msaboff@apple.com62aa8b72013-09-26 22:53:54 +0000293 , m_virtualRegister(VirtualRegister())
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000294 , m_refCount(1)
fpizlo@apple.comf45e88b2013-01-20 19:29:50 +0000295 , m_prediction(SpecNone)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000296 , owner(nullptr)
fpizlo@apple.comf45e88b2013-01-20 19:29:50 +0000297 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000298 m_misc.replacement = nullptr;
fpizlo@apple.comf45e88b2013-01-20 19:29:50 +0000299 setOpAndDefaultFlags(op);
fpizlo@apple.comf45e88b2013-01-20 19:29:50 +0000300 }
301
barraclough@apple.com2302c042011-03-14 23:31:00 +0000302 // Construct a node with up to 3 children, no immediate value.
fpizlo@apple.com6793a322014-02-12 05:42:32 +0000303 Node(NodeType op, NodeOrigin nodeOrigin, Edge child1 = Edge(), Edge child2 = Edge(), Edge child3 = Edge())
304 : origin(nodeOrigin)
fpizlo@apple.come5abbae2012-03-19 21:44:23 +0000305 , children(AdjacencyList::Fixed, child1, child2, child3)
msaboff@apple.com62aa8b72013-09-26 22:53:54 +0000306 , m_virtualRegister(VirtualRegister())
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000307 , m_refCount(1)
fpizlo@apple.com62336162012-06-07 01:35:59 +0000308 , m_prediction(SpecNone)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000309 , owner(nullptr)
barraclough@apple.com2302c042011-03-14 23:31:00 +0000310 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000311 m_misc.replacement = nullptr;
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +0000312 setOpAndDefaultFlags(op);
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000313 ASSERT(!(m_flags & NodeHasVarArgs));
barraclough@apple.com2302c042011-03-14 23:31:00 +0000314 }
315
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000316 // Construct a node with up to 3 children, no immediate value.
317 Node(NodeFlags result, NodeType op, NodeOrigin nodeOrigin, Edge child1 = Edge(), Edge child2 = Edge(), Edge child3 = Edge())
318 : origin(nodeOrigin)
319 , children(AdjacencyList::Fixed, child1, child2, child3)
320 , m_virtualRegister(VirtualRegister())
321 , m_refCount(1)
322 , m_prediction(SpecNone)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000323 , owner(nullptr)
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000324 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000325 m_misc.replacement = nullptr;
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000326 setOpAndDefaultFlags(op);
327 setResult(result);
328 ASSERT(!(m_flags & NodeHasVarArgs));
329 }
330
barraclough@apple.com2302c042011-03-14 23:31:00 +0000331 // Construct a node with up to 3 children and an immediate value.
fpizlo@apple.com6793a322014-02-12 05:42:32 +0000332 Node(NodeType op, NodeOrigin nodeOrigin, OpInfo imm, Edge child1 = Edge(), Edge child2 = Edge(), Edge child3 = Edge())
333 : origin(nodeOrigin)
fpizlo@apple.come5abbae2012-03-19 21:44:23 +0000334 , children(AdjacencyList::Fixed, child1, child2, child3)
msaboff@apple.com62aa8b72013-09-26 22:53:54 +0000335 , m_virtualRegister(VirtualRegister())
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000336 , m_refCount(1)
fpizlo@apple.com62336162012-06-07 01:35:59 +0000337 , m_prediction(SpecNone)
oliver@apple.comd83bc442013-07-25 04:04:21 +0000338 , m_opInfo(imm.m_value)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000339 , owner(nullptr)
barraclough@apple.com2302c042011-03-14 23:31:00 +0000340 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000341 m_misc.replacement = nullptr;
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +0000342 setOpAndDefaultFlags(op);
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000343 ASSERT(!(m_flags & NodeHasVarArgs));
barraclough@apple.com2302c042011-03-14 23:31:00 +0000344 }
345
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000346 // Construct a node with up to 3 children and an immediate value.
347 Node(NodeFlags result, NodeType op, NodeOrigin nodeOrigin, OpInfo imm, Edge child1 = Edge(), Edge child2 = Edge(), Edge child3 = Edge())
348 : origin(nodeOrigin)
349 , children(AdjacencyList::Fixed, child1, child2, child3)
350 , m_virtualRegister(VirtualRegister())
351 , m_refCount(1)
352 , m_prediction(SpecNone)
353 , m_opInfo(imm.m_value)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000354 , owner(nullptr)
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000355 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000356 m_misc.replacement = nullptr;
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000357 setOpAndDefaultFlags(op);
358 setResult(result);
359 ASSERT(!(m_flags & NodeHasVarArgs));
360 }
361
barraclough@apple.come23e0402011-04-15 23:02:09 +0000362 // Construct a node with up to 3 children and two immediate values.
fpizlo@apple.com6793a322014-02-12 05:42:32 +0000363 Node(NodeType op, NodeOrigin nodeOrigin, OpInfo imm1, OpInfo imm2, Edge child1 = Edge(), Edge child2 = Edge(), Edge child3 = Edge())
364 : origin(nodeOrigin)
fpizlo@apple.come5abbae2012-03-19 21:44:23 +0000365 , children(AdjacencyList::Fixed, child1, child2, child3)
msaboff@apple.com62aa8b72013-09-26 22:53:54 +0000366 , m_virtualRegister(VirtualRegister())
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000367 , m_refCount(1)
fpizlo@apple.com62336162012-06-07 01:35:59 +0000368 , m_prediction(SpecNone)
oliver@apple.comd83bc442013-07-25 04:04:21 +0000369 , m_opInfo(imm1.m_value)
370 , m_opInfo2(imm2.m_value)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000371 , owner(nullptr)
barraclough@apple.come23e0402011-04-15 23:02:09 +0000372 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000373 m_misc.replacement = nullptr;
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +0000374 setOpAndDefaultFlags(op);
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000375 ASSERT(!(m_flags & NodeHasVarArgs));
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +0000376 }
377
fpizlo@apple.com7ab54822011-08-10 00:51:11 +0000378 // Construct a node with a variable number of children and two immediate values.
fpizlo@apple.com6793a322014-02-12 05:42:32 +0000379 Node(VarArgTag, NodeType op, NodeOrigin nodeOrigin, OpInfo imm1, OpInfo imm2, unsigned firstChild, unsigned numChildren)
380 : origin(nodeOrigin)
fpizlo@apple.come5abbae2012-03-19 21:44:23 +0000381 , children(AdjacencyList::Variable, firstChild, numChildren)
msaboff@apple.com62aa8b72013-09-26 22:53:54 +0000382 , m_virtualRegister(VirtualRegister())
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000383 , m_refCount(1)
fpizlo@apple.com62336162012-06-07 01:35:59 +0000384 , m_prediction(SpecNone)
oliver@apple.comd83bc442013-07-25 04:04:21 +0000385 , m_opInfo(imm1.m_value)
386 , m_opInfo2(imm2.m_value)
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000387 , owner(nullptr)
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +0000388 {
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +0000389 m_misc.replacement = nullptr;
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +0000390 setOpAndDefaultFlags(op);
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000391 ASSERT(m_flags & NodeHasVarArgs);
392 }
393
394 NodeType op() const { return static_cast<NodeType>(m_op); }
395 NodeFlags flags() const { return m_flags; }
commit-queue@webkit.orgaa93e082016-07-28 01:36:44 +0000396
397 unsigned index() const { return m_index; }
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +0000398
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000399 void setOp(NodeType op)
400 {
401 m_op = op;
402 }
403
404 void setFlags(NodeFlags flags)
405 {
406 m_flags = flags;
407 }
408
409 bool mergeFlags(NodeFlags flags)
410 {
411 NodeFlags newFlags = m_flags | flags;
412 if (newFlags == m_flags)
413 return false;
414 m_flags = newFlags;
415 return true;
416 }
417
418 bool filterFlags(NodeFlags flags)
419 {
420 NodeFlags newFlags = m_flags & flags;
421 if (newFlags == m_flags)
422 return false;
423 m_flags = newFlags;
424 return true;
425 }
426
427 bool clearFlags(NodeFlags flags)
428 {
429 return filterFlags(~flags);
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +0000430 }
431
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000432 void setResult(NodeFlags result)
433 {
434 ASSERT(!(result & ~NodeResultMask));
435 clearFlags(NodeResultMask);
436 mergeFlags(result);
437 }
438
439 NodeFlags result() const
440 {
441 return flags() & NodeResultMask;
442 }
443
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +0000444 void setOpAndDefaultFlags(NodeType op)
445 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000446 m_op = op;
447 m_flags = defaultFlags(op);
barraclough@apple.come23e0402011-04-15 23:02:09 +0000448 }
msaboff@apple.combb1c1702013-03-19 22:22:06 +0000449
sbarati@apple.come2cdd872018-02-13 01:12:28 +0000450 void remove(Graph&);
fpizlo@apple.comcd04bc22018-04-24 18:54:47 +0000451 void removeWithoutChecks();
saambarati1@gmail.comd372c702014-10-16 19:55:14 +0000452
sbarati@apple.com239d20b2017-01-26 23:50:58 +0000453 void convertToCheckStructure(RegisteredStructureSet* set)
saambarati1@gmail.comd372c702014-10-16 19:55:14 +0000454 {
455 setOpAndDefaultFlags(CheckStructure);
sbarati@apple.com239d20b2017-01-26 23:50:58 +0000456 m_opInfo = set;
saambarati1@gmail.comd372c702014-10-16 19:55:14 +0000457 }
basile_clement@apple.come91b66f2015-05-04 18:37:58 +0000458
sbarati@apple.com0cba66d2018-09-17 22:21:32 +0000459 void convertToCheckStructureOrEmpty(RegisteredStructureSet* set)
460 {
461 if (SpecCellCheck & SpecEmpty)
462 setOpAndDefaultFlags(CheckStructureOrEmpty);
463 else
464 setOpAndDefaultFlags(CheckStructure);
465 m_opInfo = set;
466 }
467
sbarati@apple.com640c1072017-09-05 04:10:53 +0000468 void convertCheckStructureOrEmptyToCheckStructure()
469 {
470 ASSERT(op() == CheckStructureOrEmpty);
471 setOpAndDefaultFlags(CheckStructure);
472 }
473
basile_clement@apple.come91b66f2015-05-04 18:37:58 +0000474 void convertToCheckStructureImmediate(Node* structure)
475 {
sbarati@apple.comd5d465a2017-09-06 20:51:02 +0000476 ASSERT(op() == CheckStructure || op() == CheckStructureOrEmpty);
basile_clement@apple.come91b66f2015-05-04 18:37:58 +0000477 m_op = CheckStructureImmediate;
478 children.setChild1(Edge(structure, CellUse));
479 }
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000480
fpizlo@apple.comcd04bc22018-04-24 18:54:47 +0000481 void replaceWith(Graph&, Node* other);
482 void replaceWithWithoutChecks(Node* other);
msaboff@apple.combb1c1702013-03-19 22:22:06 +0000483
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000484 void convertToIdentity();
fpizlo@apple.comda834ae2015-03-26 04:28:43 +0000485 void convertToIdentityOn(Node*);
barraclough@apple.come23e0402011-04-15 23:02:09 +0000486
barraclough@apple.com2302c042011-03-14 23:31:00 +0000487 bool mustGenerate()
488 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +0000489 return m_flags & NodeMustGenerate;
barraclough@apple.com2302c042011-03-14 23:31:00 +0000490 }
fpizlo@apple.com91b2c682012-05-24 06:24:36 +0000491
barraclough@apple.com2302c042011-03-14 23:31:00 +0000492 bool isConstant()
493 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000494 switch (op()) {
495 case JSConstant:
496 case DoubleConstant:
497 case Int52Constant:
498 return true;
499 default:
500 return false;
501 }
barraclough@apple.com2302c042011-03-14 23:31:00 +0000502 }
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +0000503
504 bool hasConstant()
505 {
fpizlo@apple.com7e0f6502012-05-25 22:45:57 +0000506 switch (op()) {
507 case JSConstant:
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000508 case DoubleConstant:
509 case Int52Constant:
fpizlo@apple.com7e0f6502012-05-25 22:45:57 +0000510 return true;
fpizlo@apple.comda834ae2015-03-26 04:28:43 +0000511
512 case PhantomDirectArguments:
513 case PhantomClonedArguments:
514 // These pretend to be the empty value constant for the benefit of the DFG backend, which
515 // otherwise wouldn't take kindly to a node that doesn't compute a value.
516 return true;
517
fpizlo@apple.com7e0f6502012-05-25 22:45:57 +0000518 default:
519 return false;
520 }
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +0000521 }
barraclough@apple.com2302c042011-03-14 23:31:00 +0000522
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000523 FrozenValue* constant()
barraclough@apple.com2302c042011-03-14 23:31:00 +0000524 {
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000525 ASSERT(hasConstant());
fpizlo@apple.comda834ae2015-03-26 04:28:43 +0000526
sbarati@apple.come20444a2016-11-30 06:24:44 +0000527 if (op() == PhantomDirectArguments || op() == PhantomClonedArguments) {
fpizlo@apple.comda834ae2015-03-26 04:28:43 +0000528 // These pretend to be the empty value constant for the benefit of the DFG backend, which
529 // otherwise wouldn't take kindly to a node that doesn't compute a value.
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000530 return FrozenValue::emptySingleton();
fpizlo@apple.comda834ae2015-03-26 04:28:43 +0000531 }
532
sbarati@apple.com972e8172016-08-28 23:31:46 +0000533 return m_opInfo.as<FrozenValue*>();
barraclough@apple.com2302c042011-03-14 23:31:00 +0000534 }
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000535
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000536 // Don't call this directly - use Graph::convertToConstant() instead!
537 void convertToConstant(FrozenValue* value)
fpizlo@apple.com3187c922012-05-18 21:47:53 +0000538 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +0000539 if (hasDoubleResult())
540 m_op = DoubleConstant;
541 else if (hasInt52Result())
542 m_op = Int52Constant;
543 else
544 m_op = JSConstant;
sbarati@apple.comc8d55562018-01-17 09:24:26 +0000545 m_flags &= ~(NodeMustGenerate | NodeHasVarArgs);
sbarati@apple.com972e8172016-08-28 23:31:46 +0000546 m_opInfo = value;
fpizlo@apple.com33b10ee2013-03-07 09:04:57 +0000547 children.reset();
548 }
fpizlo@apple.com024424c2016-03-09 05:16:47 +0000549
550 void convertToLazyJSConstant(Graph&, LazyJSValue);
fpizlo@apple.com33b10ee2013-03-07 09:04:57 +0000551
fpizlo@apple.com9ca951e2013-12-09 01:08:53 +0000552 void convertToConstantStoragePointer(void* pointer)
553 {
554 ASSERT(op() == GetIndexedPropertyStorage);
555 m_op = ConstantStoragePointer;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000556 m_opInfo = pointer;
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000557 children.reset();
fpizlo@apple.com9ca951e2013-12-09 01:08:53 +0000558 }
559
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +0000560 void convertToPutStack(StackAccessData* data)
561 {
562 m_op = PutStack;
563 m_flags |= NodeMustGenerate;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000564 m_opInfo = data;
565 m_opInfo2 = OpInfoWrapper();
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +0000566 }
567
568 void convertToGetStack(StackAccessData* data)
569 {
570 m_op = GetStack;
571 m_flags &= ~NodeMustGenerate;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000572 m_opInfo = data;
573 m_opInfo2 = OpInfoWrapper();
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +0000574 children.reset();
575 }
576
fpizlo@apple.comf224cdd2016-06-10 02:03:33 +0000577 void convertToGetByOffset(StorageAccessData& data, Edge storage, Edge base)
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000578 {
utatane.tea@gmail.com0e0c28a2018-04-08 16:21:38 +0000579 ASSERT(m_op == GetById || m_op == GetByIdFlush || m_op == GetByIdDirect || m_op == GetByIdDirectFlush || m_op == MultiGetByOffset);
sbarati@apple.com972e8172016-08-28 23:31:46 +0000580 m_opInfo = &data;
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +0000581 children.setChild1(storage);
fpizlo@apple.comf224cdd2016-06-10 02:03:33 +0000582 children.setChild2(base);
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000583 m_op = GetByOffset;
fpizlo@apple.comcad67682015-02-09 19:57:41 +0000584 m_flags &= ~NodeMustGenerate;
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000585 }
586
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000587 void convertToMultiGetByOffset(MultiGetByOffsetData* data)
588 {
fpizlo@apple.comcd04bc22018-04-24 18:54:47 +0000589 RELEASE_ASSERT(m_op == GetById || m_op == GetByIdFlush || m_op == GetByIdDirect || m_op == GetByIdDirectFlush);
sbarati@apple.com972e8172016-08-28 23:31:46 +0000590 m_opInfo = data;
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000591 child1().setUseKind(CellUse);
592 m_op = MultiGetByOffset;
fpizlo@apple.comcd04bc22018-04-24 18:54:47 +0000593 RELEASE_ASSERT(m_flags & NodeMustGenerate);
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000594 }
595
fpizlo@apple.comf224cdd2016-06-10 02:03:33 +0000596 void convertToPutByOffset(StorageAccessData& data, Edge storage, Edge base)
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000597 {
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000598 ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush || m_op == MultiPutByOffset);
sbarati@apple.com972e8172016-08-28 23:31:46 +0000599 m_opInfo = &data;
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000600 children.setChild3(children.child2());
fpizlo@apple.comf224cdd2016-06-10 02:03:33 +0000601 children.setChild2(base);
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +0000602 children.setChild1(storage);
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000603 m_op = PutByOffset;
fpizlo@apple.comc2c67632012-11-17 08:37:14 +0000604 }
605
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000606 void convertToMultiPutByOffset(MultiPutByOffsetData* data)
607 {
608 ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush);
sbarati@apple.com972e8172016-08-28 23:31:46 +0000609 m_opInfo = data;
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000610 m_op = MultiPutByOffset;
fpizlo@apple.com3378c482014-07-27 23:14:40 +0000611 }
612
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +0000613 void convertToPhantomNewObject()
614 {
615 ASSERT(m_op == NewObject || m_op == MaterializeNewObject);
616 m_op = PhantomNewObject;
617 m_flags &= ~NodeHasVarArgs;
commit-queue@webkit.org57250332015-04-21 22:29:16 +0000618 m_flags |= NodeMustGenerate;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000619 m_opInfo = OpInfoWrapper();
620 m_opInfo2 = OpInfoWrapper();
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +0000621 children = AdjacencyList();
622 }
commit-queue@webkit.org88ab4e72015-04-24 02:23:36 +0000623
624 void convertToPhantomNewFunction()
625 {
gskachkov@gmail.comab749fd2017-08-23 17:05:33 +0000626 ASSERT(m_op == NewFunction || m_op == NewGeneratorFunction || m_op == NewAsyncFunction || m_op == NewAsyncGeneratorFunction);
commit-queue@webkit.org88ab4e72015-04-24 02:23:36 +0000627 m_op = PhantomNewFunction;
628 m_flags |= NodeMustGenerate;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000629 m_opInfo = OpInfoWrapper();
630 m_opInfo2 = OpInfoWrapper();
commit-queue@webkit.org88ab4e72015-04-24 02:23:36 +0000631 children = AdjacencyList();
632 }
633
utatane.tea@gmail.com9d9fd322015-12-17 10:33:08 +0000634 void convertToPhantomNewGeneratorFunction()
635 {
636 ASSERT(m_op == NewGeneratorFunction);
637 m_op = PhantomNewGeneratorFunction;
638 m_flags |= NodeMustGenerate;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000639 m_opInfo = OpInfoWrapper();
640 m_opInfo2 = OpInfoWrapper();
utatane.tea@gmail.com9d9fd322015-12-17 10:33:08 +0000641 children = AdjacencyList();
642 }
643
caitp@igalia.com8bc562d2016-11-14 21:14:15 +0000644 void convertToPhantomNewAsyncFunction()
645 {
646 ASSERT(m_op == NewAsyncFunction);
647 m_op = PhantomNewAsyncFunction;
648 m_flags |= NodeMustGenerate;
649 m_opInfo = OpInfoWrapper();
650 m_opInfo2 = OpInfoWrapper();
651 children = AdjacencyList();
652 }
653
gskachkov@gmail.comab749fd2017-08-23 17:05:33 +0000654 void convertToPhantomNewAsyncGeneratorFunction()
655 {
656 ASSERT(m_op == NewAsyncGeneratorFunction);
657 m_op = PhantomNewAsyncGeneratorFunction;
658 m_flags |= NodeMustGenerate;
659 m_opInfo = OpInfoWrapper();
660 m_opInfo2 = OpInfoWrapper();
661 children = AdjacencyList();
662 }
663
basile_clement@apple.com2ca1f7b2015-05-05 16:34:21 +0000664 void convertToPhantomCreateActivation()
665 {
666 ASSERT(m_op == CreateActivation || m_op == MaterializeCreateActivation);
667 m_op = PhantomCreateActivation;
668 m_flags &= ~NodeHasVarArgs;
669 m_flags |= NodeMustGenerate;
sbarati@apple.com972e8172016-08-28 23:31:46 +0000670 m_opInfo = OpInfoWrapper();
671 m_opInfo2 = OpInfoWrapper();
basile_clement@apple.com2ca1f7b2015-05-05 16:34:21 +0000672 children = AdjacencyList();
673 }
674
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +0000675 void convertToPhantomNewRegexp()
676 {
677 ASSERT(m_op == NewRegexp);
678 setOpAndDefaultFlags(PhantomNewRegexp);
679 m_opInfo = OpInfoWrapper();
680 m_opInfo2 = OpInfoWrapper();
681 children = AdjacencyList();
682 }
683
fpizlo@apple.com1337b9e2015-02-02 18:15:44 +0000684 void convertPhantomToPhantomLocal()
fpizlo@apple.com3fa6f5d2013-02-09 19:33:00 +0000685 {
sbarati@apple.com5a802392019-04-11 20:47:16 +0000686 ASSERT(m_op == Phantom && (child1()->op() == Phi || child1()->op() == SetLocal || child1()->op() == SetArgumentDefinitely));
fpizlo@apple.com3fa6f5d2013-02-09 19:33:00 +0000687 m_op = PhantomLocal;
688 m_opInfo = child1()->m_opInfo; // Copy the variableAccessData.
689 children.setChild1(Edge());
690 }
691
fpizlo@apple.com1337b9e2015-02-02 18:15:44 +0000692 void convertFlushToPhantomLocal()
693 {
694 ASSERT(m_op == Flush);
695 m_op = PhantomLocal;
696 children = AdjacencyList();
697 }
698
fpizlo@apple.com0e6e1542013-03-18 18:09:22 +0000699 void convertToToString()
700 {
yusukesuzuki@slowstart.orga4a7f3a2018-09-07 19:44:48 +0000701 ASSERT(m_op == ToPrimitive || m_op == StringValueOf);
fpizlo@apple.com0e6e1542013-03-18 18:09:22 +0000702 m_op = ToString;
703 }
benjamin@webkit.org903025b2015-02-14 04:20:21 +0000704
commit-queue@webkit.orgf4256ed2016-02-17 23:35:11 +0000705 void convertToArithNegate()
706 {
707 ASSERT(m_op == ArithAbs && child1().useKind() == Int32Use);
708 m_op = ArithNegate;
709 }
utatane.tea@gmail.com50bdb282017-08-30 00:29:39 +0000710
711 void convertToCompareEqPtr(FrozenValue* cell, Edge node)
712 {
keith_miller@apple.com0feae702019-03-25 20:29:19 +0000713 ASSERT(m_op == CompareStrictEq || m_op == SameValue);
utatane.tea@gmail.com50bdb282017-08-30 00:29:39 +0000714 setOpAndDefaultFlags(CompareEqPtr);
715 children.setChild1(node);
716 children.setChild2(Edge());
717 m_opInfo = cell;
718 }
utatane.tea@gmail.com57ab8ecd2017-09-05 03:03:03 +0000719
720 void convertToNumberToStringWithValidRadixConstant(int32_t radix)
721 {
722 ASSERT(m_op == NumberToStringWithRadix);
723 ASSERT(2 <= radix && radix <= 36);
724 setOpAndDefaultFlags(NumberToStringWithValidRadixConstant);
725 children.setChild2(Edge());
726 m_opInfo = radix;
727 }
utatane.tea@gmail.com501ead02017-09-18 12:47:26 +0000728
729 void convertToGetGlobalThis()
730 {
731 ASSERT(m_op == ToThis);
732 setOpAndDefaultFlags(GetGlobalThis);
733 children.setChild1(Edge());
734 }
utatane.tea@gmail.com076aa232017-11-01 17:32:08 +0000735
736 void convertToCallObjectConstructor(FrozenValue* globalObject)
737 {
738 ASSERT(m_op == ToObject);
739 setOpAndDefaultFlags(CallObjectConstructor);
740 m_opInfo = globalObject;
741 }
742
743 void convertToNewStringObject(RegisteredStructure structure)
744 {
745 ASSERT(m_op == CallObjectConstructor || m_op == ToObject);
746 setOpAndDefaultFlags(NewStringObject);
747 m_opInfo = structure;
748 m_opInfo2 = OpInfoWrapper();
749 }
750
751 void convertToNewObject(RegisteredStructure structure)
752 {
utatane.tea@gmail.com537abd32018-06-02 21:08:10 +0000753 ASSERT(m_op == CallObjectConstructor || m_op == CreateThis || m_op == ObjectCreate);
utatane.tea@gmail.com076aa232017-11-01 17:32:08 +0000754 setOpAndDefaultFlags(NewObject);
755 children.reset();
756 m_opInfo = structure;
757 m_opInfo2 = OpInfoWrapper();
758 }
yusukesuzuki@slowstart.org81784412018-12-18 06:54:49 +0000759
760 void convertToNewArrayBuffer(FrozenValue* immutableButterfly);
fpizlo@apple.com0e6e1542013-03-18 18:09:22 +0000761
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +0000762 void convertToDirectCall(FrozenValue*);
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +0000763
764 void convertToCallDOM(Graph&);
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +0000765
sbarati@apple.com6a896292018-08-31 07:45:02 +0000766 void convertToRegExpExecNonGlobalOrStickyWithoutChecks(FrozenValue* regExp);
767 void convertToRegExpMatchFastGlobalWithoutChecks(FrozenValue* regExp);
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +0000768
769 void convertToSetRegExpObjectLastIndex()
770 {
771 setOp(SetRegExpObjectLastIndex);
772 m_opInfo = false;
773 }
utatane.tea@gmail.com235f2b92018-05-22 04:54:31 +0000774
775 void convertToInById(unsigned identifierNumber)
776 {
777 ASSERT(m_op == InByVal);
778 setOpAndDefaultFlags(InById);
779 children.setChild2(Edge());
780 m_opInfo = identifierNumber;
781 m_opInfo2 = OpInfoWrapper();
782 }
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +0000783
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000784 JSValue asJSValue()
fpizlo@apple.comd93c9ad2011-09-26 02:25:02 +0000785 {
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000786 return constant()->value();
787 }
788
789 bool isInt32Constant()
790 {
791 return isConstant() && constant()->value().isInt32();
792 }
793
794 int32_t asInt32()
795 {
796 return asJSValue().asInt32();
797 }
798
799 uint32_t asUInt32()
800 {
801 return asInt32();
802 }
803
804 bool isDoubleConstant()
805 {
806 return isConstant() && constant()->value().isDouble();
807 }
808
809 bool isNumberConstant()
810 {
811 return isConstant() && constant()->value().isNumber();
fpizlo@apple.com53aa8dc2011-11-15 21:54:38 +0000812 }
813
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000814 double asNumber()
fpizlo@apple.com53aa8dc2011-11-15 21:54:38 +0000815 {
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000816 return asJSValue().asNumber();
fpizlo@apple.comd93c9ad2011-09-26 02:25:02 +0000817 }
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000818
mark.lam@apple.com39e9c982016-04-25 17:48:46 +0000819 bool isAnyIntConstant()
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000820 {
mark.lam@apple.com39e9c982016-04-25 17:48:46 +0000821 return isConstant() && constant()->value().isAnyInt();
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000822 }
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000823
mark.lam@apple.com39e9c982016-04-25 17:48:46 +0000824 int64_t asAnyInt()
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000825 {
mark.lam@apple.com39e9c982016-04-25 17:48:46 +0000826 return asJSValue().asAnyInt();
fpizlo@apple.com0ef13dc2011-09-14 00:37:01 +0000827 }
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000828
829 bool isBooleanConstant()
fpizlo@apple.com0ef13dc2011-09-14 00:37:01 +0000830 {
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000831 return isConstant() && constant()->value().isBoolean();
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000832 }
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000833
834 bool asBoolean()
fpizlo@apple.comf2999932014-07-15 00:41:39 +0000835 {
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000836 return constant()->value().asBoolean();
fpizlo@apple.comf2999932014-07-15 00:41:39 +0000837 }
benjamin@webkit.org32b8d0a2015-08-19 04:09:12 +0000838
839 bool isUndefinedOrNullConstant()
840 {
841 return isConstant() && constant()->value().isUndefinedOrNull();
842 }
843
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000844 bool isCellConstant()
fpizlo@apple.com746c6d072011-09-07 02:47:51 +0000845 {
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +0000846 return isConstant() && constant()->value() && constant()->value().isCell();
fpizlo@apple.com746c6d072011-09-07 02:47:51 +0000847 }
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000848
849 JSCell* asCell()
850 {
851 return constant()->value().asCell();
852 }
853
854 template<typename T>
keith_miller@apple.com45da7602017-01-27 01:47:52 +0000855 T dynamicCastConstant(VM& vm)
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000856 {
857 if (!isCellConstant())
858 return nullptr;
keith_miller@apple.com45da7602017-01-27 01:47:52 +0000859 return jsDynamicCast<T>(vm, asCell());
fpizlo@apple.comb41e6822014-07-25 20:55:17 +0000860 }
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +0000861
862 template<typename T>
keith_miller@apple.com45da7602017-01-27 01:47:52 +0000863 T castConstant(VM& vm)
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +0000864 {
keith_miller@apple.com45da7602017-01-27 01:47:52 +0000865 T result = dynamicCastConstant<T>(vm);
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +0000866 RELEASE_ASSERT(result);
867 return result;
868 }
saambarati1@gmail.com144f17c2015-07-15 21:41:08 +0000869
fpizlo@apple.com024424c2016-03-09 05:16:47 +0000870 bool hasLazyJSValue()
871 {
872 return op() == LazyJSConstant;
873 }
874
875 LazyJSValue lazyJSValue()
876 {
877 ASSERT(hasLazyJSValue());
sbarati@apple.com972e8172016-08-28 23:31:46 +0000878 return *m_opInfo.as<LazyJSValue*>();
fpizlo@apple.com024424c2016-03-09 05:16:47 +0000879 }
880
881 String tryGetString(Graph&);
882
saambarati1@gmail.com144f17c2015-07-15 21:41:08 +0000883 JSValue initializationValueForActivation() const
884 {
885 ASSERT(op() == CreateActivation);
sbarati@apple.com972e8172016-08-28 23:31:46 +0000886 return m_opInfo2.as<FrozenValue*>()->value();
saambarati1@gmail.com144f17c2015-07-15 21:41:08 +0000887 }
keith_miller@apple.come497e202016-06-13 21:05:36 +0000888
889 bool hasArgumentsChild()
890 {
891 switch (op()) {
892 case GetMyArgumentByVal:
893 case GetMyArgumentByValOutOfBounds:
894 case LoadVarargs:
895 case ForwardVarargs:
896 case CallVarargs:
897 case CallForwardVarargs:
898 case ConstructVarargs:
899 case ConstructForwardVarargs:
900 case TailCallVarargs:
901 case TailCallForwardVarargs:
902 case TailCallVarargsInlinedCaller:
903 case TailCallForwardVarargsInlinedCaller:
904 return true;
905 default:
906 return false;
907 }
908 }
909
910 Edge& argumentsChild()
911 {
912 switch (op()) {
913 case GetMyArgumentByVal:
914 case GetMyArgumentByValOutOfBounds:
915 case LoadVarargs:
916 case ForwardVarargs:
917 return child1();
918 case CallVarargs:
919 case CallForwardVarargs:
920 case ConstructVarargs:
921 case ConstructForwardVarargs:
922 case TailCallVarargs:
923 case TailCallForwardVarargs:
924 case TailCallVarargsInlinedCaller:
925 case TailCallForwardVarargsInlinedCaller:
926 return child3();
927 default:
928 RELEASE_ASSERT_NOT_REACHED();
929 return child1();
930 }
931 }
932
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000933 bool containsMovHint()
934 {
935 switch (op()) {
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000936 case MovHint:
fpizlo@apple.com06f82b52013-03-06 02:27:16 +0000937 case ZombieHint:
938 return true;
939 default:
940 return false;
941 }
942 }
943
oliver@apple.com827d2cf2013-07-25 04:04:45 +0000944 bool hasVariableAccessData(Graph&);
msaboff@apple.com7b8706a2016-07-29 22:04:02 +0000945 bool accessesStack(Graph& graph)
fpizlo@apple.comdc4cae72011-09-29 23:17:19 +0000946 {
oliver@apple.com827d2cf2013-07-25 04:04:45 +0000947 return hasVariableAccessData(graph);
barraclough@apple.com2302c042011-03-14 23:31:00 +0000948 }
fpizlo@apple.comdc4cae72011-09-29 23:17:19 +0000949
fpizlo@apple.coma14dfc02014-01-30 23:00:16 +0000950 // This is useful for debugging code, where a node that should have a variable
951 // access data doesn't have one because it hasn't been initialized yet.
952 VariableAccessData* tryGetVariableAccessData()
953 {
sbarati@apple.com972e8172016-08-28 23:31:46 +0000954 VariableAccessData* result = m_opInfo.as<VariableAccessData*>();
fpizlo@apple.coma14dfc02014-01-30 23:00:16 +0000955 if (!result)
956 return 0;
957 return result->find();
958 }
959
fpizlo@apple.comdc4cae72011-09-29 23:17:19 +0000960 VariableAccessData* variableAccessData()
961 {
sbarati@apple.com972e8172016-08-28 23:31:46 +0000962 return m_opInfo.as<VariableAccessData*>()->find();
fpizlo@apple.comdc4cae72011-09-29 23:17:19 +0000963 }
964
barraclough@apple.com5540b562011-04-15 22:30:06 +0000965 VirtualRegister local()
barraclough@apple.com2302c042011-03-14 23:31:00 +0000966 {
fpizlo@apple.comdc4cae72011-09-29 23:17:19 +0000967 return variableAccessData()->local();
barraclough@apple.com2302c042011-03-14 23:31:00 +0000968 }
fpizlo@apple.com31659de2012-02-23 22:51:09 +0000969
fpizlo@apple.coma62d4822013-10-06 04:22:43 +0000970 VirtualRegister machineLocal()
971 {
972 return variableAccessData()->machineLocal();
973 }
974
fpizlo@apple.com532f1e52013-09-04 06:26:04 +0000975 bool hasUnlinkedLocal()
976 {
977 switch (op()) {
fpizlo@apple.com532f1e52013-09-04 06:26:04 +0000978 case ExtractOSREntryLocal:
fpizlo@apple.com9df7fef2013-12-29 21:50:55 +0000979 case MovHint:
980 case ZombieHint:
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +0000981 case KillStack:
fpizlo@apple.com532f1e52013-09-04 06:26:04 +0000982 return true;
983 default:
984 return false;
985 }
986 }
987
fpizlo@apple.com9b928722012-05-24 00:18:55 +0000988 VirtualRegister unlinkedLocal()
989 {
fpizlo@apple.com532f1e52013-09-04 06:26:04 +0000990 ASSERT(hasUnlinkedLocal());
sbarati@apple.com972e8172016-08-28 23:31:46 +0000991 return VirtualRegister(m_opInfo.as<int32_t>());
fpizlo@apple.com9b928722012-05-24 00:18:55 +0000992 }
993
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +0000994 bool hasStackAccessData()
995 {
996 switch (op()) {
997 case PutStack:
998 case GetStack:
999 return true;
1000 default:
1001 return false;
1002 }
1003 }
1004
1005 StackAccessData* stackAccessData()
1006 {
1007 ASSERT(hasStackAccessData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001008 return m_opInfo.as<StackAccessData*>();
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +00001009 }
rmorisset@apple.com22d685e2018-01-23 14:28:10 +00001010
1011 unsigned argumentCountIncludingThis()
1012 {
1013 ASSERT(op() == SetArgumentCountIncludingThis);
1014 return m_opInfo.as<unsigned>();
1015 }
fpizlo@apple.combcfd8eb2015-02-26 19:51:52 +00001016
oliver@apple.com827d2cf2013-07-25 04:04:45 +00001017 bool hasPhi()
1018 {
1019 return op() == Upsilon;
1020 }
1021
1022 Node* phi()
1023 {
1024 ASSERT(hasPhi());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001025 return m_opInfo.as<Node*>();
oliver@apple.com827d2cf2013-07-25 04:04:45 +00001026 }
mhahnenberg@apple.com4968e1a2013-12-18 22:50:40 +00001027
1028 bool isStoreBarrier()
1029 {
fpizlo@apple.com9a175952016-09-28 21:55:53 +00001030 return op() == StoreBarrier || op() == FencedStoreBarrier;
mhahnenberg@apple.com4968e1a2013-12-18 22:50:40 +00001031 }
1032
barraclough@apple.com2302c042011-03-14 23:31:00 +00001033 bool hasIdentifier()
1034 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00001035 switch (op()) {
keith_miller@apple.com7deaba82016-04-10 03:38:44 +00001036 case TryGetById:
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +00001037 case GetById:
fpizlo@apple.comdc03dc52012-01-17 00:53:40 +00001038 case GetByIdFlush:
sbarati@apple.com23315d62016-05-09 20:17:23 +00001039 case GetByIdWithThis:
utatane.tea@gmail.com0e0c28a2018-04-08 16:21:38 +00001040 case GetByIdDirect:
1041 case GetByIdDirectFlush:
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +00001042 case PutById:
oliver@apple.com11ce5ff2014-03-06 21:27:13 +00001043 case PutByIdFlush:
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +00001044 case PutByIdDirect:
sbarati@apple.com23315d62016-05-09 20:17:23 +00001045 case PutByIdWithThis:
utatane.tea@gmail.com287d64c2015-10-27 07:00:57 +00001046 case PutGetterById:
1047 case PutSetterById:
1048 case PutGetterSetterById:
keith_miller@apple.com485f5392016-04-18 20:02:24 +00001049 case DeleteById:
utatane.tea@gmail.com235f2b92018-05-22 04:54:31 +00001050 case InById:
sbarati@apple.come67fd782016-04-19 01:38:30 +00001051 case GetDynamicVar:
1052 case PutDynamicVar:
gskachkov@gmail.com077d7d52017-04-30 08:06:23 +00001053 case ResolveScopeForHoistingFuncDeclInEval:
sbarati@apple.come67fd782016-04-19 01:38:30 +00001054 case ResolveScope:
utatane.tea@gmail.com076aa232017-11-01 17:32:08 +00001055 case ToObject:
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +00001056 return true;
1057 default:
1058 return false;
1059 }
barraclough@apple.com2302c042011-03-14 23:31:00 +00001060 }
1061
1062 unsigned identifierNumber()
1063 {
1064 ASSERT(hasIdentifier());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001065 return m_opInfo.as<unsigned>();
barraclough@apple.com2302c042011-03-14 23:31:00 +00001066 }
utatane.tea@gmail.com287d64c2015-10-27 07:00:57 +00001067
sbarati@apple.come67fd782016-04-19 01:38:30 +00001068 bool hasGetPutInfo()
1069 {
1070 switch (op()) {
1071 case GetDynamicVar:
1072 case PutDynamicVar:
1073 return true;
1074 default:
1075 return false;
1076 }
1077 }
1078
1079 unsigned getPutInfo()
1080 {
1081 ASSERT(hasGetPutInfo());
commit-queue@webkit.org1903c782017-08-23 17:41:48 +00001082 return static_cast<unsigned>(m_opInfo.as<uint64_t>() >> 32);
sbarati@apple.come67fd782016-04-19 01:38:30 +00001083 }
1084
utatane.tea@gmail.com287d64c2015-10-27 07:00:57 +00001085 bool hasAccessorAttributes()
1086 {
1087 switch (op()) {
1088 case PutGetterById:
1089 case PutSetterById:
1090 case PutGetterSetterById:
1091 case PutGetterByVal:
1092 case PutSetterByVal:
1093 return true;
1094 default:
1095 return false;
1096 }
1097 }
1098
1099 int32_t accessorAttributes()
1100 {
1101 ASSERT(hasAccessorAttributes());
1102 switch (op()) {
1103 case PutGetterById:
1104 case PutSetterById:
1105 case PutGetterSetterById:
sbarati@apple.com972e8172016-08-28 23:31:46 +00001106 return m_opInfo2.as<int32_t>();
utatane.tea@gmail.com287d64c2015-10-27 07:00:57 +00001107 case PutGetterByVal:
1108 case PutSetterByVal:
sbarati@apple.com972e8172016-08-28 23:31:46 +00001109 return m_opInfo.as<int32_t>();
utatane.tea@gmail.com287d64c2015-10-27 07:00:57 +00001110 default:
1111 RELEASE_ASSERT_NOT_REACHED();
1112 return 0;
1113 }
1114 }
fpizlo@apple.com6f1a3442011-09-16 06:33:55 +00001115
fpizlo@apple.com8ff74712015-03-17 15:50:44 +00001116 bool hasPromotedLocationDescriptor()
1117 {
1118 return op() == PutHint;
1119 }
1120
1121 PromotedLocationDescriptor promotedLocationDescriptor();
1122
fpizlo@apple.come887adf2011-09-20 20:10:56 +00001123 // This corrects the arithmetic node flags, so that irrelevant bits are
ticaiolima@gmail.com3ac487d2018-12-10 21:11:43 +00001124 // ignored. In particular, anything other than ArithMul or ValueMul does not need
fpizlo@apple.come887adf2011-09-20 20:10:56 +00001125 // to know if it can speculate on negative zero.
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +00001126 NodeFlags arithNodeFlags()
fpizlo@apple.come887adf2011-09-20 20:10:56 +00001127 {
fpizlo@apple.comb4f3cb82013-01-30 21:02:20 +00001128 NodeFlags result = m_flags & NodeArithFlagsMask;
ticaiolima@gmail.com77f17462018-12-13 12:26:01 +00001129 if (op() == ArithMul || op() == ArithDiv || op() == ValueDiv || op() == ArithMod || op() == ArithNegate || op() == ArithPow || op() == ArithRound || op() == ArithFloor || op() == ArithCeil || op() == ArithTrunc || op() == DoubleAsInt32 || op() == ValueNegate || op() == ValueMul || op() == ValueDiv)
fpizlo@apple.come887adf2011-09-20 20:10:56 +00001130 return result;
fpizlo@apple.comdc36e832013-09-11 03:24:09 +00001131 return result & ~NodeBytecodeNeedsNegZero;
fpizlo@apple.come887adf2011-09-20 20:10:56 +00001132 }
mark.lam@apple.comc1a72412016-01-05 23:08:58 +00001133
fpizlo@apple.comacdb63e2016-05-10 02:01:28 +00001134 bool mayHaveNonIntResult()
1135 {
1136 return m_flags & NodeMayHaveNonIntResult;
1137 }
1138
1139 bool mayHaveDoubleResult()
1140 {
1141 return m_flags & NodeMayHaveDoubleResult;
1142 }
1143
ticaiolima@gmail.com843ddd32018-11-08 01:47:27 +00001144 bool mayHaveNonNumericResult()
fpizlo@apple.comacdb63e2016-05-10 02:01:28 +00001145 {
ticaiolima@gmail.com843ddd32018-11-08 01:47:27 +00001146 return m_flags & NodeMayHaveNonNumericResult;
1147 }
1148
1149 bool mayHaveBigIntResult()
1150 {
1151 return m_flags & NodeMayHaveBigIntResult;
fpizlo@apple.comacdb63e2016-05-10 02:01:28 +00001152 }
1153
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001154 bool hasNewArrayBufferData()
fpizlo@apple.com98a693c2011-09-28 05:33:21 +00001155 {
utatane.tea@gmail.comb7113162017-12-18 11:49:33 +00001156 return op() == NewArrayBuffer || op() == PhantomNewArrayBuffer;
fpizlo@apple.com98a693c2011-09-28 05:33:21 +00001157 }
1158
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001159 NewArrayBufferData newArrayBufferData()
fpizlo@apple.com98a693c2011-09-28 05:33:21 +00001160 {
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001161 ASSERT(hasNewArrayBufferData());
1162 return m_opInfo2.asNewArrayBufferData();
fpizlo@apple.com98a693c2011-09-28 05:33:21 +00001163 }
utatane.tea@gmail.comb9355b52017-09-22 12:19:54 +00001164
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001165 unsigned hasVectorLengthHint()
1166 {
utatane.tea@gmail.comf8fde5b2018-03-20 07:58:22 +00001167 switch (op()) {
1168 case NewArray:
1169 case NewArrayBuffer:
1170 case PhantomNewArrayBuffer:
1171 return true;
1172 default:
1173 return false;
1174 }
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001175 }
1176
utatane.tea@gmail.comb9355b52017-09-22 12:19:54 +00001177 unsigned vectorLengthHint()
1178 {
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001179 ASSERT(hasVectorLengthHint());
utatane.tea@gmail.comf8fde5b2018-03-20 07:58:22 +00001180 if (op() == NewArray)
1181 return m_opInfo2.as<unsigned>();
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001182 return newArrayBufferData().vectorLengthHint;
utatane.tea@gmail.comb9355b52017-09-22 12:19:54 +00001183 }
fpizlo@apple.com98a693c2011-09-28 05:33:21 +00001184
fpizlo@apple.com75c91a72012-11-08 22:28:25 +00001185 bool hasIndexingType()
1186 {
1187 switch (op()) {
1188 case NewArray:
1189 case NewArrayWithSize:
1190 case NewArrayBuffer:
utatane.tea@gmail.comb7113162017-12-18 11:49:33 +00001191 case PhantomNewArrayBuffer:
fpizlo@apple.com75c91a72012-11-08 22:28:25 +00001192 return true;
1193 default:
1194 return false;
1195 }
1196 }
fpizlo@apple.com35398ea2015-12-04 22:25:26 +00001197
sbarati@apple.com99ed4792016-11-12 02:58:11 +00001198 BitVector* bitVector()
1199 {
sbarati@apple.come20444a2016-11-30 06:24:44 +00001200 ASSERT(op() == NewArrayWithSpread || op() == PhantomNewArrayWithSpread);
sbarati@apple.com99ed4792016-11-12 02:58:11 +00001201 return m_opInfo.as<BitVector*>();
1202 }
1203
fpizlo@apple.com35398ea2015-12-04 22:25:26 +00001204 // Return the indexing type that an array allocation *wants* to use. It may end up using a different
1205 // type if we're having a bad time. You can determine the actual indexing type by asking the global
1206 // object:
1207 //
1208 // m_graph.globalObjectFor(node->origin.semantic)->arrayStructureForIndexingTypeDuringAllocation(node->indexingType())
1209 //
1210 // This will give you a Structure*, and that will have some indexing type that may be different from
1211 // the this one.
fpizlo@apple.com75c91a72012-11-08 22:28:25 +00001212 IndexingType indexingType()
1213 {
1214 ASSERT(hasIndexingType());
utatane.tea@gmail.comb7113162017-12-18 11:49:33 +00001215 if (op() == NewArrayBuffer || op() == PhantomNewArrayBuffer)
keith_miller@apple.comc02f5d32018-05-22 18:04:31 +00001216 return static_cast<IndexingType>(newArrayBufferData().indexingMode) & IndexingTypeMask;
1217 return static_cast<IndexingType>(m_opInfo.as<uint32_t>());
1218 }
1219
1220 IndexingType indexingMode()
1221 {
1222 ASSERT(hasIndexingType());
1223 if (op() == NewArrayBuffer || op() == PhantomNewArrayBuffer)
1224 return static_cast<IndexingType>(newArrayBufferData().indexingMode);
sbarati@apple.com972e8172016-08-28 23:31:46 +00001225 return static_cast<IndexingType>(m_opInfo.as<uint32_t>());
fpizlo@apple.com75c91a72012-11-08 22:28:25 +00001226 }
1227
fpizlo@apple.com372fa822013-08-21 19:43:47 +00001228 bool hasTypedArrayType()
1229 {
1230 switch (op()) {
1231 case NewTypedArray:
1232 return true;
1233 default:
1234 return false;
1235 }
1236 }
1237
1238 TypedArrayType typedArrayType()
1239 {
1240 ASSERT(hasTypedArrayType());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001241 TypedArrayType result = static_cast<TypedArrayType>(m_opInfo.as<uint32_t>());
fpizlo@apple.com372fa822013-08-21 19:43:47 +00001242 ASSERT(isTypedView(result));
1243 return result;
1244 }
1245
ggaren@apple.comc862eac2013-01-29 05:48:01 +00001246 bool hasInlineCapacity()
1247 {
1248 return op() == CreateThis;
1249 }
1250
1251 unsigned inlineCapacity()
1252 {
1253 ASSERT(hasInlineCapacity());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001254 return m_opInfo.as<unsigned>();
ggaren@apple.comc862eac2013-01-29 05:48:01 +00001255 }
1256
fpizlo@apple.com75c91a72012-11-08 22:28:25 +00001257 void setIndexingType(IndexingType indexingType)
1258 {
1259 ASSERT(hasIndexingType());
1260 m_opInfo = indexingType;
1261 }
1262
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001263 bool hasScopeOffset()
barraclough@apple.com2302c042011-03-14 23:31:00 +00001264 {
oliver@apple.com58c86752013-07-25 04:02:40 +00001265 return op() == GetClosureVar || op() == PutClosureVar;
barraclough@apple.com2302c042011-03-14 23:31:00 +00001266 }
1267
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001268 ScopeOffset scopeOffset()
barraclough@apple.com2302c042011-03-14 23:31:00 +00001269 {
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001270 ASSERT(hasScopeOffset());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001271 return ScopeOffset(m_opInfo.as<uint32_t>());
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001272 }
1273
1274 bool hasDirectArgumentsOffset()
1275 {
1276 return op() == GetFromArguments || op() == PutToArguments;
1277 }
1278
1279 DirectArgumentsOffset capturedArgumentsOffset()
1280 {
1281 ASSERT(hasDirectArgumentsOffset());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001282 return DirectArgumentsOffset(m_opInfo.as<uint32_t>());
barraclough@apple.com2302c042011-03-14 23:31:00 +00001283 }
fpizlo@apple.com26af9b62012-06-07 00:49:34 +00001284
1285 bool hasRegisterPointer()
1286 {
saambarati1@gmail.com060e7512015-09-03 19:45:44 +00001287 return op() == GetGlobalVar || op() == GetGlobalLexicalVariable || op() == PutGlobalVariable;
fpizlo@apple.com26af9b62012-06-07 00:49:34 +00001288 }
1289
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001290 WriteBarrier<Unknown>* variablePointer()
fpizlo@apple.com26af9b62012-06-07 00:49:34 +00001291 {
sbarati@apple.com972e8172016-08-28 23:31:46 +00001292 return m_opInfo.as<WriteBarrier<Unknown>*>();
fpizlo@apple.com26af9b62012-06-07 00:49:34 +00001293 }
fpizlo@apple.com1a724092013-11-28 07:10:10 +00001294
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001295 bool hasCallVarargsData()
1296 {
1297 switch (op()) {
1298 case CallVarargs:
1299 case CallForwardVarargs:
msaboff@apple.coma3dc7532015-09-24 21:42:59 +00001300 case TailCallVarargs:
1301 case TailCallForwardVarargs:
1302 case TailCallVarargsInlinedCaller:
1303 case TailCallForwardVarargsInlinedCaller:
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001304 case ConstructVarargs:
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001305 case ConstructForwardVarargs:
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001306 return true;
1307 default:
1308 return false;
1309 }
1310 }
1311
1312 CallVarargsData* callVarargsData()
1313 {
1314 ASSERT(hasCallVarargsData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001315 return m_opInfo.as<CallVarargsData*>();
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001316 }
1317
1318 bool hasLoadVarargsData()
1319 {
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001320 return op() == LoadVarargs || op() == ForwardVarargs;
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001321 }
1322
1323 LoadVarargsData* loadVarargsData()
1324 {
1325 ASSERT(hasLoadVarargsData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001326 return m_opInfo.as<LoadVarargsData*>();
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001327 }
utatane.tea@gmail.com4a748b12016-09-17 06:32:50 +00001328
sbarati@apple.com5607aa92018-02-21 06:56:11 +00001329 InlineCallFrame* argumentsInlineCallFrame()
1330 {
1331 ASSERT(op() == GetArgumentCountIncludingThis);
1332 return m_opInfo.as<InlineCallFrame*>();
1333 }
1334
utatane.tea@gmail.com4a748b12016-09-17 06:32:50 +00001335 bool hasQueriedType()
1336 {
1337 return op() == IsCellWithType;
1338 }
1339
1340 JSType queriedType()
1341 {
1342 static_assert(std::is_same<uint8_t, std::underlying_type<JSType>::type>::value, "Ensure that uint8_t is the underlying type for JSType.");
1343 return static_cast<JSType>(m_opInfo.as<uint32_t>());
1344 }
1345
1346 bool hasSpeculatedTypeForQuery()
1347 {
1348 return op() == IsCellWithType;
1349 }
1350
1351 SpeculatedType speculatedTypeForQuery()
1352 {
utatane.tea@gmail.com3634afe2016-09-19 17:00:25 +00001353 return speculationFromJSType(queriedType());
utatane.tea@gmail.com4a748b12016-09-17 06:32:50 +00001354 }
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001355
barraclough@apple.comde174fb2011-04-22 20:38:27 +00001356 bool hasResult()
1357 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001358 return !!result();
barraclough@apple.comde174fb2011-04-22 20:38:27 +00001359 }
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001360
ticaiolima@gmail.comaf933862019-01-15 10:14:31 +00001361 bool hasInt32Result()
1362 {
1363 return result() == NodeResultInt32;
1364 }
1365
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001366 bool hasInt52Result()
1367 {
1368 return result() == NodeResultInt52;
barraclough@apple.com2302c042011-03-14 23:31:00 +00001369 }
fpizlo@apple.com0ef13dc2011-09-14 00:37:01 +00001370
1371 bool hasNumberResult()
barraclough@apple.com2302c042011-03-14 23:31:00 +00001372 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001373 return result() == NodeResultNumber;
1374 }
ticaiolima@gmail.comaf933862019-01-15 10:14:31 +00001375
1376 bool hasNumberOrAnyIntResult()
1377 {
1378 return hasNumberResult() || hasInt32Result() || hasInt52Result();
1379 }
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001380
ticaiolima@gmail.com3ac487d2018-12-10 21:11:43 +00001381 bool hasNumericResult()
1382 {
1383 switch (op()) {
1384 case ValueSub:
1385 case ValueMul:
1386 case ValueBitAnd:
1387 case ValueBitOr:
1388 case ValueBitXor:
1389 case ValueNegate:
1390 return true;
1391 default:
1392 return false;
1393 }
1394 }
1395
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001396 bool hasDoubleResult()
1397 {
1398 return result() == NodeResultDouble;
barraclough@apple.com2302c042011-03-14 23:31:00 +00001399 }
fpizlo@apple.com0ef13dc2011-09-14 00:37:01 +00001400
barraclough@apple.com2302c042011-03-14 23:31:00 +00001401 bool hasJSResult()
1402 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001403 return result() == NodeResultJS;
barraclough@apple.com2302c042011-03-14 23:31:00 +00001404 }
fpizlo@apple.com746c6d072011-09-07 02:47:51 +00001405
1406 bool hasBooleanResult()
1407 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001408 return result() == NodeResultBoolean;
fpizlo@apple.com746c6d072011-09-07 02:47:51 +00001409 }
barraclough@apple.com2302c042011-03-14 23:31:00 +00001410
fpizlo@apple.comc2c67632012-11-17 08:37:14 +00001411 bool hasStorageResult()
1412 {
fpizlo@apple.com7b33e0c2014-04-15 20:26:16 +00001413 return result() == NodeResultStorage;
1414 }
1415
1416 UseKind defaultUseKind()
1417 {
1418 return useKindForResult(result());
1419 }
1420
1421 Edge defaultEdge()
1422 {
1423 return Edge(this, defaultUseKind());
fpizlo@apple.comc2c67632012-11-17 08:37:14 +00001424 }
1425
barraclough@apple.come23e0402011-04-15 23:02:09 +00001426 bool isJump()
1427 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00001428 return op() == Jump;
barraclough@apple.come23e0402011-04-15 23:02:09 +00001429 }
1430
1431 bool isBranch()
1432 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00001433 return op() == Branch;
barraclough@apple.come23e0402011-04-15 23:02:09 +00001434 }
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001435
sbarati@apple.com60a3be72017-08-25 18:26:15 +00001436 bool isSwitch() const
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001437 {
1438 return op() == Switch;
1439 }
barraclough@apple.come23e0402011-04-15 23:02:09 +00001440
sbarati@apple.com8bd925d2017-09-05 03:21:33 +00001441 bool isEntrySwitch() const
1442 {
1443 return op() == EntrySwitch;
1444 }
1445
barraclough@apple.comb6de6912011-04-22 21:33:36 +00001446 bool isTerminal()
1447 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00001448 switch (op()) {
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +00001449 case Jump:
1450 case Branch:
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001451 case Switch:
sbarati@apple.com8bd925d2017-09-05 03:21:33 +00001452 case EntrySwitch:
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +00001453 case Return:
msaboff@apple.coma3dc7532015-09-24 21:42:59 +00001454 case TailCall:
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +00001455 case DirectTailCall:
msaboff@apple.coma3dc7532015-09-24 21:42:59 +00001456 case TailCallVarargs:
1457 case TailCallForwardVarargs:
oliver@apple.com1fc04182013-08-19 19:40:13 +00001458 case Unreachable:
sbarati@apple.comc1f73c32017-09-01 05:41:08 +00001459 case Throw:
1460 case ThrowStaticError:
fpizlo@apple.comc35b8f72012-03-12 09:50:38 +00001461 return true;
1462 default:
1463 return false;
1464 }
barraclough@apple.comb6de6912011-04-22 21:33:36 +00001465 }
1466
msaboff@apple.comcdd479b2015-09-30 22:28:08 +00001467 bool isFunctionTerminal()
1468 {
1469 if (isTerminal() && !numSuccessors())
1470 return true;
1471
1472 return false;
1473 }
1474
utatane.tea@gmail.comdd7967b2017-07-21 16:01:01 +00001475 // As is described in DFGNodeType.h's ForceOSRExit, this is a pseudo-terminal.
1476 // It means that execution should fall out of DFG at this point, but execution
1477 // does continue in the basic block - just in a different compiler.
1478 // FIXME: This is used for lightweight reachability decision. But this should
1479 // be replaced with AI-based reachability ideally.
1480 bool isPseudoTerminal()
1481 {
1482 switch (op()) {
1483 case ForceOSRExit:
1484 case CheckBadCell:
utatane.tea@gmail.comdd7967b2017-07-21 16:01:01 +00001485 return true;
1486 default:
1487 return false;
1488 }
1489 }
1490
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001491 unsigned targetBytecodeOffsetDuringParsing()
barraclough@apple.come23e0402011-04-15 23:02:09 +00001492 {
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001493 ASSERT(isJump());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001494 return m_opInfo.as<unsigned>();
barraclough@apple.come23e0402011-04-15 23:02:09 +00001495 }
1496
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001497 BasicBlock*& targetBlock()
fpizlo@apple.com4ffd3952011-10-12 02:05:53 +00001498 {
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001499 ASSERT(isJump());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001500 return *bitwise_cast<BasicBlock**>(&m_opInfo.u.pointer);
fpizlo@apple.com4ffd3952011-10-12 02:05:53 +00001501 }
1502
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001503 BranchData* branchData()
barraclough@apple.come23e0402011-04-15 23:02:09 +00001504 {
1505 ASSERT(isBranch());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001506 return m_opInfo.as<BranchData*>();
barraclough@apple.come23e0402011-04-15 23:02:09 +00001507 }
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001508
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001509 SwitchData* switchData()
1510 {
1511 ASSERT(isSwitch());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001512 return m_opInfo.as<SwitchData*>();
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001513 }
sbarati@apple.com8bd925d2017-09-05 03:21:33 +00001514
1515 EntrySwitchData* entrySwitchData()
1516 {
1517 ASSERT(isEntrySwitch());
1518 return m_opInfo.as<EntrySwitchData*>();
1519 }
sbarati@apple.comcf743d3e2017-11-16 23:44:12 +00001520
1521 Intrinsic intrinsic()
1522 {
1523 RELEASE_ASSERT(op() == CPUIntrinsic);
1524 return m_opInfo.as<Intrinsic>();
1525 }
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001526
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001527 unsigned numSuccessors()
1528 {
1529 switch (op()) {
1530 case Jump:
1531 return 1;
1532 case Branch:
1533 return 2;
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001534 case Switch:
1535 return switchData()->cases.size() + 1;
sbarati@apple.com8bd925d2017-09-05 03:21:33 +00001536 case EntrySwitch:
1537 return entrySwitchData()->cases.size();
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001538 default:
1539 return 0;
1540 }
1541 }
1542
oliver@apple.com827d2cf2013-07-25 04:04:45 +00001543 BasicBlock*& successor(unsigned index)
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001544 {
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001545 if (isSwitch()) {
1546 if (index < switchData()->cases.size())
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001547 return switchData()->cases[index].target.block;
oliver@apple.com9b7647b2013-07-25 04:03:00 +00001548 RELEASE_ASSERT(index == switchData()->cases.size());
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001549 return switchData()->fallThrough.block;
sbarati@apple.com8bd925d2017-09-05 03:21:33 +00001550 } else if (isEntrySwitch())
1551 return entrySwitchData()->cases[index];
sbarati@apple.com60a3be72017-08-25 18:26:15 +00001552
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001553 switch (index) {
1554 case 0:
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001555 if (isJump())
1556 return targetBlock();
1557 return branchData()->taken.block;
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001558 case 1:
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001559 return branchData()->notTaken.block;
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001560 default:
oliver@apple.com5598c182013-01-23 22:25:07 +00001561 RELEASE_ASSERT_NOT_REACHED();
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001562 return targetBlock();
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001563 }
1564 }
1565
fpizlo@apple.com6a8daef2015-04-22 03:38:17 +00001566 class SuccessorsIterable {
1567 public:
1568 SuccessorsIterable()
1569 : m_terminal(nullptr)
1570 {
1571 }
1572
1573 SuccessorsIterable(Node* terminal)
1574 : m_terminal(terminal)
1575 {
1576 }
1577
1578 class iterator {
1579 public:
1580 iterator()
1581 : m_terminal(nullptr)
1582 , m_index(UINT_MAX)
1583 {
1584 }
1585
1586 iterator(Node* terminal, unsigned index)
1587 : m_terminal(terminal)
1588 , m_index(index)
1589 {
1590 }
1591
1592 BasicBlock* operator*()
1593 {
1594 return m_terminal->successor(m_index);
1595 }
1596
1597 iterator& operator++()
1598 {
1599 m_index++;
1600 return *this;
1601 }
1602
1603 bool operator==(const iterator& other) const
1604 {
1605 return m_index == other.m_index;
1606 }
1607
1608 bool operator!=(const iterator& other) const
1609 {
1610 return !(*this == other);
1611 }
1612 private:
1613 Node* m_terminal;
1614 unsigned m_index;
1615 };
1616
1617 iterator begin()
1618 {
1619 return iterator(m_terminal, 0);
1620 }
1621
1622 iterator end()
1623 {
1624 return iterator(m_terminal, m_terminal->numSuccessors());
1625 }
fpizlo@apple.com92dbc1f2015-11-02 00:48:03 +00001626
1627 size_t size() const { return m_terminal->numSuccessors(); }
1628 BasicBlock* at(size_t index) const { return m_terminal->successor(index); }
1629 BasicBlock* operator[](size_t index) const { return at(index); }
fpizlo@apple.com6a8daef2015-04-22 03:38:17 +00001630
1631 private:
1632 Node* m_terminal;
1633 };
1634
1635 SuccessorsIterable successors()
1636 {
1637 return SuccessorsIterable(this);
1638 }
1639
oliver@apple.com827d2cf2013-07-25 04:04:45 +00001640 BasicBlock*& successorForCondition(bool condition)
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001641 {
fpizlo@apple.comb8377cd2014-02-20 08:00:28 +00001642 return branchData()->forCondition(condition);
fpizlo@apple.com79c51ee2012-05-18 22:30:24 +00001643 }
1644
fpizlo@apple.comd30b1202011-10-04 01:05:38 +00001645 bool hasHeapPrediction()
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001646 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00001647 switch (op()) {
commit-queue@webkit.org0ec71072016-08-29 07:21:04 +00001648 case ArithAbs:
benjamin@webkit.orgcb584082015-05-08 00:23:32 +00001649 case ArithRound:
utatane.tea@gmail.com9971c632016-03-01 02:30:46 +00001650 case ArithFloor:
1651 case ArithCeil:
utatane.tea@gmail.com9b9f43e2016-04-03 08:37:26 +00001652 case ArithTrunc:
fpizlo@apple.coma398a562014-08-06 21:32:55 +00001653 case GetDirectPname:
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001654 case GetById:
fpizlo@apple.comdc03dc52012-01-17 00:53:40 +00001655 case GetByIdFlush:
commit-queue@webkit.org076eda02016-09-01 22:08:22 +00001656 case GetByIdWithThis:
utatane.tea@gmail.com0e0c28a2018-04-08 16:21:38 +00001657 case GetByIdDirect:
1658 case GetByIdDirectFlush:
utatane.tea@gmail.com34e35e82017-10-18 07:12:53 +00001659 case GetPrototypeOf:
commit-queue@webkit.org0f030de2016-08-25 22:11:59 +00001660 case TryGetById:
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001661 case GetByVal:
commit-queue@webkit.org076eda02016-09-01 22:08:22 +00001662 case GetByValWithThis:
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001663 case Call:
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +00001664 case DirectCall:
msaboff@apple.coma3dc7532015-09-24 21:42:59 +00001665 case TailCallInlinedCaller:
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +00001666 case DirectTailCallInlinedCaller:
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001667 case Construct:
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +00001668 case DirectConstruct:
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001669 case CallVarargs:
fpizlo@apple.com48bf58d2016-07-18 19:32:34 +00001670 case CallEval:
msaboff@apple.coma3dc7532015-09-24 21:42:59 +00001671 case TailCallVarargsInlinedCaller:
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00001672 case ConstructVarargs:
1673 case CallForwardVarargs:
msaboff@apple.coma3dc7532015-09-24 21:42:59 +00001674 case TailCallForwardVarargsInlinedCaller:
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001675 case GetByOffset:
fpizlo@apple.com51614cc2014-02-17 06:35:32 +00001676 case MultiGetByOffset:
oliver@apple.com58c86752013-07-25 04:02:40 +00001677 case GetClosureVar:
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001678 case GetFromArguments:
utatane.tea@gmail.combebf7852016-11-10 06:34:05 +00001679 case GetArgument:
fpizlo@apple.com24d24e52011-10-04 02:55:54 +00001680 case ArrayPop:
1681 case ArrayPush:
barraclough@apple.com077fdd42012-03-18 01:08:16 +00001682 case RegExpExec:
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +00001683 case RegExpExecNonGlobalOrSticky:
barraclough@apple.com077fdd42012-03-18 01:08:16 +00001684 case RegExpTest:
utatane.tea@gmail.comca7db112018-01-11 14:20:40 +00001685 case RegExpMatchFast:
utatane.tea@gmail.com0e2e31c2018-03-11 07:20:29 +00001686 case RegExpMatchFastGlobal:
fpizlo@apple.come9915ef2012-04-11 20:51:21 +00001687 case GetGlobalVar:
saambarati1@gmail.com060e7512015-09-03 19:45:44 +00001688 case GetGlobalLexicalVariable:
fpizlo@apple.come799b862016-03-01 21:18:42 +00001689 case StringReplace:
msaboff@apple.com69940442016-04-27 01:28:03 +00001690 case StringReplaceRegExp:
utatane.tea@gmail.comdb32c542016-06-30 15:26:47 +00001691 case ToNumber:
utatane.tea@gmail.com076aa232017-11-01 17:32:08 +00001692 case ToObject:
ticaiolima@gmail.comaf933862019-01-15 10:14:31 +00001693 case ValueBitAnd:
1694 case ValueBitOr:
1695 case ValueBitXor:
ticaiolima@gmail.com41b3fb72019-03-11 17:21:41 +00001696 case ValueBitNot:
utatane.tea@gmail.com076aa232017-11-01 17:32:08 +00001697 case CallObjectConstructor:
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +00001698 case LoadKeyFromMapBucket:
1699 case LoadValueFromMapBucket:
utatane.tea@gmail.comc9d8f862016-10-28 22:57:10 +00001700 case CallDOMGetter:
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +00001701 case CallDOM:
sbarati@apple.com0c3eb932017-02-24 04:07:30 +00001702 case ParseInt:
fpizlo@apple.com2fca8772017-04-20 17:55:44 +00001703 case AtomicsAdd:
1704 case AtomicsAnd:
1705 case AtomicsCompareExchange:
1706 case AtomicsExchange:
1707 case AtomicsLoad:
1708 case AtomicsOr:
1709 case AtomicsStore:
1710 case AtomicsSub:
1711 case AtomicsXor:
commit-queue@webkit.org1903c782017-08-23 17:41:48 +00001712 case GetDynamicVar:
utatane.tea@gmail.com6903ef32017-12-13 02:49:00 +00001713 case ExtractValueFromWeakMapGet:
sbarati@apple.com7ccca612018-01-05 05:12:51 +00001714 case ToThis:
sbarati@apple.com1c010822018-08-21 06:05:21 +00001715 case DataViewGetInt:
1716 case DataViewGetFloat:
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001717 return true;
1718 default:
1719 return false;
1720 }
1721 }
1722
fpizlo@apple.com62336162012-06-07 01:35:59 +00001723 SpeculatedType getHeapPrediction()
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001724 {
fpizlo@apple.comd30b1202011-10-04 01:05:38 +00001725 ASSERT(hasHeapPrediction());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001726 return m_opInfo2.as<SpeculatedType>();
fpizlo@apple.com7ab54822011-08-10 00:51:11 +00001727 }
benjamin@webkit.org902574f2015-02-24 03:32:03 +00001728
fpizlo@apple.com884300d2014-05-21 03:49:16 +00001729 void setHeapPrediction(SpeculatedType prediction)
1730 {
1731 ASSERT(hasHeapPrediction());
1732 m_opInfo2 = prediction;
1733 }
keith_miller@apple.com591a67d2017-08-15 04:18:56 +00001734
1735 SpeculatedType getForcedPrediction()
1736 {
1737 ASSERT(op() == IdentityWithProfile);
1738 return m_opInfo.as<SpeculatedType>();
1739 }
sbarati@apple.com60a3be72017-08-25 18:26:15 +00001740
1741 uint32_t catchOSREntryIndex() const
1742 {
1743 ASSERT(op() == ExtractCatchLocal);
1744 return m_opInfo.as<uint32_t>();
1745 }
1746
1747 SpeculatedType catchLocalPrediction()
1748 {
1749 ASSERT(op() == ExtractCatchLocal);
1750 return m_opInfo2.as<SpeculatedType>();
1751 }
fpizlo@apple.com884300d2014-05-21 03:49:16 +00001752
fpizlo@apple.com29abafe2014-08-28 19:09:48 +00001753 bool hasCellOperand()
fpizlo@apple.comff27eed2014-07-23 04:33:37 +00001754 {
1755 switch (op()) {
fpizlo@apple.com29abafe2014-08-28 19:09:48 +00001756 case CheckCell:
keith_miller@apple.comcb11fe42015-12-18 00:37:35 +00001757 case OverridesHasInstance:
fpizlo@apple.com96c1c4b2015-03-04 06:55:52 +00001758 case NewFunction:
utatane.tea@gmail.com9d9fd322015-12-17 10:33:08 +00001759 case NewGeneratorFunction:
caitp@igalia.com8bc562d2016-11-14 21:14:15 +00001760 case NewAsyncFunction:
gskachkov@gmail.comab749fd2017-08-23 17:05:33 +00001761 case NewAsyncGeneratorFunction:
saambarati1@gmail.com402b5852015-05-22 02:39:25 +00001762 case CreateActivation:
1763 case MaterializeCreateActivation:
commit-queue@webkit.orgdb1a6422016-08-25 07:04:00 +00001764 case NewRegexp:
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00001765 case NewArrayBuffer:
utatane.tea@gmail.comb7113162017-12-18 11:49:33 +00001766 case PhantomNewArrayBuffer:
fpizlo@apple.com4077f612016-07-18 19:12:57 +00001767 case CompareEqPtr:
utatane.tea@gmail.com076aa232017-11-01 17:32:08 +00001768 case CallObjectConstructor:
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +00001769 case DirectCall:
1770 case DirectTailCall:
1771 case DirectConstruct:
1772 case DirectTailCallInlinedCaller:
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +00001773 case RegExpExecNonGlobalOrSticky:
utatane.tea@gmail.com0e2e31c2018-03-11 07:20:29 +00001774 case RegExpMatchFastGlobal:
commit-queue@webkit.org195653002014-08-26 16:46:10 +00001775 return true;
1776 default:
1777 return false;
1778 }
1779 }
1780
fpizlo@apple.com29abafe2014-08-28 19:09:48 +00001781 FrozenValue* cellOperand()
commit-queue@webkit.org195653002014-08-26 16:46:10 +00001782 {
fpizlo@apple.com29abafe2014-08-28 19:09:48 +00001783 ASSERT(hasCellOperand());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001784 return m_opInfo.as<FrozenValue*>();
oliver@apple.com1386ec92011-10-07 18:39:45 +00001785 }
fpizlo@apple.com5e2296a2013-01-07 02:24:58 +00001786
fpizlo@apple.com96c1c4b2015-03-04 06:55:52 +00001787 template<typename T>
1788 T castOperand()
1789 {
1790 return cellOperand()->cast<T>();
1791 }
1792
fpizlo@apple.com29abafe2014-08-28 19:09:48 +00001793 void setCellOperand(FrozenValue* value)
fpizlo@apple.com5e2296a2013-01-07 02:24:58 +00001794 {
fpizlo@apple.com29abafe2014-08-28 19:09:48 +00001795 ASSERT(hasCellOperand());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001796 m_opInfo = value;
fpizlo@apple.com5e2296a2013-01-07 02:24:58 +00001797 }
fpizlo@apple.com86468342013-11-27 02:47:43 +00001798
fpizlo@apple.com3a2fa4c2015-04-13 22:13:12 +00001799 bool hasWatchpointSet()
fpizlo@apple.com86468342013-11-27 02:47:43 +00001800 {
fpizlo@apple.com90640ab2015-03-04 05:26:54 +00001801 return op() == NotifyWrite;
fpizlo@apple.com86468342013-11-27 02:47:43 +00001802 }
1803
fpizlo@apple.com3a2fa4c2015-04-13 22:13:12 +00001804 WatchpointSet* watchpointSet()
fpizlo@apple.com86468342013-11-27 02:47:43 +00001805 {
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00001806 ASSERT(hasWatchpointSet());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001807 return m_opInfo.as<WatchpointSet*>();
fpizlo@apple.com86468342013-11-27 02:47:43 +00001808 }
fpizlo@apple.comce995b22013-12-08 19:01:17 +00001809
fpizlo@apple.com9ca951e2013-12-09 01:08:53 +00001810 bool hasStoragePointer()
1811 {
1812 return op() == ConstantStoragePointer;
1813 }
1814
1815 void* storagePointer()
1816 {
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00001817 ASSERT(hasStoragePointer());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001818 return m_opInfo.as<void*>();
fpizlo@apple.com9ca951e2013-12-09 01:08:53 +00001819 }
oliver@apple.com1386ec92011-10-07 18:39:45 +00001820
utatane.tea@gmail.comfccd1362015-08-11 22:02:09 +00001821 bool hasUidOperand()
1822 {
utatane.tea@gmail.com7f364f22016-07-29 07:15:01 +00001823 return op() == CheckStringIdent;
utatane.tea@gmail.comfccd1362015-08-11 22:02:09 +00001824 }
1825
1826 UniquedStringImpl* uidOperand()
1827 {
1828 ASSERT(hasUidOperand());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001829 return m_opInfo.as<UniquedStringImpl*>();
utatane.tea@gmail.comfccd1362015-08-11 22:02:09 +00001830 }
1831
keith_miller@apple.comcb11fe42015-12-18 00:37:35 +00001832 bool hasTypeInfoOperand()
1833 {
1834 return op() == CheckTypeInfoFlags;
1835 }
1836
1837 unsigned typeInfoOperand()
1838 {
sbarati@apple.com972e8172016-08-28 23:31:46 +00001839 ASSERT(hasTypeInfoOperand() && m_opInfo.as<uint32_t>() <= static_cast<uint32_t>(UCHAR_MAX));
1840 return m_opInfo.as<uint32_t>();
keith_miller@apple.comcb11fe42015-12-18 00:37:35 +00001841 }
1842
fpizlo@apple.com0728b8a2014-07-23 01:19:50 +00001843 bool hasTransition()
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001844 {
fpizlo@apple.com1ffdcff2012-07-19 00:30:34 +00001845 switch (op()) {
1846 case PutStructure:
fpizlo@apple.com1ffdcff2012-07-19 00:30:34 +00001847 case AllocatePropertyStorage:
1848 case ReallocatePropertyStorage:
1849 return true;
1850 default:
1851 return false;
1852 }
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001853 }
1854
fpizlo@apple.com0728b8a2014-07-23 01:19:50 +00001855 Transition* transition()
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001856 {
fpizlo@apple.com0728b8a2014-07-23 01:19:50 +00001857 ASSERT(hasTransition());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001858 return m_opInfo.as<Transition*>();
fpizlo@apple.com752f7d92011-10-03 19:25:16 +00001859 }
1860
1861 bool hasStructureSet()
1862 {
fpizlo@apple.comcaa68812012-08-02 04:32:30 +00001863 switch (op()) {
1864 case CheckStructure:
sbarati@apple.com640c1072017-09-05 04:10:53 +00001865 case CheckStructureOrEmpty:
basile_clement@apple.come91b66f2015-05-04 18:37:58 +00001866 case CheckStructureImmediate:
basile_clement@apple.comd7930292015-07-13 23:27:30 +00001867 case MaterializeNewObject:
fpizlo@apple.comcaa68812012-08-02 04:32:30 +00001868 return true;
1869 default:
1870 return false;
1871 }
fpizlo@apple.com752f7d92011-10-03 19:25:16 +00001872 }
1873
sbarati@apple.com239d20b2017-01-26 23:50:58 +00001874 const RegisteredStructureSet& structureSet()
fpizlo@apple.com752f7d92011-10-03 19:25:16 +00001875 {
1876 ASSERT(hasStructureSet());
sbarati@apple.com239d20b2017-01-26 23:50:58 +00001877 return *m_opInfo.as<RegisteredStructureSet*>();
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001878 }
1879
fpizlo@apple.com04e41152012-06-15 22:14:53 +00001880 bool hasStructure()
1881 {
fpizlo@apple.comeb3323d2012-08-20 06:11:24 +00001882 switch (op()) {
fpizlo@apple.com99f37622012-10-29 04:02:08 +00001883 case ArrayifyToStructure:
fpizlo@apple.comf5db15e2012-11-14 07:22:57 +00001884 case NewObject:
fpizlo@apple.com0e6e1542013-03-18 18:09:22 +00001885 case NewStringObject:
fpizlo@apple.comeb3323d2012-08-20 06:11:24 +00001886 return true;
1887 default:
1888 return false;
1889 }
fpizlo@apple.com04e41152012-06-15 22:14:53 +00001890 }
1891
sbarati@apple.com239d20b2017-01-26 23:50:58 +00001892 RegisteredStructure structure()
fpizlo@apple.com04e41152012-06-15 22:14:53 +00001893 {
1894 ASSERT(hasStructure());
sbarati@apple.com239d20b2017-01-26 23:50:58 +00001895 return m_opInfo.asRegisteredStructure();
fpizlo@apple.com04e41152012-06-15 22:14:53 +00001896 }
1897
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001898 bool hasStorageAccessData()
1899 {
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +00001900 switch (op()) {
1901 case GetByOffset:
1902 case PutByOffset:
1903 case GetGetterSetterByOffset:
1904 return true;
1905 default:
1906 return false;
1907 }
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001908 }
1909
fpizlo@apple.com9800ede2014-09-20 17:59:58 +00001910 StorageAccessData& storageAccessData()
fpizlo@apple.comffb7d5e2011-09-20 09:41:16 +00001911 {
fpizlo@apple.com17da7f32012-02-25 23:05:38 +00001912 ASSERT(hasStorageAccessData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001913 return *m_opInfo.as<StorageAccessData*>();
fpizlo@apple.com17da7f32012-02-25 23:05:38 +00001914 }
1915
fpizlo@apple.com51614cc2014-02-17 06:35:32 +00001916 bool hasMultiGetByOffsetData()
1917 {
1918 return op() == MultiGetByOffset;
1919 }
1920
1921 MultiGetByOffsetData& multiGetByOffsetData()
1922 {
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00001923 ASSERT(hasMultiGetByOffsetData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001924 return *m_opInfo.as<MultiGetByOffsetData*>();
fpizlo@apple.com51614cc2014-02-17 06:35:32 +00001925 }
1926
fpizlo@apple.com43219522014-02-25 02:02:50 +00001927 bool hasMultiPutByOffsetData()
1928 {
1929 return op() == MultiPutByOffset;
1930 }
1931
1932 MultiPutByOffsetData& multiPutByOffsetData()
1933 {
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00001934 ASSERT(hasMultiPutByOffsetData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001935 return *m_opInfo.as<MultiPutByOffsetData*>();
fpizlo@apple.com43219522014-02-25 02:02:50 +00001936 }
1937
fpizlo@apple.coma772c6b2018-05-19 22:00:21 +00001938 bool hasMatchStructureData()
1939 {
1940 return op() == MatchStructure;
1941 }
1942
1943 MatchStructureData& matchStructureData()
1944 {
1945 ASSERT(hasMatchStructureData());
1946 return *m_opInfo.as<MatchStructureData*>();
1947 }
1948
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +00001949 bool hasObjectMaterializationData()
1950 {
basile_clement@apple.combe857f62015-05-05 17:59:33 +00001951 switch (op()) {
1952 case MaterializeNewObject:
1953 case MaterializeCreateActivation:
1954 return true;
1955
1956 default:
1957 return false;
1958 }
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +00001959 }
1960
1961 ObjectMaterializationData& objectMaterializationData()
1962 {
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00001963 ASSERT(hasObjectMaterializationData());
sbarati@apple.com972e8172016-08-28 23:31:46 +00001964 return *m_opInfo2.as<ObjectMaterializationData*>();
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +00001965 }
commit-queue@webkit.org2426f372015-04-27 20:42:28 +00001966
1967 bool isObjectAllocation()
1968 {
1969 switch (op()) {
1970 case NewObject:
1971 case MaterializeNewObject:
1972 return true;
1973 default:
1974 return false;
1975 }
1976 }
fpizlo@apple.comfc70ba62014-09-26 03:59:33 +00001977
1978 bool isPhantomObjectAllocation()
1979 {
1980 switch (op()) {
1981 case PhantomNewObject:
1982 return true;
1983 default:
1984 return false;
1985 }
1986 }
1987
basile_clement@apple.com2ca1f7b2015-05-05 16:34:21 +00001988 bool isActivationAllocation()
1989 {
1990 switch (op()) {
1991 case CreateActivation:
1992 case MaterializeCreateActivation:
1993 return true;
1994 default:
1995 return false;
1996 }
1997 }
1998
1999 bool isPhantomActivationAllocation()
2000 {
2001 switch (op()) {
2002 case PhantomCreateActivation:
2003 return true;
2004 default:
2005 return false;
2006 }
2007 }
2008
basile_clement@apple.coma8b1b042015-06-30 22:19:05 +00002009 bool isFunctionAllocation()
2010 {
2011 switch (op()) {
2012 case NewFunction:
utatane.tea@gmail.com9d9fd322015-12-17 10:33:08 +00002013 case NewGeneratorFunction:
gskachkov@gmail.comab749fd2017-08-23 17:05:33 +00002014 case NewAsyncGeneratorFunction:
caitp@igalia.com8bc562d2016-11-14 21:14:15 +00002015 case NewAsyncFunction:
basile_clement@apple.coma8b1b042015-06-30 22:19:05 +00002016 return true;
2017 default:
2018 return false;
2019 }
2020 }
2021
2022 bool isPhantomFunctionAllocation()
2023 {
2024 switch (op()) {
2025 case PhantomNewFunction:
utatane.tea@gmail.com9d9fd322015-12-17 10:33:08 +00002026 case PhantomNewGeneratorFunction:
caitp@igalia.com8bc562d2016-11-14 21:14:15 +00002027 case PhantomNewAsyncFunction:
gskachkov@gmail.comab749fd2017-08-23 17:05:33 +00002028 case PhantomNewAsyncGeneratorFunction:
basile_clement@apple.coma8b1b042015-06-30 22:19:05 +00002029 return true;
2030 default:
2031 return false;
2032 }
2033 }
2034
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00002035 bool isPhantomAllocation()
2036 {
2037 switch (op()) {
2038 case PhantomNewObject:
2039 case PhantomDirectArguments:
sbarati@apple.com7a74ce72016-11-01 20:03:03 +00002040 case PhantomCreateRest:
sbarati@apple.come20444a2016-11-30 06:24:44 +00002041 case PhantomSpread:
2042 case PhantomNewArrayWithSpread:
utatane.tea@gmail.comb7113162017-12-18 11:49:33 +00002043 case PhantomNewArrayBuffer:
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00002044 case PhantomClonedArguments:
commit-queue@webkit.org88ab4e72015-04-24 02:23:36 +00002045 case PhantomNewFunction:
utatane.tea@gmail.com9d9fd322015-12-17 10:33:08 +00002046 case PhantomNewGeneratorFunction:
caitp@igalia.com8bc562d2016-11-14 21:14:15 +00002047 case PhantomNewAsyncFunction:
gskachkov@gmail.comab749fd2017-08-23 17:05:33 +00002048 case PhantomNewAsyncGeneratorFunction:
basile_clement@apple.com2ca1f7b2015-05-05 16:34:21 +00002049 case PhantomCreateActivation:
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +00002050 case PhantomNewRegexp:
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00002051 return true;
2052 default:
2053 return false;
2054 }
2055 }
2056
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002057 bool hasArrayMode()
2058 {
2059 switch (op()) {
2060 case GetIndexedPropertyStorage:
2061 case GetArrayLength:
utatane.tea@gmail.com95eee7b2017-05-22 06:24:44 +00002062 case GetVectorLength:
utatane.tea@gmail.com235f2b92018-05-22 04:54:31 +00002063 case InByVal:
oliver@apple.come050d642013-10-19 00:09:28 +00002064 case PutByValDirect:
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002065 case PutByVal:
2066 case PutByValAlias:
2067 case GetByVal:
2068 case StringCharAt:
2069 case StringCharCodeAt:
fpizlo@apple.com04c19742012-08-26 22:35:26 +00002070 case CheckArray:
fpizlo@apple.com497c7512012-09-19 01:20:52 +00002071 case Arrayify:
fpizlo@apple.com99f37622012-10-29 04:02:08 +00002072 case ArrayifyToStructure:
fpizlo@apple.com04c19742012-08-26 22:35:26 +00002073 case ArrayPush:
2074 case ArrayPop:
utatane.tea@gmail.com8dae6082017-06-12 03:58:23 +00002075 case ArrayIndexOf:
fpizlo@apple.coma398a562014-08-06 21:32:55 +00002076 case HasIndexedProperty:
fpizlo@apple.com2fca8772017-04-20 17:55:44 +00002077 case AtomicsAdd:
2078 case AtomicsAnd:
2079 case AtomicsCompareExchange:
2080 case AtomicsExchange:
2081 case AtomicsLoad:
2082 case AtomicsOr:
2083 case AtomicsStore:
2084 case AtomicsSub:
2085 case AtomicsXor:
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002086 return true;
2087 default:
2088 return false;
2089 }
2090 }
2091
fpizlo@apple.com34d1f082012-10-28 06:13:23 +00002092 ArrayMode arrayMode()
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002093 {
2094 ASSERT(hasArrayMode());
fpizlo@apple.com99f37622012-10-29 04:02:08 +00002095 if (op() == ArrayifyToStructure)
sbarati@apple.com972e8172016-08-28 23:31:46 +00002096 return ArrayMode::fromWord(m_opInfo2.as<uint32_t>());
2097 return ArrayMode::fromWord(m_opInfo.as<uint32_t>());
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002098 }
2099
fpizlo@apple.com34d1f082012-10-28 06:13:23 +00002100 bool setArrayMode(ArrayMode arrayMode)
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002101 {
2102 ASSERT(hasArrayMode());
fpizlo@apple.com04c19742012-08-26 22:35:26 +00002103 if (this->arrayMode() == arrayMode)
2104 return false;
fpizlo@apple.com34d1f082012-10-28 06:13:23 +00002105 m_opInfo = arrayMode.asWord();
fpizlo@apple.com04c19742012-08-26 22:35:26 +00002106 return true;
fpizlo@apple.com7aed8d82012-08-23 03:38:52 +00002107 }
2108
fpizlo@apple.coma0fb09052014-01-07 04:52:48 +00002109 bool hasArithMode()
2110 {
2111 switch (op()) {
commit-queue@webkit.orgf4256ed2016-02-17 23:35:11 +00002112 case ArithAbs:
fpizlo@apple.coma0fb09052014-01-07 04:52:48 +00002113 case ArithAdd:
2114 case ArithSub:
2115 case ArithNegate:
2116 case ArithMul:
2117 case ArithDiv:
2118 case ArithMod:
2119 case UInt32ToNumber:
2120 case DoubleAsInt32:
2121 return true;
2122 default:
2123 return false;
2124 }
2125 }
2126
2127 Arith::Mode arithMode()
2128 {
2129 ASSERT(hasArithMode());
sbarati@apple.com972e8172016-08-28 23:31:46 +00002130 return static_cast<Arith::Mode>(m_opInfo.as<uint32_t>());
fpizlo@apple.coma0fb09052014-01-07 04:52:48 +00002131 }
2132
2133 void setArithMode(Arith::Mode mode)
2134 {
2135 m_opInfo = mode;
2136 }
benjamin@webkit.orgcb584082015-05-08 00:23:32 +00002137
2138 bool hasArithRoundingMode()
2139 {
utatane.tea@gmail.com9b9f43e2016-04-03 08:37:26 +00002140 return op() == ArithRound || op() == ArithFloor || op() == ArithCeil || op() == ArithTrunc;
benjamin@webkit.orgcb584082015-05-08 00:23:32 +00002141 }
2142
2143 Arith::RoundingMode arithRoundingMode()
2144 {
2145 ASSERT(hasArithRoundingMode());
sbarati@apple.com972e8172016-08-28 23:31:46 +00002146 return static_cast<Arith::RoundingMode>(m_opInfo.as<uint32_t>());
benjamin@webkit.orgcb584082015-05-08 00:23:32 +00002147 }
2148
2149 void setArithRoundingMode(Arith::RoundingMode mode)
2150 {
2151 ASSERT(hasArithRoundingMode());
sbarati@apple.com972e8172016-08-28 23:31:46 +00002152 m_opInfo = static_cast<uint32_t>(mode);
benjamin@webkit.orgcb584082015-05-08 00:23:32 +00002153 }
utatane.tea@gmail.comccb74992017-05-04 11:40:46 +00002154
2155 bool hasArithUnaryType()
2156 {
2157 return op() == ArithUnary;
2158 }
2159
2160 Arith::UnaryType arithUnaryType()
2161 {
2162 ASSERT(hasArithUnaryType());
2163 return static_cast<Arith::UnaryType>(m_opInfo.as<uint32_t>());
2164 }
fpizlo@apple.coma0fb09052014-01-07 04:52:48 +00002165
fpizlo@apple.com75ee46c2011-09-18 03:47:04 +00002166 bool hasVirtualRegister()
2167 {
msaboff@apple.com62aa8b72013-09-26 22:53:54 +00002168 return m_virtualRegister.isValid();
fpizlo@apple.com75ee46c2011-09-18 03:47:04 +00002169 }
sbarati@apple.com60a3be72017-08-25 18:26:15 +00002170
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002171 VirtualRegister virtualRegister()
barraclough@apple.com73e6fc12011-04-20 20:47:53 +00002172 {
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002173 ASSERT(hasResult());
msaboff@apple.com62aa8b72013-09-26 22:53:54 +00002174 ASSERT(m_virtualRegister.isValid());
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002175 return m_virtualRegister;
barraclough@apple.com73e6fc12011-04-20 20:47:53 +00002176 }
fpizlo@apple.com8618e4b2012-07-03 01:27:16 +00002177
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002178 void setVirtualRegister(VirtualRegister virtualRegister)
2179 {
2180 ASSERT(hasResult());
msaboff@apple.com62aa8b72013-09-26 22:53:54 +00002181 ASSERT(!m_virtualRegister.isValid());
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002182 m_virtualRegister = virtualRegister;
2183 }
fpizlo@apple.comb80bc2a32012-06-02 22:58:48 +00002184
fpizlo@apple.com4a81fa42012-12-05 01:26:13 +00002185 bool hasExecutionCounter()
2186 {
2187 return op() == CountExecution;
2188 }
2189
2190 Profiler::ExecutionCounter* executionCounter()
2191 {
sbarati@apple.com972e8172016-08-28 23:31:46 +00002192 return m_opInfo.as<Profiler::ExecutionCounter*>();
fpizlo@apple.com4a81fa42012-12-05 01:26:13 +00002193 }
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002194
sbarati@apple.com8bd925d2017-09-05 03:21:33 +00002195 unsigned entrypointIndex()
2196 {
2197 ASSERT(op() == InitializeEntrypointArguments);
2198 return m_opInfo.as<unsigned>();
2199 }
2200
sbarati@apple.com1c010822018-08-21 06:05:21 +00002201 DataViewData dataViewData()
2202 {
2203 ASSERT(op() == DataViewGetInt || op() == DataViewGetFloat || op() == DataViewSet);
2204 return bitwise_cast<DataViewData>(m_opInfo.as<uint64_t>());
2205 }
2206
barraclough@apple.com9f8b54b2011-04-23 20:16:10 +00002207 bool shouldGenerate()
2208 {
fpizlo@apple.comb0da6b62012-02-24 21:31:37 +00002209 return m_refCount;
barraclough@apple.com9f8b54b2011-04-23 20:16:10 +00002210 }
fpizlo@apple.com3d517672012-06-20 17:48:23 +00002211
fpizlo@apple.com080f5282017-03-16 21:19:23 +00002212 // Return true if the execution of this Node does not affect our ability to OSR to the FTL.
2213 // FIXME: Isn't this just like checking if the node has effects?
msaboff@apple.com95894332014-01-29 19:18:54 +00002214 bool isSemanticallySkippable()
2215 {
fpizlo@apple.com080f5282017-03-16 21:19:23 +00002216 return op() == CountExecution || op() == InvalidationPoint;
msaboff@apple.com95894332014-01-29 19:18:54 +00002217 }
barraclough@apple.com9f8b54b2011-04-23 20:16:10 +00002218
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002219 unsigned refCount()
2220 {
2221 return m_refCount;
2222 }
2223
fpizlo@apple.com78009012013-01-17 20:45:06 +00002224 unsigned postfixRef()
2225 {
2226 return m_refCount++;
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002227 }
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002228
2229 unsigned adjustedRefCount()
2230 {
2231 return mustGenerate() ? m_refCount - 1 : m_refCount;
2232 }
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002233
fpizlo@apple.com75ee46c2011-09-18 03:47:04 +00002234 void setRefCount(unsigned refCount)
2235 {
2236 m_refCount = refCount;
2237 }
2238
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +00002239 Edge& child1()
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002240 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00002241 ASSERT(!(m_flags & NodeHasVarArgs));
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002242 return children.child1();
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002243 }
fpizlo@apple.com7f6c6802011-09-13 01:33:43 +00002244
2245 // This is useful if you want to do a fast check on the first child
2246 // before also doing a check on the opcode. Use this with care and
2247 // avoid it if possible.
fpizlo@apple.come5abbae2012-03-19 21:44:23 +00002248 Edge child1Unchecked()
fpizlo@apple.com7f6c6802011-09-13 01:33:43 +00002249 {
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002250 return children.child1Unchecked();
fpizlo@apple.com7f6c6802011-09-13 01:33:43 +00002251 }
barraclough@apple.com73e6fc12011-04-20 20:47:53 +00002252
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +00002253 Edge& child2()
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002254 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00002255 ASSERT(!(m_flags & NodeHasVarArgs));
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002256 return children.child2();
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002257 }
2258
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +00002259 Edge& child3()
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002260 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00002261 ASSERT(!(m_flags & NodeHasVarArgs));
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002262 return children.child3();
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002263 }
2264
2265 unsigned firstChild()
2266 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00002267 ASSERT(m_flags & NodeHasVarArgs);
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002268 return children.firstChild();
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002269 }
2270
2271 unsigned numChildren()
2272 {
fpizlo@apple.comd7897b12012-03-12 23:15:45 +00002273 ASSERT(m_flags & NodeHasVarArgs);
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002274 return children.numChildren();
commit-queue@webkit.org4ea48922011-07-06 00:56:49 +00002275 }
2276
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +00002277 UseKind binaryUseKind()
2278 {
2279 ASSERT(child1().useKind() == child2().useKind());
2280 return child1().useKind();
2281 }
2282
fpizlo@apple.com312efcd2014-03-10 22:11:35 +00002283 bool isBinaryUseKind(UseKind left, UseKind right)
2284 {
2285 return child1().useKind() == left && child2().useKind() == right;
2286 }
2287
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +00002288 bool isBinaryUseKind(UseKind useKind)
2289 {
fpizlo@apple.com312efcd2014-03-10 22:11:35 +00002290 return isBinaryUseKind(useKind, useKind);
fpizlo@apple.com7a1964c2013-02-21 22:59:02 +00002291 }
2292
fpizlo@apple.com385a33a2014-03-18 20:53:07 +00002293 Edge childFor(UseKind useKind)
2294 {
2295 if (child1().useKind() == useKind)
2296 return child1();
2297 if (child2().useKind() == useKind)
2298 return child2();
2299 if (child3().useKind() == useKind)
2300 return child3();
2301 return Edge();
2302 }
2303
fpizlo@apple.com62336162012-06-07 01:35:59 +00002304 SpeculatedType prediction()
fpizlo@apple.comd30b1202011-10-04 01:05:38 +00002305 {
2306 return m_prediction;
2307 }
2308
fpizlo@apple.com62336162012-06-07 01:35:59 +00002309 bool predict(SpeculatedType prediction)
fpizlo@apple.comd30b1202011-10-04 01:05:38 +00002310 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002311 return mergeSpeculation(m_prediction, prediction);
fpizlo@apple.comd30b1202011-10-04 01:05:38 +00002312 }
2313
fpizlo@apple.comefacb612013-09-10 22:16:00 +00002314 bool shouldSpeculateInt32()
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002315 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002316 return isInt32Speculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002317 }
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +00002318
2319 bool shouldSpeculateNotInt32()
2320 {
2321 return isNotInt32Speculation(prediction());
2322 }
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002323
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002324 bool sawBooleans()
2325 {
2326 return !!(prediction() & SpecBoolean);
2327 }
2328
2329 bool shouldSpeculateInt32OrBoolean()
2330 {
2331 return isInt32OrBooleanSpeculation(prediction());
2332 }
2333
fpizlo@apple.comefacb612013-09-10 22:16:00 +00002334 bool shouldSpeculateInt32ForArithmetic()
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002335 {
2336 return isInt32SpeculationForArithmetic(prediction());
2337 }
2338
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002339 bool shouldSpeculateInt32OrBooleanForArithmetic()
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002340 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002341 return isInt32OrBooleanSpeculationForArithmetic(prediction());
2342 }
2343
2344 bool shouldSpeculateInt32OrBooleanExpectingDefined()
2345 {
2346 return isInt32OrBooleanSpeculationExpectingDefined(prediction());
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002347 }
2348
sbarati@apple.com34a4ba82019-04-09 16:06:48 +00002349 bool shouldSpeculateInt52()
fpizlo@apple.com3f780e42013-09-11 04:35:16 +00002350 {
sbarati@apple.com9e1a87d2019-04-13 03:04:18 +00002351 // We have to include SpecInt32Only here for two reasons:
2352 // 1. We diligently write code that first checks if we should speculate Int32.
2353 // For example:
2354 // if (shouldSpeculateInt32()) ...
2355 // else if (shouldSpeculateInt52()) ...
2356 // This means we it's totally valid to speculate Int52 when we're dealing
2357 // with a type that's the union of Int32 and Int52.
2358 //
2359 // It would be a performance mistake to not include Int32 here because we obviously
2360 // have variables that are the union of Int32 and Int52 values, and it's better
2361 // to speculate Int52 than double in that situation.
2362 //
2363 // 2. We also write code where we ask if the inputs can be Int52, like if
2364 // we know via profiling that an Add overflows, we may not emit an Int32 add.
2365 // However, we only emit such an add if both inputs can be Int52, and Int32
2366 // can trivially become Int52.
2367 //
2368 return enableInt52() && isInt32OrInt52Speculation(prediction());
fpizlo@apple.com3f780e42013-09-11 04:35:16 +00002369 }
2370
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002371 bool shouldSpeculateDouble()
2372 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002373 return isDoubleSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002374 }
2375
fpizlo@apple.com318af072015-06-05 04:59:28 +00002376 bool shouldSpeculateDoubleReal()
2377 {
2378 return isDoubleRealSpeculation(prediction());
2379 }
2380
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002381 bool shouldSpeculateNumber()
2382 {
fpizlo@apple.com6921b292013-09-18 17:14:02 +00002383 return isFullNumberSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002384 }
2385
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002386 bool shouldSpeculateNumberOrBoolean()
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002387 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002388 return isFullNumberOrBooleanSpeculation(prediction());
2389 }
2390
2391 bool shouldSpeculateNumberOrBooleanExpectingDefined()
2392 {
2393 return isFullNumberOrBooleanSpeculationExpectingDefined(prediction());
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002394 }
2395
fpizlo@apple.com2fc3dbd2012-03-14 02:54:58 +00002396 bool shouldSpeculateBoolean()
2397 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002398 return isBooleanSpeculation(prediction());
fpizlo@apple.com2fc3dbd2012-03-14 02:54:58 +00002399 }
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +00002400
2401 bool shouldSpeculateNotBoolean()
2402 {
2403 return isNotBooleanSpeculation(prediction());
2404 }
fpizlo@apple.come079bb52014-03-05 07:41:03 +00002405
fpizlo@apple.com312efcd2014-03-10 22:11:35 +00002406 bool shouldSpeculateOther()
2407 {
2408 return isOtherSpeculation(prediction());
2409 }
2410
fpizlo@apple.come079bb52014-03-05 07:41:03 +00002411 bool shouldSpeculateMisc()
2412 {
2413 return isMiscSpeculation(prediction());
2414 }
mhahnenberg@apple.com030c9da2012-08-30 21:11:21 +00002415
oliver@apple.combd15be82013-07-25 04:03:42 +00002416 bool shouldSpeculateStringIdent()
2417 {
2418 return isStringIdentSpeculation(prediction());
2419 }
fpizlo@apple.com385a33a2014-03-18 20:53:07 +00002420
2421 bool shouldSpeculateNotStringVar()
2422 {
2423 return isNotStringVarSpeculation(prediction());
2424 }
oliver@apple.combd15be82013-07-25 04:03:42 +00002425
mhahnenberg@apple.com030c9da2012-08-30 21:11:21 +00002426 bool shouldSpeculateString()
2427 {
2428 return isStringSpeculation(prediction());
2429 }
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +00002430
2431 bool shouldSpeculateNotString()
2432 {
2433 return isNotStringSpeculation(prediction());
2434 }
mhahnenberg@apple.com030c9da2012-08-30 21:11:21 +00002435
fpizlo@apple.com91331742016-03-07 02:07:28 +00002436 bool shouldSpeculateStringOrOther()
2437 {
2438 return isStringOrOtherSpeculation(prediction());
2439 }
2440
fpizlo@apple.com0e6e1542013-03-18 18:09:22 +00002441 bool shouldSpeculateStringObject()
2442 {
2443 return isStringObjectSpeculation(prediction());
2444 }
2445
2446 bool shouldSpeculateStringOrStringObject()
2447 {
2448 return isStringOrStringObjectSpeculation(prediction());
2449 }
utatane.tea@gmail.com382ef652015-10-01 17:20:44 +00002450
fpizlo@apple.come799b862016-03-01 21:18:42 +00002451 bool shouldSpeculateRegExpObject()
2452 {
2453 return isRegExpObjectSpeculation(prediction());
2454 }
2455
utatane.tea@gmail.com382ef652015-10-01 17:20:44 +00002456 bool shouldSpeculateSymbol()
2457 {
2458 return isSymbolSpeculation(prediction());
2459 }
fpizlo@apple.com0e6e1542013-03-18 18:09:22 +00002460
ticaiolima@gmail.com29b84da2018-04-11 05:49:31 +00002461 bool shouldSpeculateBigInt()
2462 {
2463 return isBigIntSpeculation(prediction());
2464 }
2465
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002466 bool shouldSpeculateFinalObject()
2467 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002468 return isFinalObjectSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002469 }
2470
2471 bool shouldSpeculateFinalObjectOrOther()
2472 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002473 return isFinalObjectOrOtherSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002474 }
2475
2476 bool shouldSpeculateArray()
2477 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002478 return isArraySpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002479 }
utatane.tea@gmail.com4a748b12016-09-17 06:32:50 +00002480
utatane.tea@gmail.com34e35e82017-10-18 07:12:53 +00002481 bool shouldSpeculateFunction()
2482 {
2483 return isFunctionSpeculation(prediction());
2484 }
2485
utatane.tea@gmail.com4a748b12016-09-17 06:32:50 +00002486 bool shouldSpeculateProxyObject()
2487 {
2488 return isProxyObjectSpeculation(prediction());
2489 }
2490
2491 bool shouldSpeculateDerivedArray()
2492 {
2493 return isDerivedArraySpeculation(prediction());
2494 }
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002495
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00002496 bool shouldSpeculateDirectArguments()
fpizlo@apple.comf860f9b2012-05-22 20:02:25 +00002497 {
fpizlo@apple.comda834ae2015-03-26 04:28:43 +00002498 return isDirectArgumentsSpeculation(prediction());
2499 }
2500
2501 bool shouldSpeculateScopedArguments()
2502 {
2503 return isScopedArgumentsSpeculation(prediction());
fpizlo@apple.comf860f9b2012-05-22 20:02:25 +00002504 }
2505
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002506 bool shouldSpeculateInt8Array()
2507 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002508 return isInt8ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002509 }
2510
2511 bool shouldSpeculateInt16Array()
2512 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002513 return isInt16ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002514 }
2515
2516 bool shouldSpeculateInt32Array()
2517 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002518 return isInt32ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002519 }
2520
2521 bool shouldSpeculateUint8Array()
2522 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002523 return isUint8ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002524 }
caio.oliveira@openbossa.org992fc372012-01-18 01:11:16 +00002525
2526 bool shouldSpeculateUint8ClampedArray()
2527 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002528 return isUint8ClampedArraySpeculation(prediction());
caio.oliveira@openbossa.org992fc372012-01-18 01:11:16 +00002529 }
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002530
2531 bool shouldSpeculateUint16Array()
2532 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002533 return isUint16ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002534 }
2535
2536 bool shouldSpeculateUint32Array()
2537 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002538 return isUint32ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002539 }
2540
2541 bool shouldSpeculateFloat32Array()
2542 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002543 return isFloat32ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002544 }
2545
2546 bool shouldSpeculateFloat64Array()
2547 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002548 return isFloat64ArraySpeculation(prediction());
oliver@apple.comaeec3d82011-12-02 01:56:53 +00002549 }
2550
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002551 bool shouldSpeculateArrayOrOther()
2552 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002553 return isArrayOrOtherSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002554 }
2555
2556 bool shouldSpeculateObject()
2557 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002558 return isObjectSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002559 }
2560
fpizlo@apple.comb7ad4b42013-02-11 23:34:05 +00002561 bool shouldSpeculateObjectOrOther()
2562 {
2563 return isObjectOrOtherSpeculation(prediction());
2564 }
2565
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002566 bool shouldSpeculateCell()
2567 {
fpizlo@apple.com62336162012-06-07 01:35:59 +00002568 return isCellSpeculation(prediction());
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002569 }
2570
fpizlo@apple.com409f5be2016-03-04 02:43:53 +00002571 bool shouldSpeculateCellOrOther()
2572 {
2573 return isCellOrOtherSpeculation(prediction());
2574 }
2575
fpizlo@apple.com9ab60fa2014-09-26 22:53:20 +00002576 bool shouldSpeculateNotCell()
2577 {
2578 return isNotCellSpeculation(prediction());
2579 }
2580
mark.lam@apple.com75249092015-10-16 23:26:14 +00002581 bool shouldSpeculateUntypedForArithmetic()
2582 {
2583 return isUntypedSpeculationForArithmetic(prediction());
2584 }
2585
2586 static bool shouldSpeculateUntypedForArithmetic(Node* op1, Node* op2)
2587 {
2588 return op1->shouldSpeculateUntypedForArithmetic() || op2->shouldSpeculateUntypedForArithmetic();
2589 }
2590
mark.lam@apple.comc0008652015-12-15 21:19:31 +00002591 bool shouldSpeculateUntypedForBitOps()
2592 {
2593 return isUntypedSpeculationForBitOps(prediction());
2594 }
2595
2596 static bool shouldSpeculateUntypedForBitOps(Node* op1, Node* op2)
2597 {
2598 return op1->shouldSpeculateUntypedForBitOps() || op2->shouldSpeculateUntypedForBitOps();
2599 }
2600
ggaren@apple.com0f001eb2013-04-24 15:48:55 +00002601 static bool shouldSpeculateBoolean(Node* op1, Node* op2)
2602 {
2603 return op1->shouldSpeculateBoolean() && op2->shouldSpeculateBoolean();
2604 }
2605
fpizlo@apple.comefacb612013-09-10 22:16:00 +00002606 static bool shouldSpeculateInt32(Node* op1, Node* op2)
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002607 {
fpizlo@apple.comefacb612013-09-10 22:16:00 +00002608 return op1->shouldSpeculateInt32() && op2->shouldSpeculateInt32();
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002609 }
2610
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002611 static bool shouldSpeculateInt32OrBoolean(Node* op1, Node* op2)
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002612 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002613 return op1->shouldSpeculateInt32OrBoolean()
2614 && op2->shouldSpeculateInt32OrBoolean();
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002615 }
2616
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002617 static bool shouldSpeculateInt32OrBooleanForArithmetic(Node* op1, Node* op2)
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002618 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002619 return op1->shouldSpeculateInt32OrBooleanForArithmetic()
2620 && op2->shouldSpeculateInt32OrBooleanForArithmetic();
2621 }
2622
2623 static bool shouldSpeculateInt32OrBooleanExpectingDefined(Node* op1, Node* op2)
2624 {
2625 return op1->shouldSpeculateInt32OrBooleanExpectingDefined()
2626 && op2->shouldSpeculateInt32OrBooleanExpectingDefined();
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002627 }
2628
sbarati@apple.com34a4ba82019-04-09 16:06:48 +00002629 static bool shouldSpeculateInt52(Node* op1, Node* op2)
fpizlo@apple.com3f780e42013-09-11 04:35:16 +00002630 {
sbarati@apple.com34a4ba82019-04-09 16:06:48 +00002631 return enableInt52() && op1->shouldSpeculateInt52() && op2->shouldSpeculateInt52();
fpizlo@apple.com3f780e42013-09-11 04:35:16 +00002632 }
2633
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002634 static bool shouldSpeculateNumber(Node* op1, Node* op2)
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002635 {
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002636 return op1->shouldSpeculateNumber() && op2->shouldSpeculateNumber();
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002637 }
2638
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002639 static bool shouldSpeculateNumberOrBoolean(Node* op1, Node* op2)
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002640 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002641 return op1->shouldSpeculateNumberOrBoolean()
2642 && op2->shouldSpeculateNumberOrBoolean();
2643 }
2644
2645 static bool shouldSpeculateNumberOrBooleanExpectingDefined(Node* op1, Node* op2)
2646 {
2647 return op1->shouldSpeculateNumberOrBooleanExpectingDefined()
2648 && op2->shouldSpeculateNumberOrBooleanExpectingDefined();
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002649 }
utatane.tea@gmail.com382ef652015-10-01 17:20:44 +00002650
2651 static bool shouldSpeculateSymbol(Node* op1, Node* op2)
2652 {
2653 return op1->shouldSpeculateSymbol() && op2->shouldSpeculateSymbol();
2654 }
fpizlo@apple.com81f75372012-11-08 22:55:27 +00002655
ticaiolima@gmail.com29b84da2018-04-11 05:49:31 +00002656 static bool shouldSpeculateBigInt(Node* op1, Node* op2)
2657 {
2658 return op1->shouldSpeculateBigInt() && op2->shouldSpeculateBigInt();
2659 }
2660
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002661 static bool shouldSpeculateFinalObject(Node* op1, Node* op2)
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002662 {
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002663 return op1->shouldSpeculateFinalObject() && op2->shouldSpeculateFinalObject();
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002664 }
2665
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002666 static bool shouldSpeculateArray(Node* op1, Node* op2)
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002667 {
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002668 return op1->shouldSpeculateArray() && op2->shouldSpeculateArray();
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002669 }
2670
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002671 bool canSpeculateInt32(RareCaseProfilingSource source)
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002672 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002673 return nodeCanSpeculateInt32(arithNodeFlags(), source);
fpizlo@apple.come40bc052011-10-06 23:39:03 +00002674 }
2675
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002676 bool canSpeculateInt52(RareCaseProfilingSource source)
fpizlo@apple.com3f780e42013-09-11 04:35:16 +00002677 {
fpizlo@apple.com96509b72014-05-26 17:43:41 +00002678 return nodeCanSpeculateInt52(arithNodeFlags(), source);
2679 }
2680
2681 RareCaseProfilingSource sourceFor(PredictionPass pass)
2682 {
2683 if (pass == PrimaryPass || child1()->sawBooleans() || (child2() && child2()->sawBooleans()))
2684 return DFGRareCase;
2685 return AllRareCases;
2686 }
2687
2688 bool canSpeculateInt32(PredictionPass pass)
2689 {
2690 return canSpeculateInt32(sourceFor(pass));
2691 }
2692
2693 bool canSpeculateInt52(PredictionPass pass)
2694 {
2695 return canSpeculateInt52(sourceFor(pass));
fpizlo@apple.com3f780e42013-09-11 04:35:16 +00002696 }
saambarati1@gmail.comdaf10202014-10-01 20:47:51 +00002697
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00002698 bool hasTypeLocation()
2699 {
2700 return op() == ProfileType;
2701 }
2702
saambarati1@gmail.comdaf10202014-10-01 20:47:51 +00002703 TypeLocation* typeLocation()
2704 {
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00002705 ASSERT(hasTypeLocation());
sbarati@apple.com972e8172016-08-28 23:31:46 +00002706 return m_opInfo.as<TypeLocation*>();
saambarati1@gmail.comdaf10202014-10-01 20:47:51 +00002707 }
saambarati1@gmail.comb4f28a52014-12-05 05:58:07 +00002708
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00002709 bool hasBasicBlockLocation()
2710 {
2711 return op() == ProfileControlFlow;
2712 }
2713
saambarati1@gmail.comb4f28a52014-12-05 05:58:07 +00002714 BasicBlockLocation* basicBlockLocation()
2715 {
basile_clement@apple.com4d3ff812015-05-28 19:14:30 +00002716 ASSERT(hasBasicBlockLocation());
sbarati@apple.com972e8172016-08-28 23:31:46 +00002717 return m_opInfo.as<BasicBlockLocation*>();
saambarati1@gmail.comb4f28a52014-12-05 05:58:07 +00002718 }
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002719
utatane.tea@gmail.comc9d8f862016-10-28 22:57:10 +00002720 bool hasCallDOMGetterData() const
utatane.tea@gmail.com48b9cac2016-10-12 20:47:51 +00002721 {
utatane.tea@gmail.comc9d8f862016-10-28 22:57:10 +00002722 return op() == CallDOMGetter;
utatane.tea@gmail.com48b9cac2016-10-12 20:47:51 +00002723 }
2724
utatane.tea@gmail.comc9d8f862016-10-28 22:57:10 +00002725 CallDOMGetterData* callDOMGetterData()
utatane.tea@gmail.com48b9cac2016-10-12 20:47:51 +00002726 {
utatane.tea@gmail.comc9d8f862016-10-28 22:57:10 +00002727 ASSERT(hasCallDOMGetterData());
2728 return m_opInfo.as<CallDOMGetterData*>();
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002729 }
2730
2731 bool hasClassInfo() const
2732 {
utatane.tea@gmail.coma5544f12017-05-19 09:23:20 +00002733 return op() == CheckSubClass;
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002734 }
2735
2736 const ClassInfo* classInfo()
2737 {
utatane.tea@gmail.coma5544f12017-05-19 09:23:20 +00002738 return m_opInfo.as<const ClassInfo*>();
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002739 }
2740
utatane.tea@gmail.com0d74c7c2016-11-03 03:20:53 +00002741 bool hasSignature() const
2742 {
2743 // Note that this does not include TailCall node types intentionally.
2744 // CallDOM node types are always converted from Call.
2745 return op() == Call || op() == CallDOM;
2746 }
2747
2748 const DOMJIT::Signature* signature()
2749 {
2750 return m_opInfo.as<const DOMJIT::Signature*>();
2751 }
2752
keith_miller@apple.com6fc2fb72017-02-09 00:02:20 +00002753 bool hasInternalMethodType() const
2754 {
2755 return op() == HasIndexedProperty;
2756 }
2757
2758 PropertySlot::InternalMethodType internalMethodType() const
2759 {
2760 ASSERT(hasInternalMethodType());
2761 return static_cast<PropertySlot::InternalMethodType>(m_opInfo2.as<uint32_t>());
2762 }
2763
2764 void setInternalMethodType(PropertySlot::InternalMethodType type)
2765 {
2766 ASSERT(hasInternalMethodType());
2767 m_opInfo2 = static_cast<uint32_t>(type);
2768 }
2769
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +00002770 Node* replacement() const
2771 {
2772 return m_misc.replacement;
2773 }
2774
2775 void setReplacement(Node* replacement)
2776 {
2777 m_misc.replacement = replacement;
2778 }
2779
2780 Epoch epoch() const
2781 {
2782 return Epoch::fromUnsigned(m_misc.epoch);
2783 }
2784
2785 void setEpoch(Epoch epoch)
2786 {
2787 m_misc.epoch = epoch.toUnsigned();
2788 }
fpizlo@apple.com2ee0bb52018-01-24 00:40:12 +00002789
2790 bool hasNumberOfArgumentsToSkip()
2791 {
2792 return op() == CreateRest || op() == PhantomCreateRest || op() == GetRestLength || op() == GetMyArgumentByVal || op() == GetMyArgumentByValOutOfBounds;
2793 }
sbarati@apple.comc0722da2015-11-20 02:37:47 +00002794
2795 unsigned numberOfArgumentsToSkip()
2796 {
fpizlo@apple.com2ee0bb52018-01-24 00:40:12 +00002797 ASSERT(hasNumberOfArgumentsToSkip());
sbarati@apple.com972e8172016-08-28 23:31:46 +00002798 return m_opInfo.as<unsigned>();
sbarati@apple.comc0722da2015-11-20 02:37:47 +00002799 }
2800
utatane.tea@gmail.combebf7852016-11-10 06:34:05 +00002801 bool hasArgumentIndex()
2802 {
2803 return op() == GetArgument;
2804 }
2805
2806 unsigned argumentIndex()
2807 {
2808 ASSERT(hasArgumentIndex());
2809 return m_opInfo.as<unsigned>();
2810 }
2811
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +00002812 bool hasBucketOwnerType()
2813 {
utatane.tea@gmail.com6084fb52017-11-27 01:46:59 +00002814 return op() == GetMapBucketNext || op() == LoadKeyFromMapBucket || op() == LoadValueFromMapBucket;
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +00002815 }
2816
2817 BucketOwnerType bucketOwnerType()
2818 {
2819 ASSERT(hasBucketOwnerType());
2820 return m_opInfo.as<BucketOwnerType>();
2821 }
2822
utatane.tea@gmail.com57ab8ecd2017-09-05 03:03:03 +00002823 bool hasValidRadixConstant()
2824 {
2825 return op() == NumberToStringWithValidRadixConstant;
2826 }
2827
2828 int32_t validRadixConstant()
2829 {
2830 ASSERT(hasValidRadixConstant());
2831 return m_opInfo.as<int32_t>();
2832 }
2833
utatane.tea@gmail.com19a21f02018-01-18 04:17:32 +00002834 bool hasIgnoreLastIndexIsWritable()
2835 {
2836 return op() == SetRegExpObjectLastIndex;
2837 }
2838
2839 bool ignoreLastIndexIsWritable()
2840 {
2841 ASSERT(hasIgnoreLastIndexIsWritable());
2842 return m_opInfo.as<uint32_t>();
2843 }
2844
sbarati@apple.comc1f73c32017-09-01 05:41:08 +00002845 uint32_t errorType()
2846 {
2847 ASSERT(op() == ThrowStaticError);
2848 return m_opInfo.as<uint32_t>();
2849 }
fpizlo@apple.comed2da802018-07-22 02:48:16 +00002850
2851 bool hasCallLinkStatus()
2852 {
2853 return op() == FilterCallLinkStatus;
2854 }
2855
2856 CallLinkStatus* callLinkStatus()
2857 {
2858 ASSERT(hasCallLinkStatus());
2859 return m_opInfo.as<CallLinkStatus*>();
2860 }
2861
2862 bool hasGetByIdStatus()
2863 {
2864 return op() == FilterGetByIdStatus;
2865 }
2866
2867 GetByIdStatus* getByIdStatus()
2868 {
2869 ASSERT(hasGetByIdStatus());
2870 return m_opInfo.as<GetByIdStatus*>();
2871 }
2872
2873 bool hasInByIdStatus()
2874 {
2875 return op() == FilterInByIdStatus;
2876 }
2877
2878 InByIdStatus* inByIdStatus()
2879 {
2880 ASSERT(hasInByIdStatus());
2881 return m_opInfo.as<InByIdStatus*>();
2882 }
2883
2884 bool hasPutByIdStatus()
2885 {
2886 return op() == FilterPutByIdStatus;
2887 }
2888
2889 PutByIdStatus* putByIdStatus()
2890 {
2891 ASSERT(hasPutByIdStatus());
2892 return m_opInfo.as<PutByIdStatus*>();
2893 }
sbarati@apple.comc1f73c32017-09-01 05:41:08 +00002894
fpizlo@apple.com8a8b45e2012-11-28 01:29:29 +00002895 void dumpChildren(PrintStream& out)
fpizlo@apple.comfab66052011-11-22 03:02:33 +00002896 {
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002897 if (!child1())
fpizlo@apple.comfab66052011-11-22 03:02:33 +00002898 return;
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002899 out.printf("@%u", child1()->index());
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002900 if (!child2())
fpizlo@apple.comfab66052011-11-22 03:02:33 +00002901 return;
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002902 out.printf(", @%u", child2()->index());
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002903 if (!child3())
fpizlo@apple.comfab66052011-11-22 03:02:33 +00002904 return;
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00002905 out.printf(", @%u", child3()->index());
fpizlo@apple.comfab66052011-11-22 03:02:33 +00002906 }
fpizlo@apple.com6793a322014-02-12 05:42:32 +00002907
2908 NodeOrigin origin;
2909
fpizlo@apple.com1996b4b2012-02-06 06:44:24 +00002910 // References to up to 3 children, or links to a variable length set of children.
fpizlo@apple.come5abbae2012-03-19 21:44:23 +00002911 AdjacencyList children;
barraclough@apple.com2302c042011-03-14 23:31:00 +00002912
2913private:
ggaren@apple.com9e5a7612017-05-13 04:59:35 +00002914 friend class B3::SparseCollection<Node>;
commit-queue@webkit.orgaa93e082016-07-28 01:36:44 +00002915
2916 unsigned m_index { std::numeric_limits<unsigned>::max() };
fpizlo@apple.com955073c2013-02-28 21:51:25 +00002917 unsigned m_op : 10; // real type is NodeType
ticaiolima@gmail.com843ddd32018-11-08 01:47:27 +00002918 unsigned m_flags : 21;
barraclough@apple.comde174fb2011-04-22 20:38:27 +00002919 // The virtual register number (spill location) associated with this .
2920 VirtualRegister m_virtualRegister;
2921 // The number of uses of the result of this operation (+1 for 'must generate' nodes, which have side-effects).
2922 unsigned m_refCount;
oliver@apple.comd83bc442013-07-25 04:04:21 +00002923 // The prediction ascribed to this node after propagation.
commit-queue@webkit.orgaa93e082016-07-28 01:36:44 +00002924 SpeculatedType m_prediction { SpecNone };
fpizlo@apple.comf0b30cb2016-10-18 18:30:05 +00002925 // Immediate values, accesses type-checked via accessors above.
sbarati@apple.com972e8172016-08-28 23:31:46 +00002926 struct OpInfoWrapper {
2927 OpInfoWrapper()
2928 {
2929 u.int64 = 0;
2930 }
2931 OpInfoWrapper(uint32_t intValue)
2932 {
2933 u.int64 = 0;
2934 u.int32 = intValue;
2935 }
2936 OpInfoWrapper(uint64_t intValue)
2937 {
2938 u.int64 = intValue;
2939 }
2940 OpInfoWrapper(void* pointer)
2941 {
2942 u.int64 = 0;
2943 u.pointer = pointer;
2944 }
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002945 OpInfoWrapper(const void* constPointer)
2946 {
2947 u.int64 = 0;
2948 u.constPointer = constPointer;
2949 }
sbarati@apple.com239d20b2017-01-26 23:50:58 +00002950 OpInfoWrapper(RegisteredStructure structure)
2951 {
2952 u.int64 = 0;
2953 u.pointer = bitwise_cast<void*>(structure);
2954 }
sbarati@apple.com972e8172016-08-28 23:31:46 +00002955 OpInfoWrapper& operator=(uint32_t int32)
2956 {
2957 u.int64 = 0;
2958 u.int32 = int32;
2959 return *this;
2960 }
2961 OpInfoWrapper& operator=(int32_t int32)
2962 {
2963 u.int64 = 0;
2964 u.int32 = int32;
2965 return *this;
2966 }
2967 OpInfoWrapper& operator=(uint64_t int64)
2968 {
2969 u.int64 = int64;
2970 return *this;
2971 }
2972 OpInfoWrapper& operator=(void* pointer)
2973 {
2974 u.int64 = 0;
2975 u.pointer = pointer;
2976 return *this;
2977 }
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002978 OpInfoWrapper& operator=(const void* constPointer)
2979 {
2980 u.int64 = 0;
2981 u.constPointer = constPointer;
2982 return *this;
2983 }
sbarati@apple.com239d20b2017-01-26 23:50:58 +00002984 OpInfoWrapper& operator=(RegisteredStructure structure)
2985 {
2986 u.int64 = 0;
2987 u.pointer = bitwise_cast<void*>(structure);
2988 return *this;
2989 }
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00002990 OpInfoWrapper& operator=(NewArrayBufferData newArrayBufferData)
2991 {
2992 u.int64 = bitwise_cast<uint64_t>(newArrayBufferData);
2993 return *this;
2994 }
sbarati@apple.com972e8172016-08-28 23:31:46 +00002995 template <typename T>
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00002996 ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_pointer<T>::value && !std::is_const<typename std::remove_pointer<T>::type>::value, T>::type
sbarati@apple.com972e8172016-08-28 23:31:46 +00002997 {
2998 return static_cast<T>(u.pointer);
2999 }
3000 template <typename T>
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00003001 ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_pointer<T>::value && std::is_const<typename std::remove_pointer<T>::type>::value, T>::type
3002 {
3003 return static_cast<T>(u.constPointer);
3004 }
3005 template <typename T>
ysuzuki@apple.com5fbfa402019-02-04 21:02:27 +00003006 ALWAYS_INLINE auto as() const -> typename std::enable_if<(std::is_integral<T>::value || std::is_enum<T>::value) && sizeof(T) <= 4, T>::type
sbarati@apple.com972e8172016-08-28 23:31:46 +00003007 {
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +00003008 return static_cast<T>(u.int32);
sbarati@apple.com972e8172016-08-28 23:31:46 +00003009 }
3010 template <typename T>
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +00003011 ALWAYS_INLINE auto as() const -> typename std::enable_if<(std::is_integral<T>::value || std::is_enum<T>::value) && sizeof(T) == 8, T>::type
sbarati@apple.com972e8172016-08-28 23:31:46 +00003012 {
utatane.tea@gmail.com0cf9fa02017-08-23 22:19:13 +00003013 return static_cast<T>(u.int64);
sbarati@apple.com972e8172016-08-28 23:31:46 +00003014 }
sbarati@apple.com239d20b2017-01-26 23:50:58 +00003015 ALWAYS_INLINE RegisteredStructure asRegisteredStructure() const
3016 {
3017 return bitwise_cast<RegisteredStructure>(u.pointer);
3018 }
utatane.tea@gmail.com327d8ac2017-12-01 08:18:40 +00003019 ALWAYS_INLINE NewArrayBufferData asNewArrayBufferData() const
3020 {
3021 return bitwise_cast<NewArrayBufferData>(u.int64);
3022 }
sbarati@apple.com239d20b2017-01-26 23:50:58 +00003023
sbarati@apple.com972e8172016-08-28 23:31:46 +00003024 union {
3025 uint32_t int32;
3026 uint64_t int64;
3027 void* pointer;
utatane.tea@gmail.com23a42472016-10-06 05:20:10 +00003028 const void* constPointer;
sbarati@apple.com972e8172016-08-28 23:31:46 +00003029 } u;
3030 };
3031 OpInfoWrapper m_opInfo;
3032 OpInfoWrapper m_opInfo2;
fpizlo@apple.comf8f33842013-01-14 06:58:57 +00003033
oliver@apple.com78a7c622013-07-25 04:05:26 +00003034 // Miscellaneous data that is usually meaningless, but can hold some analysis results
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +00003035 // if you ask right. For example, if you do Graph::initializeNodeOwners(), Node::owner
oliver@apple.com78a7c622013-07-25 04:05:26 +00003036 // will tell you which basic block a node belongs to. You cannot rely on this persisting
3037 // across transformations unless you do the maintenance work yourself. Other phases use
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +00003038 // Node::replacement, but they do so manually: first you do Graph::clearReplacements()
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +00003039 // and then you set, and use, replacement's yourself. Same thing for epoch.
oliver@apple.com78a7c622013-07-25 04:05:26 +00003040 //
3041 // Bottom line: don't use these fields unless you initialize them yourself, or by
3042 // calling some appropriate methods that initialize them the way you want. Otherwise,
3043 // these fields are meaningless.
fpizlo@apple.com3d99d7e2015-04-23 02:36:08 +00003044private:
3045 union {
3046 Node* replacement;
3047 unsigned epoch;
3048 } m_misc;
3049public:
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +00003050 BasicBlock* owner;
barraclough@apple.com2302c042011-03-14 23:31:00 +00003051};
3052
fpizlo@apple.com6e693702017-03-14 21:37:41 +00003053// Uncomment this to log NodeSet operations.
3054// typedef LoggingHashSet<Node::HashSetTemplateInstantiationString, Node*> NodeSet;
3055typedef HashSet<Node*> NodeSet;
3056
fpizlo@apple.com8ff2aef2016-11-04 05:28:35 +00003057struct NodeComparator {
3058 template<typename NodePtrType>
3059 bool operator()(NodePtrType a, NodePtrType b) const
3060 {
3061 return a->index() < b->index();
3062 }
3063};
oliver@apple.com827d2cf2013-07-25 04:04:45 +00003064
3065template<typename T>
3066CString nodeListDump(const T& nodeList)
3067{
fpizlo@apple.com8ff2aef2016-11-04 05:28:35 +00003068 return sortedListDump(nodeList, NodeComparator());
oliver@apple.com827d2cf2013-07-25 04:04:45 +00003069}
3070
3071template<typename T>
oliver@apple.com237b1462013-07-25 04:05:36 +00003072CString nodeMapDump(const T& nodeMap, DumpContext* context = 0)
oliver@apple.com827d2cf2013-07-25 04:04:45 +00003073{
oliver@apple.com237b1462013-07-25 04:05:36 +00003074 Vector<typename T::KeyType> keys;
3075 for (
3076 typename T::const_iterator iter = nodeMap.begin();
3077 iter != nodeMap.end(); ++iter)
3078 keys.append(iter->key);
fpizlo@apple.com8ff2aef2016-11-04 05:28:35 +00003079 std::sort(keys.begin(), keys.end(), NodeComparator());
oliver@apple.com237b1462013-07-25 04:05:36 +00003080 StringPrintStream out;
3081 CommaPrinter comma;
3082 for(unsigned i = 0; i < keys.size(); ++i)
3083 out.print(comma, keys[i], "=>", inContext(nodeMap.get(keys[i]), context));
3084 return out.toCString();
oliver@apple.com827d2cf2013-07-25 04:04:45 +00003085}
3086
commit-queue@webkit.org0aba6c82016-04-01 01:48:34 +00003087template<typename T>
3088CString nodeValuePairListDump(const T& nodeValuePairList, DumpContext* context = 0)
3089{
commit-queue@webkit.org4a133632016-04-17 01:29:55 +00003090 using V = typename T::ValueType;
commit-queue@webkit.org0aba6c82016-04-01 01:48:34 +00003091 T sortedList = nodeValuePairList;
commit-queue@webkit.org4a133632016-04-17 01:29:55 +00003092 std::sort(sortedList.begin(), sortedList.end(), [](const V& a, const V& b) {
fpizlo@apple.com8ff2aef2016-11-04 05:28:35 +00003093 return NodeComparator()(a.node, b.node);
commit-queue@webkit.org4a133632016-04-17 01:29:55 +00003094 });
commit-queue@webkit.org0aba6c82016-04-01 01:48:34 +00003095
3096 StringPrintStream out;
3097 CommaPrinter comma;
3098 for (const auto& pair : sortedList)
3099 out.print(comma, pair.node, "=>", inContext(pair.value, context));
3100 return out.toCString();
3101}
3102
barraclough@apple.com2302c042011-03-14 23:31:00 +00003103} } // namespace JSC::DFG
3104
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00003105namespace WTF {
3106
oliver@apple.com39478942013-07-25 04:03:18 +00003107void printInternal(PrintStream&, JSC::DFG::SwitchKind);
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00003108void printInternal(PrintStream&, JSC::DFG::Node*);
3109
oliver@apple.com237b1462013-07-25 04:05:36 +00003110inline JSC::DFG::Node* inContext(JSC::DFG::Node* node, JSC::DumpContext*) { return node; }
3111
fpizlo@apple.com6e693702017-03-14 21:37:41 +00003112template<>
3113struct LoggingHashKeyTraits<JSC::DFG::Node*> {
3114 static void print(PrintStream& out, JSC::DFG::Node* key)
3115 {
3116 out.print("bitwise_cast<::JSC::DFG::Node*>(", RawPointer(key), "lu)");
3117 }
3118};
3119
fpizlo@apple.com8ff092f2013-01-29 08:01:03 +00003120} // namespace WTF
3121
oliver@apple.com237b1462013-07-25 04:05:36 +00003122using WTF::inContext;
3123
barraclough@apple.com2302c042011-03-14 23:31:00 +00003124#endif