Changeset 183072 in webkit
- Timestamp:
- Apr 21, 2015 1:16:18 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r182997 r183072 157 157 dfg/DFGDriver.cpp 158 158 dfg/DFGEdge.cpp 159 dfg/DFGEpoch.cpp 159 160 dfg/DFGFailedFinalizer.cpp 160 161 dfg/DFGFinalizer.cpp … … 182 183 dfg/DFGMayExit.cpp 183 184 dfg/DFGMinifiedNode.cpp 185 dfg/DFGMovHintRemovalPhase.cpp 184 186 dfg/DFGNaiveDominators.cpp 185 187 dfg/DFGNaturalLoops.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r183069 r183072 1 2015-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 1 50 2015-04-21 Basile Clement <basile_clement@apple.com> 2 51 -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj
r182997 r183072 401 401 <ClCompile Include="..\dfg\DFGDriver.cpp" /> 402 402 <ClCompile Include="..\dfg\DFGEdge.cpp" /> 403 <ClCompile Include="..\dfg\DFGEpoch.cpp" /> 403 404 <ClCompile Include="..\dfg\DFGFailedFinalizer.cpp" /> 404 405 <ClCompile Include="..\dfg\DFGFinalizer.cpp" /> … … 426 427 <ClCompile Include="..\dfg\DFGMayExit.cpp" /> 427 428 <ClCompile Include="..\dfg\DFGMinifiedNode.cpp" /> 429 <ClCompile Include="..\dfg\DFGMovHintRemovalPhase.cpp" /> 428 430 <ClCompile Include="..\dfg\DFGNaiveDominators.cpp" /> 429 431 <ClCompile Include="..\dfg\DFGNaturalLoops.cpp" /> … … 1082 1084 <ClInclude Include="..\dfg\DFGEdgeDominates.h" /> 1083 1085 <ClInclude Include="..\dfg\DFGEdgeUsesStructure.h" /> 1086 <ClInclude Include="..\dfg\DFGEpoch.h" /> 1084 1087 <ClInclude Include="..\dfg\DFGFailedFinalizer.h" /> 1085 1088 <ClInclude Include="..\dfg\DFGFiltrationResult.h" /> … … 1116 1119 <ClInclude Include="..\dfg\DFGMinifiedID.h" /> 1117 1120 <ClInclude Include="..\dfg\DFGMinifiedNode.h" /> 1121 <ClInclude Include="..\dfg\DFGMovHintRemovalPhase.h" /> 1118 1122 <ClInclude Include="..\dfg\DFGNaiveDominators.h" /> 1119 1123 <ClInclude Include="..\dfg\DFGNaturalLoops.h" /> -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r182997 r183072 417 417 0F885E111849A3BE00F1E3FA /* BytecodeUseDef.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F885E101849A3BE00F1E3FA /* BytecodeUseDef.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418 418 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, ); }; }; 419 423 0F8F2B95172E04A0007DBDA5 /* FTLLink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */; }; 420 424 0F8F2B96172E04A3007DBDA5 /* FTLLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F2B94172E049E007DBDA5 /* FTLLink.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2143 2147 0F885E101849A3BE00F1E3FA /* BytecodeUseDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeUseDef.h; sourceTree = "<group>"; }; 2144 2148 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>"; }; 2145 2153 0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FTLLink.cpp; path = ftl/FTLLink.cpp; sourceTree = "<group>"; }; 2146 2154 0F8F2B94172E049E007DBDA5 /* FTLLink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FTLLink.h; path = ftl/FTLLink.h; sourceTree = "<group>"; }; … … 4907 4915 A7D9A29117A0BC7400EE2618 /* DFGEdgeDominates.h */, 4908 4916 A7986D5617A0BB1E00A95DD0 /* DFGEdgeUsesStructure.h */, 4917 0F8F142F1ADF090100ED792C /* DFGEpoch.cpp */, 4918 0F8F14301ADF090100ED792C /* DFGEpoch.h */, 4909 4919 A78A976C179738B8009DF744 /* DFGFailedFinalizer.cpp */, 4910 4920 A78A976D179738B8009DF744 /* DFGFailedFinalizer.h */, … … 4966 4976 0F2BDC4C1522818300CD8910 /* DFGMinifiedNode.cpp */, 4967 4977 0F2BDC3E1522801700CD8910 /* DFGMinifiedNode.h */, 4978 0F8F14311ADF090100ED792C /* DFGMovHintRemovalPhase.cpp */, 4979 0F8F14321ADF090100ED792C /* DFGMovHintRemovalPhase.h */, 4968 4980 0FC3CCFA19ADA410006AC72A /* DFGNaiveDominators.cpp */, 4969 4981 0FC3CCFB19ADA410006AC72A /* DFGNaiveDominators.h */, … … 5661 5673 C2FCAE1317A9C24E0034C735 /* BytecodeLivenessAnalysis.h in Headers */, 5662 5674 0F666EC0183566F900D017F1 /* BytecodeLivenessAnalysisInlines.h in Headers */, 5675 0F8F14361ADF090100ED792C /* DFGMovHintRemovalPhase.h in Headers */, 5663 5676 0F885E111849A3BE00F1E3FA /* BytecodeUseDef.h in Headers */, 5664 5677 0F8023EA1613832B00A0BA45 /* ByValInfo.h in Headers */, … … 6294 6307 0F34B14C16D43E0D001CDA5A /* PolymorphicAccessStructureList.h in Headers */, 6295 6308 0F9FC8C414E1B60000D52AE0 /* PolymorphicPutByIdList.h in Headers */, 6309 0F8F14341ADF090100ED792C /* DFGEpoch.h in Headers */, 6296 6310 0F98206116BFE38300240D02 /* PreciseJumpTargets.h in Headers */, 6297 6311 0F2DD8151AB3D8BE00BBB8E8 /* DFGForAllKills.h in Headers */, … … 7376 7390 86E3C61A167BABEE006D760A /* JSValue.mm in Sources */, 7377 7391 0FF8BDEA1AD4CF7100DFE884 /* InferredValue.cpp in Sources */, 7392 0F8F14351ADF090100ED792C /* DFGMovHintRemovalPhase.cpp in Sources */, 7378 7393 14BD5A320A3E91F600BAF59C /* JSValueRef.cpp in Sources */, 7379 7394 147F39D7107EC37600427A48 /* JSEnvironmentRecord.cpp in Sources */, … … 7516 7531 14469DEB107EC7E700650446 /* StringConstructor.cpp in Sources */, 7517 7532 14469DEC107EC7E700650446 /* StringObject.cpp in Sources */, 7533 0F8F14331ADF090100ED792C /* DFGEpoch.cpp in Sources */, 7518 7534 14469DED107EC7E700650446 /* StringPrototype.cpp in Sources */, 7519 7535 0F2D4DEF19832DD3007D4B19 /* TypeSet.cpp in Sources */, -
trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp
r182759 r183072 197 197 out.print(", known callee: ", inContext(calleeRecovery.constant(), context)); 198 198 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, ")>"); 201 201 } 202 202 -
trunk/Source/JavaScriptCore/dfg/DFGDCEPhase.cpp
r181993 r183072 144 144 145 145 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.) 159 149 RELEASE_ASSERT_NOT_REACHED(); 160 break; 161 } 162 150 163 151 default: { 164 152 if (node->flags() & NodeHasVarArgs) { -
trunk/Source/JavaScriptCore/dfg/DFGDisassembler.cpp
r170876 r183072 113 113 Node* lastNodeForDisassembly = block->at(0); 114 114 for (size_t i = 0; i < block->size(); ++i) { 115 if (!block->at(i)->willHaveCodeGenOrOSR() && !Options::showAllDFGNodes())116 continue;117 115 MacroAssembler::Label currentLabel; 118 116 HashMap<Node*, MacroAssembler::Label>::iterator iter = m_labelForNode.find(block->at(i)); -
trunk/Source/JavaScriptCore/dfg/DFGMayExit.cpp
r181993 r183072 60 60 { 61 61 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. 62 65 case SetArgument: 63 66 case JSConstant: -
trunk/Source/JavaScriptCore/dfg/DFGNodeType.h
r183040 r183072 64 64 macro(GetStack, NodeResultJS) \ 65 65 \ 66 macro(MovHint, 0) \67 macro(ZombieHint, 0) \66 macro(MovHint, NodeMustGenerate) \ 67 macro(ZombieHint, NodeMustGenerate) \ 68 68 macro(Phantom, NodeMustGenerate) \ 69 69 macro(HardPhantom, NodeMustGenerate) /* Like Phantom, but we never remove any of its children. */ \ -
trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp
r182318 r183072 48 48 #include "DFGLivenessAnalysisPhase.h" 49 49 #include "DFGLoopPreHeaderCreationPhase.h" 50 #include "DFGMovHintRemovalPhase.h" 50 51 #include "DFGOSRAvailabilityAnalysisPhase.h" 51 52 #include "DFGOSREntrypointCreationPhase.h" … … 393 394 if (Options::validateFTLOSRExitLiveness()) 394 395 performResurrectionForValidation(dfg); 396 if (Options::enableMovHintRemoval()) 397 performMovHintRemoval(dfg); 395 398 performDCE(dfg); // We rely on this to kill dead code that won't be recognized as dead by LLVM. 396 399 performStackLayout(dfg); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r182959 r183072 1430 1430 m_lastGeneratedNode = m_currentNode->op(); 1431 1431 if (!m_currentNode->shouldGenerate()) { 1432 switch (m_currentNode->op()) { 1433 case JSConstant: 1432 if (belongsInMinifiedGraph(m_currentNode->op())) 1434 1433 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 }1455 1434 } else { 1456 1457 1435 if (verboseCompilationEnabled()) { 1458 1436 dataLogF( -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r182899 r183072 1922 1922 } 1923 1923 1924 case MovHint: 1924 case MovHint: { 1925 compileMovHint(m_currentNode); 1926 noResult(node); 1927 break; 1928 } 1929 1925 1930 case ZombieHint: { 1926 DFG_CRASH(m_jit.graph(), node, "Unexpected node"); 1931 recordSetLocal(m_currentNode->unlinkedLocal(), VirtualRegister(), DataFormatDead); 1932 noResult(node); 1927 1933 break; 1928 1934 } -
trunk/Source/JavaScriptCore/runtime/Options.h
r182927 r183072 185 185 v(double, minimumCallToKnownRate, 0.51, nullptr) \ 186 186 v(bool, optimizeNativeCalls, false, nullptr) \ 187 v(bool, enableMovHintRemoval, true, nullptr) \ 187 188 v(bool, enableObjectAllocationSinking, true, nullptr) \ 188 189 \
Note: See TracChangeset
for help on using the changeset viewer.