[DFG][FTL] Support MapSet / SetAdd intrinsics
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014-2017 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 IdentityWithProfile:
53     case GetCallee:
54     case GetArgumentCountIncludingThis:
55     case GetRestLength:
56     case GetLocal:
57     case SetLocal:
58     case MovHint:
59     case InitializeEntrypointArguments:
60     case ZombieHint:
61     case ExitOK:
62     case Phantom:
63     case Upsilon:
64     case Phi:
65     case Flush:
66     case PhantomLocal:
67     case GetLocalUnlinked:
68     case SetArgument:
69     case BitAnd:
70     case BitOr:
71     case BitXor:
72     case BitLShift:
73     case BitRShift:
74     case BitURShift:
75     case ValueToInt32:
76     case UInt32ToNumber:
77     case DoubleAsInt32:
78     case ArithAdd:
79     case ArithClz32:
80     case ArithSub:
81     case ArithNegate:
82     case ArithMul:
83     case ArithIMul:
84     case ArithDiv:
85     case ArithMod:
86     case ArithAbs:
87     case ArithMin:
88     case ArithMax:
89     case ArithPow:
90     case ArithSqrt:
91     case ArithRandom:
92     case ArithRound:
93     case ArithFloor:
94     case ArithCeil:
95     case ArithTrunc:
96     case ArithFRound:
97     case ArithUnary:
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 DefineDataProperty:
114     case DefineAccessorProperty:
115     case DeleteById:
116     case DeleteByVal:
117     case CheckStructure:
118     case CheckStructureOrEmpty:
119     case CheckStructureImmediate:
120     case GetExecutable:
121     case GetButterfly:
122     case GetButterflyWithoutCaging:
123     case CheckSubClass:
124     case CheckArray:
125     case GetScope:
126     case SkipScope:
127     case GetGlobalObject:
128     case GetGlobalThis:
129     case GetClosureVar:
130     case PutClosureVar:
131     case GetRegExpObjectLastIndex:
132     case SetRegExpObjectLastIndex:
133     case RecordRegExpCachedResult:
134     case GetGlobalVar:
135     case GetGlobalLexicalVariable:
136     case PutGlobalVariable:
137     case CheckCell:
138     case CheckNotEmpty:
139     case CheckStringIdent:
140     case RegExpExec:
141     case RegExpTest:
142     case CompareLess:
143     case CompareLessEq:
144     case CompareGreater:
145     case CompareGreaterEq:
146     case CompareBelow:
147     case CompareBelowEq:
148     case CompareEq:
149     case CompareStrictEq:
150     case CompareEqPtr:
151     case Call:
152     case DirectCall:
153     case TailCallInlinedCaller:
154     case DirectTailCallInlinedCaller:
155     case Construct:
156     case DirectConstruct:
157     case CallVarargs:
158     case CallEval:
159     case TailCallVarargsInlinedCaller:
160     case ConstructVarargs:
161     case LoadVarargs:
162     case CallForwardVarargs:
163     case ConstructForwardVarargs:
164     case TailCallForwardVarargs:
165     case TailCallForwardVarargsInlinedCaller:
166     case ProfileType:
167     case ProfileControlFlow:
168     case OverridesHasInstance:
169     case InstanceOf:
170     case InstanceOfCustom:
171     case IsEmpty:
172     case IsUndefined:
173     case IsBoolean:
174     case IsNumber:
175     case IsObject:
176     case IsObjectOrNull:
177     case IsFunction:
178     case IsCellWithType:
179     case IsTypedArrayView:
180     case TypeOf:
181     case LogicalNot:
182     case ToPrimitive:
183     case ToNumber:
184     case ToString:
185     case CallStringConstructor:
186     case NumberToStringWithRadix:
187     case NumberToStringWithValidRadixConstant:
188     case In:
189     case HasOwnProperty:
190     case Jump:
191     case Branch:
192     case Switch:
193     case EntrySwitch:
194     case Return:
195     case TailCall:
196     case DirectTailCall:
197     case TailCallVarargs:
198     case Throw:
199     case CountExecution:
200     case SuperSamplerBegin:
201     case SuperSamplerEnd:
202     case ForceOSRExit:
203     case CPUIntrinsic:
204     case CheckTraps:
205     case StringFromCharCode:
206     case MapHash:
207     case GetMapBucket:
208     case GetMapBucketHead:
209     case GetMapBucketNext:
210     case LoadKeyFromMapBucket:
211     case LoadValueFromMapBucket:
212     case WeakMapGet:
213     case Unreachable:
214     case ExtractCatchLocal:
215     case ExtractOSREntryLocal:
216     case CheckTierUpInLoop:
217     case CheckTierUpAtReturn:
218     case CheckTierUpAndOSREnter:
219     case LoopHint:
220     case StoreBarrier:
221     case FencedStoreBarrier:
222     case InvalidationPoint:
223     case NotifyWrite:
224     case CheckInBounds:
225     case ConstantStoragePointer:
226     case Check:
227     case CheckTypeInfoFlags:
228     case MultiGetByOffset:
229     case ValueRep:
230     case DoubleRep:
231     case Int52Rep:
232     case GetGetter:
233     case GetSetter:
234     case GetByVal:
235     case GetByValWithThis:
236     case GetIndexedPropertyStorage:
237     case GetArrayLength:
238     case GetVectorLength:
239     case ArrayPush:
240     case ArrayPop:
241     case StringCharAt:
242     case StringCharCodeAt:
243     case GetTypedArrayByteOffset:
244     case GetPrototypeOf:
245     case PutByValDirect:
246     case PutByVal:
247     case PutByValAlias:
248     case PutStructure:
249     case GetByOffset:
250     case GetGetterSetterByOffset:
251     case PutByOffset:
252     case GetEnumerableLength:
253     case HasGenericProperty:
254     case HasStructureProperty:
255     case HasIndexedProperty:
256     case GetDirectPname:
257     case FiatInt52:
258     case BooleanToNumber:
259     case CheckBadCell:
260     case BottomValue:
261     case PhantomNewObject:
262     case PhantomNewFunction:
263     case PhantomNewGeneratorFunction:
264     case PhantomNewAsyncFunction:
265     case PhantomNewAsyncGeneratorFunction:
266     case PhantomCreateActivation:
267     case PhantomDirectArguments:
268     case PhantomCreateRest:
269     case PhantomNewArrayWithSpread:
270     case PhantomSpread:
271     case PhantomClonedArguments:
272     case GetMyArgumentByVal:
273     case GetMyArgumentByValOutOfBounds:
274     case ForwardVarargs:
275     case PutHint:
276     case PutStack:
277     case KillStack:
278     case GetStack:
279     case GetFromArguments:
280     case PutToArguments:
281     case GetArgument:
282     case LogShadowChickenPrologue:
283     case LogShadowChickenTail:
284     case GetDynamicVar:
285     case PutDynamicVar:
286     case ResolveScopeForHoistingFuncDeclInEval:
287     case ResolveScope:
288     case NukeStructureAndSetButterfly:
289     case AtomicsAdd:
290     case AtomicsAnd:
291     case AtomicsCompareExchange:
292     case AtomicsExchange:
293     case AtomicsLoad:
294     case AtomicsOr:
295     case AtomicsStore:
296     case AtomicsSub:
297     case AtomicsXor:
298     case AtomicsIsLockFree:
299         return false;
300
301     case PushWithScope:
302     case CreateActivation:
303     case CreateDirectArguments:
304     case CreateScopedArguments:
305     case CreateClonedArguments:
306     case CallObjectConstructor:
307     case ToObject:
308     case ToThis:
309     case CreateThis:
310     case AllocatePropertyStorage:
311     case ReallocatePropertyStorage:
312     case Arrayify:
313     case ArrayifyToStructure:
314     case NewObject:
315     case NewArray:
316     case NewArrayWithSpread:
317     case Spread:
318     case NewArrayWithSize:
319     case NewArrayBuffer:
320     case NewRegexp:
321     case NewStringObject:
322     case MakeRope:
323     case NewFunction:
324     case NewGeneratorFunction:
325     case NewAsyncGeneratorFunction:
326     case NewAsyncFunction:
327     case NewTypedArray:
328     case ThrowStaticError:
329     case GetPropertyEnumerator:
330     case GetEnumeratorStructurePname:
331     case GetEnumeratorGenericPname:
332     case ToIndexString:
333     case MaterializeNewObject:
334     case MaterializeCreateActivation:
335     case SetFunctionName:
336     case StrCat:
337     case StringReplace:
338     case StringReplaceRegExp:
339     case StringSlice:
340     case CreateRest:
341     case ToLowerCase:
342     case CallDOMGetter:
343     case CallDOM:
344     case ArraySlice:
345     case ArrayIndexOf:
346     case ParseInt: // We might resolve a rope even though we don't clobber anything.
347     case SetAdd:
348     case MapSet:
349         return true;
350         
351     case MultiPutByOffset:
352         return node->multiPutByOffsetData().reallocatesStorage();
353
354     case LastNodeType:
355         RELEASE_ASSERT_NOT_REACHED();
356         return true;
357     }
358     
359     RELEASE_ASSERT_NOT_REACHED();
360     return true;
361 }
362
363 } } // namespace JSC::DFG
364
365 #endif // ENABLE(DFG_JIT)