Changeset 183072 in webkit


Ignore:
Timestamp:
Apr 21, 2015 1:16:18 PM (9 years ago)
Author:
fpizlo@apple.com
Message:

MovHint should be a strong use
https://bugs.webkit.org/show_bug.cgi?id=143734

Reviewed by Geoffrey Garen.

This disables any DCE that assumes equivalence between DFG IR uses and bytecode uses. Doing
so is a major step towards allowing more fancy DFG transformations and also probably fixing
some bugs.

Just making MovHint a strong use would also completely disable DCE. So we mitigate this by
introducing a MovHint removal phase that runs in FTL.

This is a slight slowdown on Octane/gbemu, but it's basically neutral on suite averages.

(JSC::InlineCallFrame::dumpInContext):

  • dfg/DFGDCEPhase.cpp:

(JSC::DFG::DCEPhase::fixupBlock):

  • dfg/DFGDisassembler.cpp:

(JSC::DFG::Disassembler::createDumpList):

  • dfg/DFGEpoch.cpp: Added.

(JSC::DFG::Epoch::dump):

  • dfg/DFGEpoch.h: Added.

(JSC::DFG::Epoch::Epoch):
(JSC::DFG::Epoch::first):
(JSC::DFG::Epoch::operator!):
(JSC::DFG::Epoch::next):
(JSC::DFG::Epoch::bump):
(JSC::DFG::Epoch::operator==):
(JSC::DFG::Epoch::operator!=):

  • dfg/DFGMayExit.cpp:

(JSC::DFG::mayExit):

  • dfg/DFGMovHintRemovalPhase.cpp: Added.

(JSC::DFG::performMovHintRemoval):

  • dfg/DFGMovHintRemovalPhase.h: Added.
  • dfg/DFGNodeType.h:
  • dfg/DFGPlan.cpp:

(JSC::DFG::Plan::compileInThreadImpl):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileCurrentBlock):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • runtime/Options.h:
Location:
trunk/Source/JavaScriptCore
Files:
4 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r182997 r183072  
    157157    dfg/DFGDriver.cpp
    158158    dfg/DFGEdge.cpp
     159    dfg/DFGEpoch.cpp
    159160    dfg/DFGFailedFinalizer.cpp
    160161    dfg/DFGFinalizer.cpp
     
    182183    dfg/DFGMayExit.cpp
    183184    dfg/DFGMinifiedNode.cpp
     185    dfg/DFGMovHintRemovalPhase.cpp
    184186    dfg/DFGNaiveDominators.cpp
    185187    dfg/DFGNaturalLoops.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r183069 r183072  
     12015-04-19  Filip Pizlo  <fpizlo@apple.com>
     2
     3        MovHint should be a strong use
     4        https://bugs.webkit.org/show_bug.cgi?id=143734
     5
     6        Reviewed by Geoffrey Garen.
     7       
     8        This disables any DCE that assumes equivalence between DFG IR uses and bytecode uses. Doing
     9        so is a major step towards allowing more fancy DFG transformations and also probably fixing
     10        some bugs.
     11       
     12        Just making MovHint a strong use would also completely disable DCE. So we mitigate this by
     13        introducing a MovHint removal phase that runs in FTL.
     14       
     15        This is a slight slowdown on Octane/gbemu, but it's basically neutral on suite averages.
     16
     17        * CMakeLists.txt:
     18        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
     19        * JavaScriptCore.xcodeproj/project.pbxproj:
     20        * bytecode/CodeOrigin.cpp:
     21        (JSC::InlineCallFrame::dumpInContext):
     22        * dfg/DFGDCEPhase.cpp:
     23        (JSC::DFG::DCEPhase::fixupBlock):
     24        * dfg/DFGDisassembler.cpp:
     25        (JSC::DFG::Disassembler::createDumpList):
     26        * dfg/DFGEpoch.cpp: Added.
     27        (JSC::DFG::Epoch::dump):
     28        * dfg/DFGEpoch.h: Added.
     29        (JSC::DFG::Epoch::Epoch):
     30        (JSC::DFG::Epoch::first):
     31        (JSC::DFG::Epoch::operator!):
     32        (JSC::DFG::Epoch::next):
     33        (JSC::DFG::Epoch::bump):
     34        (JSC::DFG::Epoch::operator==):
     35        (JSC::DFG::Epoch::operator!=):
     36        * dfg/DFGMayExit.cpp:
     37        (JSC::DFG::mayExit):
     38        * dfg/DFGMovHintRemovalPhase.cpp: Added.
     39        (JSC::DFG::performMovHintRemoval):
     40        * dfg/DFGMovHintRemovalPhase.h: Added.
     41        * dfg/DFGNodeType.h:
     42        * dfg/DFGPlan.cpp:
     43        (JSC::DFG::Plan::compileInThreadImpl):
     44        * dfg/DFGSpeculativeJIT.cpp:
     45        (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
     46        * dfg/DFGSpeculativeJIT64.cpp:
     47        (JSC::DFG::SpeculativeJIT::compile):
     48        * runtime/Options.h:
     49
    1502015-04-21  Basile Clement  <basile_clement@apple.com>
    251
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj

    r182997 r183072  
    401401    <ClCompile Include="..\dfg\DFGDriver.cpp" />
    402402    <ClCompile Include="..\dfg\DFGEdge.cpp" />
     403    <ClCompile Include="..\dfg\DFGEpoch.cpp" />
    403404    <ClCompile Include="..\dfg\DFGFailedFinalizer.cpp" />
    404405    <ClCompile Include="..\dfg\DFGFinalizer.cpp" />
     
    426427    <ClCompile Include="..\dfg\DFGMayExit.cpp" />
    427428    <ClCompile Include="..\dfg\DFGMinifiedNode.cpp" />
     429    <ClCompile Include="..\dfg\DFGMovHintRemovalPhase.cpp" />
    428430    <ClCompile Include="..\dfg\DFGNaiveDominators.cpp" />
    429431    <ClCompile Include="..\dfg\DFGNaturalLoops.cpp" />
     
    10821084    <ClInclude Include="..\dfg\DFGEdgeDominates.h" />
    10831085    <ClInclude Include="..\dfg\DFGEdgeUsesStructure.h" />
     1086    <ClInclude Include="..\dfg\DFGEpoch.h" />
    10841087    <ClInclude Include="..\dfg\DFGFailedFinalizer.h" />
    10851088    <ClInclude Include="..\dfg\DFGFiltrationResult.h" />
     
    11161119    <ClInclude Include="..\dfg\DFGMinifiedID.h" />
    11171120    <ClInclude Include="..\dfg\DFGMinifiedNode.h" />
     1121    <ClInclude Include="..\dfg\DFGMovHintRemovalPhase.h" />
    11181122    <ClInclude Include="..\dfg\DFGNaiveDominators.h" />
    11191123    <ClInclude Include="..\dfg\DFGNaturalLoops.h" />
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r182997 r183072  
    417417                0F885E111849A3BE00F1E3FA /* BytecodeUseDef.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F885E101849A3BE00F1E3FA /* BytecodeUseDef.h */; settings = {ATTRIBUTES = (Private, ); }; };
    418418                0F893BDB1936E23C001211F4 /* DFGStructureAbstractValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F893BDA1936E23C001211F4 /* DFGStructureAbstractValue.cpp */; };
     419                0F8F14331ADF090100ED792C /* DFGEpoch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F142F1ADF090100ED792C /* DFGEpoch.cpp */; };
     420                0F8F14341ADF090100ED792C /* DFGEpoch.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F14301ADF090100ED792C /* DFGEpoch.h */; settings = {ATTRIBUTES = (Private, ); }; };
     421                0F8F14351ADF090100ED792C /* DFGMovHintRemovalPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F14311ADF090100ED792C /* DFGMovHintRemovalPhase.cpp */; };
     422                0F8F14361ADF090100ED792C /* DFGMovHintRemovalPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F14321ADF090100ED792C /* DFGMovHintRemovalPhase.h */; settings = {ATTRIBUTES = (Private, ); }; };
    419423                0F8F2B95172E04A0007DBDA5 /* FTLLink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */; };
    420424                0F8F2B96172E04A3007DBDA5 /* FTLLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F2B94172E049E007DBDA5 /* FTLLink.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    21432147                0F885E101849A3BE00F1E3FA /* BytecodeUseDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeUseDef.h; sourceTree = "<group>"; };
    21442148                0F893BDA1936E23C001211F4 /* DFGStructureAbstractValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGStructureAbstractValue.cpp; path = dfg/DFGStructureAbstractValue.cpp; sourceTree = "<group>"; };
     2149                0F8F142F1ADF090100ED792C /* DFGEpoch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGEpoch.cpp; path = dfg/DFGEpoch.cpp; sourceTree = "<group>"; };
     2150                0F8F14301ADF090100ED792C /* DFGEpoch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGEpoch.h; path = dfg/DFGEpoch.h; sourceTree = "<group>"; };
     2151                0F8F14311ADF090100ED792C /* DFGMovHintRemovalPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGMovHintRemovalPhase.cpp; path = dfg/DFGMovHintRemovalPhase.cpp; sourceTree = "<group>"; };
     2152                0F8F14321ADF090100ED792C /* DFGMovHintRemovalPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGMovHintRemovalPhase.h; path = dfg/DFGMovHintRemovalPhase.h; sourceTree = "<group>"; };
    21452153                0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FTLLink.cpp; path = ftl/FTLLink.cpp; sourceTree = "<group>"; };
    21462154                0F8F2B94172E049E007DBDA5 /* FTLLink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FTLLink.h; path = ftl/FTLLink.h; sourceTree = "<group>"; };
     
    49074915                                A7D9A29117A0BC7400EE2618 /* DFGEdgeDominates.h */,
    49084916                                A7986D5617A0BB1E00A95DD0 /* DFGEdgeUsesStructure.h */,
     4917                                0F8F142F1ADF090100ED792C /* DFGEpoch.cpp */,
     4918                                0F8F14301ADF090100ED792C /* DFGEpoch.h */,
    49094919                                A78A976C179738B8009DF744 /* DFGFailedFinalizer.cpp */,
    49104920                                A78A976D179738B8009DF744 /* DFGFailedFinalizer.h */,
     
    49664976                                0F2BDC4C1522818300CD8910 /* DFGMinifiedNode.cpp */,
    49674977                                0F2BDC3E1522801700CD8910 /* DFGMinifiedNode.h */,
     4978                                0F8F14311ADF090100ED792C /* DFGMovHintRemovalPhase.cpp */,
     4979                                0F8F14321ADF090100ED792C /* DFGMovHintRemovalPhase.h */,
    49684980                                0FC3CCFA19ADA410006AC72A /* DFGNaiveDominators.cpp */,
    49694981                                0FC3CCFB19ADA410006AC72A /* DFGNaiveDominators.h */,
     
    56615673                                C2FCAE1317A9C24E0034C735 /* BytecodeLivenessAnalysis.h in Headers */,
    56625674                                0F666EC0183566F900D017F1 /* BytecodeLivenessAnalysisInlines.h in Headers */,
     5675                                0F8F14361ADF090100ED792C /* DFGMovHintRemovalPhase.h in Headers */,
    56635676                                0F885E111849A3BE00F1E3FA /* BytecodeUseDef.h in Headers */,
    56645677                                0F8023EA1613832B00A0BA45 /* ByValInfo.h in Headers */,
     
    62946307                                0F34B14C16D43E0D001CDA5A /* PolymorphicAccessStructureList.h in Headers */,
    62956308                                0F9FC8C414E1B60000D52AE0 /* PolymorphicPutByIdList.h in Headers */,
     6309                                0F8F14341ADF090100ED792C /* DFGEpoch.h in Headers */,
    62966310                                0F98206116BFE38300240D02 /* PreciseJumpTargets.h in Headers */,
    62976311                                0F2DD8151AB3D8BE00BBB8E8 /* DFGForAllKills.h in Headers */,
     
    73767390                                86E3C61A167BABEE006D760A /* JSValue.mm in Sources */,
    73777391                                0FF8BDEA1AD4CF7100DFE884 /* InferredValue.cpp in Sources */,
     7392                                0F8F14351ADF090100ED792C /* DFGMovHintRemovalPhase.cpp in Sources */,
    73787393                                14BD5A320A3E91F600BAF59C /* JSValueRef.cpp in Sources */,
    73797394                                147F39D7107EC37600427A48 /* JSEnvironmentRecord.cpp in Sources */,
     
    75167531                                14469DEB107EC7E700650446 /* StringConstructor.cpp in Sources */,
    75177532                                14469DEC107EC7E700650446 /* StringObject.cpp in Sources */,
     7533                                0F8F14331ADF090100ED792C /* DFGEpoch.cpp in Sources */,
    75187534                                14469DED107EC7E700650446 /* StringPrototype.cpp in Sources */,
    75197535                                0F2D4DEF19832DD3007D4B19 /* TypeSet.cpp in Sources */,
  • trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp

    r182759 r183072  
    197197        out.print(", known callee: ", inContext(calleeRecovery.constant(), context));
    198198    out.print(", numArgs+this = ", arguments.size());
    199     out.print(", stack < loc", VirtualRegister(stackOffset).toLocal());
    200     out.print(">");
     199    out.print(", stackOffset = ", stackOffset);
     200    out.print(" (", virtualRegisterForLocal(0), " maps to ", virtualRegisterForLocal(0) + stackOffset, ")>");
    201201}
    202202
  • trunk/Source/JavaScriptCore/dfg/DFGDCEPhase.cpp

    r181993 r183072  
    144144               
    145145            switch (node->op()) {
    146             case MovHint: {
    147                 // Check if the child is dead. MovHint's child would only be a Phantom or
    148                 // Check if we had just killed it.
    149                 if (node->child1()->op() == Phantom || node->child1()->op() == Check) {
    150                     node->setOpAndDefaultFlags(ZombieHint);
    151                     node->child1() = Edge();
    152                     break;
    153                 }
    154                 break;
    155             }
    156                
    157             case ZombieHint: {
    158                 // Currently we assume that DCE runs only once.
     146            case MovHint:
     147            case ZombieHint:
     148                // These are not killable. (They once were.)
    159149                RELEASE_ASSERT_NOT_REACHED();
    160                 break;
    161             }
    162            
     150               
    163151            default: {
    164152                if (node->flags() & NodeHasVarArgs) {
  • trunk/Source/JavaScriptCore/dfg/DFGDisassembler.cpp

    r170876 r183072  
    113113        Node* lastNodeForDisassembly = block->at(0);
    114114        for (size_t i = 0; i < block->size(); ++i) {
    115             if (!block->at(i)->willHaveCodeGenOrOSR() && !Options::showAllDFGNodes())
    116                 continue;
    117115            MacroAssembler::Label currentLabel;
    118116            HashMap<Node*, MacroAssembler::Label>::iterator iter = m_labelForNode.find(block->at(i));
  • trunk/Source/JavaScriptCore/dfg/DFGMayExit.cpp

    r181993 r183072  
    6060{
    6161    switch (node->op()) {
     62    // This is a carefully curated list of nodes that definitely do not exit. We try to be very
     63    // conservative when maintaining this list, because adding new node types to it doesn't
     64    // generally make things a lot better but it might introduce insanely subtle bugs.
    6265    case SetArgument:
    6366    case JSConstant:
  • trunk/Source/JavaScriptCore/dfg/DFGNodeType.h

    r183040 r183072  
    6464    macro(GetStack, NodeResultJS) \
    6565    \
    66     macro(MovHint, 0) \
    67     macro(ZombieHint, 0) \
     66    macro(MovHint, NodeMustGenerate) \
     67    macro(ZombieHint, NodeMustGenerate) \
    6868    macro(Phantom, NodeMustGenerate) \
    6969    macro(HardPhantom, NodeMustGenerate) /* Like Phantom, but we never remove any of its children. */ \
  • trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp

    r182318 r183072  
    4848#include "DFGLivenessAnalysisPhase.h"
    4949#include "DFGLoopPreHeaderCreationPhase.h"
     50#include "DFGMovHintRemovalPhase.h"
    5051#include "DFGOSRAvailabilityAnalysisPhase.h"
    5152#include "DFGOSREntrypointCreationPhase.h"
     
    393394        if (Options::validateFTLOSRExitLiveness())
    394395            performResurrectionForValidation(dfg);
     396        if (Options::enableMovHintRemoval())
     397            performMovHintRemoval(dfg);
    395398        performDCE(dfg); // We rely on this to kill dead code that won't be recognized as dead by LLVM.
    396399        performStackLayout(dfg);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r182959 r183072  
    14301430        m_lastGeneratedNode = m_currentNode->op();
    14311431        if (!m_currentNode->shouldGenerate()) {
    1432             switch (m_currentNode->op()) {
    1433             case JSConstant:
     1432            if (belongsInMinifiedGraph(m_currentNode->op()))
    14341433                m_minifiedGraph->append(MinifiedNode::fromNode(m_currentNode));
    1435                 break;
    1436                
    1437             case SetLocal:
    1438                 RELEASE_ASSERT_NOT_REACHED();
    1439                 break;
    1440                
    1441             case MovHint:
    1442                 compileMovHint(m_currentNode);
    1443                 break;
    1444                
    1445             case ZombieHint: {
    1446                 recordSetLocal(m_currentNode->unlinkedLocal(), VirtualRegister(), DataFormatDead);
    1447                 break;
    1448             }
    1449 
    1450             default:
    1451                 if (belongsInMinifiedGraph(m_currentNode->op()))
    1452                     m_minifiedGraph->append(MinifiedNode::fromNode(m_currentNode));
    1453                 break;
    1454             }
    14551434        } else {
    1456            
    14571435            if (verboseCompilationEnabled()) {
    14581436                dataLogF(
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp

    r182899 r183072  
    19221922    }
    19231923       
    1924     case MovHint:
     1924    case MovHint: {
     1925        compileMovHint(m_currentNode);
     1926        noResult(node);
     1927        break;
     1928    }
     1929       
    19251930    case ZombieHint: {
    1926         DFG_CRASH(m_jit.graph(), node, "Unexpected node");
     1931        recordSetLocal(m_currentNode->unlinkedLocal(), VirtualRegister(), DataFormatDead);
     1932        noResult(node);
    19271933        break;
    19281934    }
  • trunk/Source/JavaScriptCore/runtime/Options.h

    r182927 r183072  
    185185    v(double, minimumCallToKnownRate, 0.51, nullptr) \
    186186    v(bool, optimizeNativeCalls, false, nullptr) \
     187    v(bool, enableMovHintRemoval, true, nullptr) \
    187188    v(bool, enableObjectAllocationSinking, true, nullptr) \
    188189    \
Note: See TracChangeset for help on using the changeset viewer.