Rollout r200426 since it causes PLT regressions.
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014-2016 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 (clobbersHeap(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 LazyJSConstant:
51     case Identity:
52     case GetCallee:
53     case GetArgumentCount:
54     case GetRestLength:
55     case GetLocal:
56     case SetLocal:
57     case MovHint:
58     case ZombieHint:
59     case ExitOK:
60     case Phantom:
61     case Upsilon:
62     case Phi:
63     case Flush:
64     case PhantomLocal:
65     case GetLocalUnlinked:
66     case SetArgument:
67     case BitAnd:
68     case BitOr:
69     case BitXor:
70     case BitLShift:
71     case BitRShift:
72     case BitURShift:
73     case ValueToInt32:
74     case UInt32ToNumber:
75     case DoubleAsInt32:
76     case ArithAdd:
77     case ArithClz32:
78     case ArithSub:
79     case ArithNegate:
80     case ArithMul:
81     case ArithIMul:
82     case ArithDiv:
83     case ArithMod:
84     case ArithAbs:
85     case ArithMin:
86     case ArithMax:
87     case ArithPow:
88     case ArithSqrt:
89     case ArithRandom:
90     case ArithRound:
91     case ArithFloor:
92     case ArithCeil:
93     case ArithTrunc:
94     case ArithFRound:
95     case ArithSin:
96     case ArithCos:
97     case ArithLog:
98     case ValueAdd:
99     case TryGetById:
100     case GetById:
101     case GetByIdFlush:
102     case GetByIdWithThis:
103     case PutById:
104     case PutByIdFlush:
105     case PutByIdWithThis:
106     case PutByValWithThis:
107     case PutByIdDirect:
108     case PutGetterById:
109     case PutSetterById:
110     case PutGetterSetterById:
111     case PutGetterByVal:
112     case PutSetterByVal:
113     case DeleteById:
114     case DeleteByVal:
115     case CheckStructure:
116     case GetExecutable:
117     case GetButterfly:
118     case CheckArray:
119     case GetScope:
120     case SkipScope:
121     case GetGlobalObject:
122     case GetClosureVar:
123     case PutClosureVar:
124     case GetRegExpObjectLastIndex:
125     case SetRegExpObjectLastIndex:
126     case RecordRegExpCachedResult:
127     case GetGlobalVar:
128     case GetGlobalLexicalVariable:
129     case PutGlobalVariable:
130     case VarInjectionWatchpoint:
131     case CheckCell:
132     case CheckNotEmpty:
133     case CheckIdent:
134     case RegExpExec:
135     case RegExpTest:
136     case CompareLess:
137     case CompareLessEq:
138     case CompareGreater:
139     case CompareGreaterEq:
140     case CompareEq:
141     case CompareStrictEq:
142     case Call:
143     case TailCallInlinedCaller:
144     case Construct:
145     case CallVarargs:
146     case TailCallVarargsInlinedCaller:
147     case ConstructVarargs:
148     case LoadVarargs:
149     case CallForwardVarargs:
150     case ConstructForwardVarargs:
151     case TailCallForwardVarargs:
152     case TailCallForwardVarargsInlinedCaller:
153     case ProfileWillCall:
154     case ProfileDidCall:
155     case ProfileType:
156     case ProfileControlFlow:
157     case OverridesHasInstance:
158     case InstanceOf:
159     case InstanceOfCustom:
160     case IsEmpty:
161     case IsUndefined:
162     case IsBoolean:
163     case IsNumber:
164     case IsString:
165     case IsObject:
166     case IsObjectOrNull:
167     case IsFunction:
168     case IsRegExpObject:
169     case TypeOf:
170     case LogicalNot:
171     case ToPrimitive:
172     case ToString:
173     case CallStringConstructor:
174     case In:
175     case Jump:
176     case Branch:
177     case Switch:
178     case Return:
179     case TailCall:
180     case TailCallVarargs:
181     case Throw:
182     case CountExecution:
183     case ForceOSRExit:
184     case CheckWatchdogTimer:
185     case StringFromCharCode:
186     case Unreachable:
187     case ExtractOSREntryLocal:
188     case CheckTierUpInLoop:
189     case CheckTierUpAtReturn:
190     case CheckTierUpAndOSREnter:
191     case LoopHint:
192     case StoreBarrier:
193     case InvalidationPoint:
194     case NotifyWrite:
195     case CheckInBounds:
196     case ConstantStoragePointer:
197     case Check:
198     case CheckTypeInfoFlags:
199     case MultiGetByOffset:
200     case ValueRep:
201     case DoubleRep:
202     case Int52Rep:
203     case GetGetter:
204     case GetSetter:
205     case GetByVal:
206     case GetByValWithThis:
207     case GetIndexedPropertyStorage:
208     case GetArrayLength:
209     case ArrayPush:
210     case ArrayPop:
211     case StringCharAt:
212     case StringCharCodeAt:
213     case GetTypedArrayByteOffset:
214     case PutByValDirect:
215     case PutByVal:
216     case PutByValAlias:
217     case PutStructure:
218     case GetByOffset:
219     case GetGetterSetterByOffset:
220     case PutByOffset:
221     case GetEnumerableLength:
222     case HasGenericProperty:
223     case HasStructureProperty:
224     case HasIndexedProperty:
225     case GetDirectPname:
226     case FiatInt52:
227     case BooleanToNumber:
228     case CheckBadCell:
229     case BottomValue:
230     case PhantomNewObject:
231     case PhantomNewFunction:
232     case PhantomNewGeneratorFunction:
233     case PhantomCreateActivation:
234     case PhantomDirectArguments:
235     case PhantomClonedArguments:
236     case GetMyArgumentByVal:
237     case GetMyArgumentByValOutOfBounds:
238     case ForwardVarargs:
239     case PutHint:
240     case CheckStructureImmediate:
241     case PutStack:
242     case KillStack:
243     case GetStack:
244     case GetFromArguments:
245     case PutToArguments:
246     case CopyRest:
247     case LogShadowChickenPrologue:
248     case LogShadowChickenTail:
249     case GetDynamicVar:
250     case PutDynamicVar:
251     case ResolveScope:
252         return false;
253
254     case CreateActivation:
255     case CreateDirectArguments:
256     case CreateScopedArguments:
257     case CreateClonedArguments:
258     case ToThis:
259     case CreateThis:
260     case AllocatePropertyStorage:
261     case ReallocatePropertyStorage:
262     case Arrayify:
263     case ArrayifyToStructure:
264     case NewObject:
265     case NewArray:
266     case NewArrayWithSize:
267     case NewArrayBuffer:
268     case NewRegexp:
269     case NewStringObject:
270     case MakeRope:
271     case NewFunction:
272     case NewGeneratorFunction:
273     case NewTypedArray:
274     case ThrowReferenceError:
275     case GetPropertyEnumerator:
276     case GetEnumeratorStructurePname:
277     case GetEnumeratorGenericPname:
278     case ToIndexString:
279     case MaterializeNewObject:
280     case MaterializeCreateActivation:
281     case SetFunctionName:
282     case StrCat:
283     case StringReplace:
284     case StringReplaceRegExp:
285         return true;
286         
287     case MultiPutByOffset:
288         return node->multiPutByOffsetData().reallocatesStorage();
289
290     case LastNodeType:
291         RELEASE_ASSERT_NOT_REACHED();
292         return true;
293     }
294     
295     RELEASE_ASSERT_NOT_REACHED();
296     return true;
297 }
298
299 } } // namespace JSC::DFG
300
301 #endif // ENABLE(DFG_JIT)