DFG should only have two mechanisms for describing effectfulness of nodes; previously...
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
3  *
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
26 #include "config.h"
27 #include "DFGDoesGC.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include "DFGClobberize.h"
32 #include "DFGGraph.h"
33 #include "DFGNode.h"
34 #include "Operations.h"
35
36 namespace JSC { namespace DFG {
37
38 bool doesGC(Graph& graph, Node* node)
39 {
40     if (clobbersWorld(graph, node))
41         return true;
42     
43     // Now consider nodes that don't clobber the world but that still may GC. This includes all
44     // nodes. By convention we put world-clobbering nodes in the block of "false" cases but we can
45     // put them anywhere.
46     switch (node->op()) {
47     case JSConstant:
48     case DoubleConstant:
49     case Int52Constant:
50     case Identity:
51     case GetCallee:
52     case GetLocal:
53     case SetLocal:
54     case MovHint:
55     case ZombieHint:
56     case GetArgument:
57     case Phantom:
58     case HardPhantom:
59     case Upsilon:
60     case Phi:
61     case Flush:
62     case PhantomLocal:
63     case GetLocalUnlinked:
64     case SetArgument:
65     case BitAnd:
66     case BitOr:
67     case BitXor:
68     case BitLShift:
69     case BitRShift:
70     case BitURShift:
71     case ValueToInt32:
72     case UInt32ToNumber:
73     case DoubleAsInt32:
74     case ArithAdd:
75     case ArithSub:
76     case ArithNegate:
77     case ArithMul:
78     case ArithIMul:
79     case ArithDiv:
80     case ArithMod:
81     case ArithAbs:
82     case ArithMin:
83     case ArithMax:
84     case ArithSqrt:
85     case ArithFRound:
86     case ArithSin:
87     case ArithCos:
88     case ValueAdd:
89     case GetById:
90     case GetByIdFlush:
91     case PutById:
92     case PutByIdFlush:
93     case PutByIdDirect:
94     case CheckStructure:
95     case GetExecutable:
96     case GetButterfly:
97     case CheckArray:
98     case GetScope:
99     case SkipScope:
100     case GetClosureRegisters:
101     case GetClosureVar:
102     case PutClosureVar:
103     case GetGlobalVar:
104     case PutGlobalVar:
105     case VariableWatchpoint:
106     case VarInjectionWatchpoint:
107     case CheckCell:
108     case AllocationProfileWatchpoint:
109     case RegExpExec:
110     case RegExpTest:
111     case CompareLess:
112     case CompareLessEq:
113     case CompareGreater:
114     case CompareGreaterEq:
115     case CompareEq:
116     case CompareEqConstant:
117     case CompareStrictEq:
118     case Call:
119     case Construct:
120     case NativeCall:
121     case NativeConstruct:
122     case Breakpoint:
123     case ProfileWillCall:
124     case ProfileDidCall:
125     case ProfileType:
126     case ProfileControlFlow:
127     case CheckHasInstance:
128     case InstanceOf:
129     case IsUndefined:
130     case IsBoolean:
131     case IsNumber:
132     case IsString:
133     case IsObject:
134     case IsFunction:
135     case TypeOf:
136     case LogicalNot:
137     case ToPrimitive:
138     case ToString:
139     case In:
140     case PhantomArguments:
141     case TearOffArguments:
142     case GetMyArgumentsLength:
143     case GetMyArgumentByVal:
144     case GetMyArgumentsLengthSafe:
145     case GetMyArgumentByValSafe:
146     case CheckArgumentsNotCreated:
147     case Jump:
148     case Branch:
149     case Switch:
150     case Return:
151     case Throw:
152     case CountExecution:
153     case ForceOSRExit:
154     case CheckWatchdogTimer:
155     case StringFromCharCode:
156     case Unreachable:
157     case ExtractOSREntryLocal:
158     case CheckTierUpInLoop:
159     case CheckTierUpAtReturn:
160     case CheckTierUpAndOSREnter:
161     case LoopHint:
162     case StoreBarrier:
163     case StoreBarrierWithNullCheck:
164     case InvalidationPoint:
165     case NotifyWrite:
166     case FunctionReentryWatchpoint:
167     case TypedArrayWatchpoint:
168     case CheckInBounds:
169     case ConstantStoragePointer:
170     case Check:
171     case MultiGetByOffset:
172     case ValueRep:
173     case DoubleRep:
174     case Int52Rep:
175     case GetGetter:
176     case GetSetter:
177     case GetByVal:
178     case GetIndexedPropertyStorage:
179     case GetArrayLength:
180     case ArrayPush:
181     case ArrayPop:
182     case StringCharAt:
183     case StringCharCodeAt:
184     case GetTypedArrayByteOffset:
185     case PutByValDirect:
186     case PutByVal:
187     case PutByValAlias:
188     case PutStructure:
189     case GetByOffset:
190     case GetGetterSetterByOffset:
191     case PutByOffset:
192     case GetEnumerableLength:
193     case HasGenericProperty:
194     case HasStructureProperty:
195     case HasIndexedProperty:
196     case GetDirectPname:
197     case FiatInt52:
198     case BooleanToNumber:
199     case CheckBadCell:
200     case BottomValue:
201     case PhantomNewObject:
202     case PutByOffsetHint:
203     case CheckStructureImmediate:
204     case PutStructureHint:
205     case PutLocal:
206     case KillLocal:
207         return false;
208
209     case CreateActivation:
210     case CreateArguments:
211     case ToThis:
212     case CreateThis:
213     case AllocatePropertyStorage:
214     case ReallocatePropertyStorage:
215     case Arrayify:
216     case ArrayifyToStructure:
217     case NewObject:
218     case NewArray:
219     case NewArrayWithSize:
220     case NewArrayBuffer:
221     case NewRegexp:
222     case NewStringObject:
223     case MakeRope:
224     case NewFunctionNoCheck:
225     case NewFunction:
226     case NewFunctionExpression:
227     case NewTypedArray:
228     case ThrowReferenceError:
229     case GetStructurePropertyEnumerator:
230     case GetGenericPropertyEnumerator:
231     case GetEnumeratorPname:
232     case ToIndexString:
233     case MaterializeNewObject:
234         return true;
235         
236     case MultiPutByOffset:
237         return node->multiPutByOffsetData().reallocatesStorage();
238
239     case LastNodeType:
240         RELEASE_ASSERT_NOT_REACHED();
241         return true;
242     }
243     
244     RELEASE_ASSERT_NOT_REACHED();
245     return true;
246 }
247
248 } } // namespace JSC::DFG
249
250 #endif // ENABLE(DFG_JIT)