diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp | 120 |
1 files changed, 20 insertions, 100 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp b/Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp index 78df55009..39e296a3d 100644 --- a/Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp +++ b/Source/JavaScriptCore/dfg/DFGWatchpointCollectionPhase.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013-2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,7 +32,15 @@ #include "DFGClobberize.h" #include "DFGGraph.h" #include "DFGPhase.h" -#include "Operations.h" +#include "JSCInlines.h" + +// FIXME: Remove this phase entirely by moving the addLazily() calls into either the backend or +// into the phase that performs the optimization. Moving the calls into the backend makes the most +// sense when the intermediate phases don't need to know that the watchpoint was set. Moving the +// calls earlier usually only makes sense if the node's only purpose was to convey the need for +// the watchpoint (like VarInjectionWatchpoint). But, it can also make sense if the fact that the +// watchpoint was set enables other optimizations. +// https://bugs.webkit.org/show_bug.cgi?id=144669 namespace JSC { namespace DFG { @@ -64,10 +72,7 @@ public: private: void handle() { - DFG_NODE_DO_TO_CHILDREN(m_graph, m_node, handleEdge); - switch (m_node->op()) { - case CompareEqConstant: case IsUndefined: handleMasqueradesAsUndefined(); break; @@ -75,71 +80,21 @@ private: case CompareEq: if (m_node->isBinaryUseKind(ObjectUse) || (m_node->child1().useKind() == ObjectUse && m_node->child2().useKind() == ObjectOrOtherUse) - || (m_node->child1().useKind() == ObjectOrOtherUse && m_node->child2().useKind() == ObjectUse)) + || (m_node->child1().useKind() == ObjectOrOtherUse && m_node->child2().useKind() == ObjectUse) + || (m_node->child1().useKind() == OtherUse || m_node->child2().useKind() == OtherUse)) handleMasqueradesAsUndefined(); break; case LogicalNot: case Branch: - if (m_node->child1().useKind() == ObjectOrOtherUse) + switch (m_node->child1().useKind()) { + case ObjectOrOtherUse: + case UntypedUse: handleMasqueradesAsUndefined(); - break; - - case GetByVal: - if (m_node->arrayMode().type() == Array::Double - && m_node->arrayMode().isSaneChain()) { - addLazily(globalObject()->arrayPrototype()->structure()->transitionWatchpointSet()); - addLazily(globalObject()->objectPrototype()->structure()->transitionWatchpointSet()); + break; + default: + break; } - - if (m_node->arrayMode().type() == Array::String) - handleStringGetByVal(); - - if (JSArrayBufferView* view = m_graph.tryGetFoldableViewForChild1(m_node)) - addLazily(view); - break; - - case PutByVal: - if (JSArrayBufferView* view = m_graph.tryGetFoldableViewForChild1(m_node)) - addLazily(view); - break; - - case StringCharAt: - handleStringGetByVal(); - break; - - case NewArray: - case NewArrayWithSize: - case NewArrayBuffer: - if (!globalObject()->isHavingABadTime() && !hasArrayStorage(m_node->indexingType())) - addLazily(globalObject()->havingABadTimeWatchpoint()); - break; - - case AllocationProfileWatchpoint: - addLazily(jsCast<JSFunction*>(m_node->function())->allocationProfileWatchpointSet()); - break; - - case StructureTransitionWatchpoint: - m_graph.watchpoints().addLazily( - m_node->codeOrigin, - m_node->child1()->op() == WeakJSConstant ? BadWeakConstantCacheWatchpoint : BadCacheWatchpoint, - m_node->structure()->transitionWatchpointSet()); - break; - - case VariableWatchpoint: - addLazily(m_node->variableWatchpointSet()); - break; - - case VarInjectionWatchpoint: - addLazily(globalObject()->varInjectionWatchpoint()); - break; - - case FunctionReentryWatchpoint: - addLazily(m_node->symbolTable()->m_functionEnteredOnce); - break; - - case TypedArrayWatchpoint: - addLazily(m_node->typedArray()); break; default: @@ -147,42 +102,12 @@ private: } } - void handleEdge(Node*, Edge edge) - { - switch (edge.useKind()) { - case StringObjectUse: - case StringOrStringObjectUse: { - Structure* stringObjectStructure = globalObject()->stringObjectStructure(); - Structure* stringPrototypeStructure = stringObjectStructure->storedPrototype().asCell()->structure(); - ASSERT(m_graph.watchpoints().isValidOrMixed(stringPrototypeStructure->transitionWatchpointSet())); - - m_graph.watchpoints().addLazily( - m_node->codeOrigin, NotStringObject, - stringPrototypeStructure->transitionWatchpointSet()); - break; - } - - default: - break; - } - } - void handleMasqueradesAsUndefined() { - if (m_graph.masqueradesAsUndefinedWatchpointIsStillValid(m_node->codeOrigin)) + if (m_graph.masqueradesAsUndefinedWatchpointIsStillValid(m_node->origin.semantic)) addLazily(globalObject()->masqueradesAsUndefinedWatchpoint()); } - void handleStringGetByVal() - { - if (!m_node->arrayMode().isOutOfBounds()) - return; - if (!globalObject()->stringPrototypeChainIsSane()) - return; - addLazily(globalObject()->stringPrototype()->structure()->transitionWatchpointSet()); - addLazily(globalObject()->objectPrototype()->structure()->transitionWatchpointSet()); - } - void addLazily(WatchpointSet* set) { m_graph.watchpoints().addLazily(set); @@ -191,14 +116,10 @@ private: { m_graph.watchpoints().addLazily(set); } - void addLazily(JSArrayBufferView* view) - { - m_graph.watchpoints().addLazily(view); - } JSGlobalObject* globalObject() { - return m_graph.globalObjectFor(m_node->codeOrigin); + return m_graph.globalObjectFor(m_node->origin.semantic); } Node* m_node; @@ -206,7 +127,6 @@ private: bool performWatchpointCollection(Graph& graph) { - SamplingRegion samplingRegion("DFG Watchpoint Collection Phase"); return runPhase<WatchpointCollectionPhase>(graph); } |