[BigInt] Add ValueSub into DFG
[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 SetCallee:
55     case GetArgumentCountIncludingThis:
56     case SetArgumentCountIncludingThis:
57     case GetRestLength:
58     case GetLocal:
59     case SetLocal:
60     case MovHint:
61     case InitializeEntrypointArguments:
62     case ZombieHint:
63     case ExitOK:
64     case Phantom:
65     case Upsilon:
66     case Phi:
67     case Flush:
68     case PhantomLocal:
69     case SetArgument:
70     case ArithBitAnd:
71     case ArithBitOr:
72     case BitXor:
73     case BitLShift:
74     case BitRShift:
75     case BitURShift:
76     case ValueToInt32:
77     case UInt32ToNumber:
78     case DoubleAsInt32:
79     case ArithAdd:
80     case ArithClz32:
81     case ArithSub:
82     case ArithNegate:
83     case ArithMul:
84     case ArithIMul:
85     case ArithDiv:
86     case ArithMod:
87     case ArithAbs:
88     case ArithMin:
89     case ArithMax:
90     case ArithPow:
91     case ArithSqrt:
92     case ArithRandom:
93     case ArithRound:
94     case ArithFloor:
95     case ArithCeil:
96     case ArithTrunc:
97     case ArithFRound:
98     case ArithUnary:
99     case ValueBitAnd:
100     case ValueBitOr:
101     case ValueAdd:
102     case ValueSub:
103     case ValueNegate:
104     case TryGetById:
105     case GetById:
106     case GetByIdFlush:
107     case GetByIdWithThis:
108     case GetByIdDirect:
109     case GetByIdDirectFlush:
110     case PutById:
111     case PutByIdFlush:
112     case PutByIdWithThis:
113     case PutByValWithThis:
114     case PutByIdDirect:
115     case PutGetterById:
116     case PutSetterById:
117     case PutGetterSetterById:
118     case PutGetterByVal:
119     case PutSetterByVal:
120     case DefineDataProperty:
121     case DefineAccessorProperty:
122     case DeleteById:
123     case DeleteByVal:
124     case CheckStructure:
125     case CheckStructureOrEmpty:
126     case CheckStructureImmediate:
127     case GetExecutable:
128     case GetButterfly:
129     case CheckSubClass:
130     case CheckArray:
131     case GetScope:
132     case SkipScope:
133     case GetGlobalObject:
134     case GetGlobalThis:
135     case GetClosureVar:
136     case PutClosureVar:
137     case GetRegExpObjectLastIndex:
138     case SetRegExpObjectLastIndex:
139     case RecordRegExpCachedResult:
140     case GetGlobalVar:
141     case GetGlobalLexicalVariable:
142     case PutGlobalVariable:
143     case CheckCell:
144     case CheckNotEmpty:
145     case AssertNotEmpty:
146     case CheckStringIdent:
147     case RegExpExec:
148     case RegExpExecNonGlobalOrSticky:
149     case RegExpTest:
150     case RegExpMatchFast:
151     case RegExpMatchFastGlobal:
152     case CompareLess:
153     case CompareLessEq:
154     case CompareGreater:
155     case CompareGreaterEq:
156     case CompareBelow:
157     case CompareBelowEq:
158     case CompareEq:
159     case CompareStrictEq:
160     case CompareEqPtr:
161     case SameValue:
162     case Call:
163     case DirectCall:
164     case TailCallInlinedCaller:
165     case DirectTailCallInlinedCaller:
166     case Construct:
167     case DirectConstruct:
168     case CallVarargs:
169     case CallEval:
170     case TailCallVarargsInlinedCaller:
171     case ConstructVarargs:
172     case LoadVarargs:
173     case CallForwardVarargs:
174     case ConstructForwardVarargs:
175     case TailCallForwardVarargs:
176     case TailCallForwardVarargsInlinedCaller:
177     case ProfileType:
178     case ProfileControlFlow:
179     case OverridesHasInstance:
180     case InstanceOf:
181     case InstanceOfCustom:
182     case IsEmpty:
183     case IsUndefined:
184     case IsBoolean:
185     case IsNumber:
186     case NumberIsInteger:
187     case IsObject:
188     case IsObjectOrNull:
189     case IsFunction:
190     case IsCellWithType:
191     case IsTypedArrayView:
192     case TypeOf:
193     case LogicalNot:
194     case ToPrimitive:
195     case ToNumber:
196     case ToString:
197     case CallStringConstructor:
198     case NumberToStringWithRadix:
199     case NumberToStringWithValidRadixConstant:
200     case InByVal:
201     case InById:
202     case HasOwnProperty:
203     case Jump:
204     case Branch:
205     case Switch:
206     case EntrySwitch:
207     case Return:
208     case TailCall:
209     case DirectTailCall:
210     case TailCallVarargs:
211     case Throw:
212     case CountExecution:
213     case SuperSamplerBegin:
214     case SuperSamplerEnd:
215     case ForceOSRExit:
216     case CPUIntrinsic:
217     case CheckTraps:
218     case StringFromCharCode:
219     case NormalizeMapKey:
220     case GetMapBucket:
221     case GetMapBucketHead:
222     case GetMapBucketNext:
223     case LoadKeyFromMapBucket:
224     case LoadValueFromMapBucket:
225     case ExtractValueFromWeakMapGet:
226     case WeakMapGet:
227     case WeakSetAdd:
228     case WeakMapSet:
229     case Unreachable:
230     case ExtractOSREntryLocal:
231     case ExtractCatchLocal:
232     case ClearCatchLocals:
233     case CheckTierUpInLoop:
234     case CheckTierUpAtReturn:
235     case CheckTierUpAndOSREnter:
236     case LoopHint:
237     case StoreBarrier:
238     case FencedStoreBarrier:
239     case InvalidationPoint:
240     case NotifyWrite:
241     case CheckInBounds:
242     case ConstantStoragePointer:
243     case Check:
244     case CheckVarargs:
245     case CheckTypeInfoFlags:
246     case MultiGetByOffset:
247     case ValueRep:
248     case DoubleRep:
249     case Int52Rep:
250     case GetGetter:
251     case GetSetter:
252     case GetByVal:
253     case GetByValWithThis:
254     case GetArrayLength:
255     case GetVectorLength:
256     case ArrayPush:
257     case ArrayPop:
258     case StringCharAt:
259     case StringCharCodeAt:
260     case GetTypedArrayByteOffset:
261     case GetPrototypeOf:
262     case PutByValDirect:
263     case PutByVal:
264     case PutByValAlias:
265     case PutStructure:
266     case GetByOffset:
267     case GetGetterSetterByOffset:
268     case PutByOffset:
269     case GetEnumerableLength:
270     case HasGenericProperty:
271     case HasStructureProperty:
272     case HasIndexedProperty:
273     case GetDirectPname:
274     case FiatInt52:
275     case BooleanToNumber:
276     case CheckBadCell:
277     case BottomValue:
278     case PhantomNewObject:
279     case PhantomNewFunction:
280     case PhantomNewGeneratorFunction:
281     case PhantomNewAsyncFunction:
282     case PhantomNewAsyncGeneratorFunction:
283     case PhantomCreateActivation:
284     case PhantomDirectArguments:
285     case PhantomCreateRest:
286     case PhantomNewArrayWithSpread:
287     case PhantomNewArrayBuffer:
288     case PhantomSpread:
289     case PhantomClonedArguments:
290     case PhantomNewRegexp:
291     case GetMyArgumentByVal:
292     case GetMyArgumentByValOutOfBounds:
293     case ForwardVarargs:
294     case PutHint:
295     case PutStack:
296     case KillStack:
297     case GetStack:
298     case GetFromArguments:
299     case PutToArguments:
300     case GetArgument:
301     case LogShadowChickenPrologue:
302     case LogShadowChickenTail:
303     case GetDynamicVar:
304     case PutDynamicVar:
305     case ResolveScopeForHoistingFuncDeclInEval:
306     case ResolveScope:
307     case NukeStructureAndSetButterfly:
308     case AtomicsAdd:
309     case AtomicsAnd:
310     case AtomicsCompareExchange:
311     case AtomicsExchange:
312     case AtomicsLoad:
313     case AtomicsOr:
314     case AtomicsStore:
315     case AtomicsSub:
316     case AtomicsXor:
317     case AtomicsIsLockFree:
318     case MatchStructure:
319     case FilterCallLinkStatus:
320     case FilterGetByIdStatus:
321     case FilterPutByIdStatus:
322     case FilterInByIdStatus:
323     case DataViewGetInt:
324     case DataViewGetFloat:
325     case DataViewSet:
326         return false;
327
328     case PushWithScope:
329     case CreateActivation:
330     case CreateDirectArguments:
331     case CreateScopedArguments:
332     case CreateClonedArguments:
333     case CallObjectConstructor:
334     case ToObject:
335     case ToThis:
336     case CreateThis:
337     case ObjectCreate:
338     case AllocatePropertyStorage:
339     case ReallocatePropertyStorage:
340     case Arrayify:
341     case ArrayifyToStructure:
342     case NewObject:
343     case NewArray:
344     case NewArrayWithSpread:
345     case Spread:
346     case NewArrayWithSize:
347     case NewArrayBuffer:
348     case NewRegexp:
349     case NewStringObject:
350     case MakeRope:
351     case NewFunction:
352     case NewGeneratorFunction:
353     case NewAsyncGeneratorFunction:
354     case NewAsyncFunction:
355     case NewTypedArray:
356     case ThrowStaticError:
357     case GetPropertyEnumerator:
358     case GetEnumeratorStructurePname:
359     case GetEnumeratorGenericPname:
360     case ToIndexString:
361     case MaterializeNewObject:
362     case MaterializeCreateActivation:
363     case SetFunctionName:
364     case StrCat:
365     case StringReplace:
366     case StringReplaceRegExp:
367     case StringSlice:
368     case StringValueOf:
369     case CreateRest:
370     case ToLowerCase:
371     case CallDOMGetter:
372     case CallDOM:
373     case ArraySlice:
374     case ArrayIndexOf:
375     case ParseInt: // We might resolve a rope even though we don't clobber anything.
376     case SetAdd:
377     case MapSet:
378         return true;
379
380     case GetIndexedPropertyStorage:
381         if (node->arrayMode().type() == Array::String)
382             return true;
383         return false;
384
385     case MapHash:
386         switch (node->child1().useKind()) {
387         case BooleanUse:
388         case Int32Use:
389         case SymbolUse:
390         case ObjectUse:
391             return false;
392         default:
393             // We might resolve a rope.
394             return true;
395         }
396         
397     case MultiPutByOffset:
398         return node->multiPutByOffsetData().reallocatesStorage();
399
400     case LastNodeType:
401         RELEASE_ASSERT_NOT_REACHED();
402         return true;
403     }
404     
405     RELEASE_ASSERT_NOT_REACHED();
406     return true;
407 }
408
409 } } // namespace JSC::DFG
410
411 #endif // ENABLE(DFG_JIT)