WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
the patch
blah.patch (text/plain), 20.29 KB, created by
Filip Pizlo
on 2013-07-16 22:24:48 PDT
(
hide
)
Description:
the patch
Filename:
MIME Type:
Creator:
Filip Pizlo
Created:
2013-07-16 22:24:48 PDT
Size:
20.29 KB
patch
obsolete
>Index: Source/JavaScriptCore/ChangeLog >=================================================================== >--- Source/JavaScriptCore/ChangeLog (revision 152754) >+++ Source/JavaScriptCore/ChangeLog (working copy) >@@ -1,3 +1,60 @@ >+2013-07-16 Filip Pizlo <fpizlo@apple.com> >+ >+ fourthTier: Add a phase to create loop pre-headers >+ https://bugs.webkit.org/show_bug.cgi?id=118778 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add a loop pre-header creation phase. Any loop that doesn't already have >+ just one predecessor that isn't part of the loop has a pre-header >+ prepended. All non-loop predecessors then jump to that pre-header. >+ >+ Also fix a handful of bugs: >+ >+ - DFG::Analysis should set m_valid before running the analysis, since that >+ makes it easier to use ASSERT(m_valid) in the analysis' methods, which >+ may be called by the analysis before the analysis completes. NaturalLoops >+ does this with loopsOf(). >+ >+ - NaturalLoops::headerOf() was missing a check for innerMostLoopOf() >+ returning 0, since that'll happen if the block isn't in any loop. >+ >+ - Change BlockInsertionSet to dethread the graph, since anyone using it >+ will want to do so. >+ >+ - Change dethreading to ignore SSA form graphs. >+ >+ This also adds NaturalLoops::belongsTo(), which I always used in the >+ pre-header creation phase. I didn't end up using it but I'll probably use >+ it in the near future. >+ >+ * JavaScriptCore.xcodeproj/project.pbxproj: >+ * dfg/DFGAnalysis.h: >+ (JSC::DFG::Analysis::computeIfNecessary): >+ * dfg/DFGBlockInsertionSet.cpp: >+ (JSC::DFG::BlockInsertionSet::execute): >+ * dfg/DFGCriticalEdgeBreakingPhase.cpp: >+ (JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge): >+ * dfg/DFGGraph.cpp: >+ (JSC::DFG::Graph::dethread): >+ * dfg/DFGLoopPreHeaderCreationPhase.cpp: Added. >+ (DFG): >+ (LoopPreHeaderCreationPhase): >+ (JSC::DFG::LoopPreHeaderCreationPhase::LoopPreHeaderCreationPhase): >+ (JSC::DFG::LoopPreHeaderCreationPhase::run): >+ (JSC::DFG::performLoopPreHeaderCreation): >+ * dfg/DFGLoopPreHeaderCreationPhase.h: Added. >+ (DFG): >+ * dfg/DFGNaturalLoops.h: >+ (NaturalLoop): >+ (JSC::DFG::NaturalLoops::headerOf): >+ (JSC::DFG::NaturalLoops::innerMostLoopOf): >+ (JSC::DFG::NaturalLoops::innerMostOuterLoop): >+ (JSC::DFG::NaturalLoops::belongsTo): >+ (NaturalLoops): >+ * dfg/DFGPlan.cpp: >+ (JSC::DFG::Plan::compileInThreadImpl): >+ > 2013-07-16 Filip Pizlo <fpizlo@apple.com> > > fourthTier: NaturalLoops should be able to quickly answer questions like "what loops own this basic block" >Index: Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >=================================================================== >--- Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (revision 152754) >+++ Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (working copy) >@@ -368,6 +368,8 @@ > 0FE5057B178F5B5300B35F8C /* DFGOSRAvailabilityAnalysisPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE5056E178F5B5300B35F8C /* DFGOSRAvailabilityAnalysisPhase.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 0FE5057C178F5B5300B35F8C /* DFGSSAConversionPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FE5056F178F5B5300B35F8C /* DFGSSAConversionPhase.cpp */; }; > 0FE5057D178F5B5300B35F8C /* DFGSSAConversionPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE50570178F5B5300B35F8C /* DFGSSAConversionPhase.h */; settings = {ATTRIBUTES = (Private, ); }; }; >+ 0FE5058217965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FE5058017965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.cpp */; }; >+ 0FE5058317965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE5058117965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 0FE8534B1723CDA500B618F5 /* DFGDesiredWatchpoints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FE853491723CDA500B618F5 /* DFGDesiredWatchpoints.cpp */; }; > 0FE8534C1723CDA500B618F5 /* DFGDesiredWatchpoints.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE8534A1723CDA500B618F5 /* DFGDesiredWatchpoints.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 0FEA0A08170513DB00BB722C /* FTLAbbreviations.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FEA09FD170513DB00BB722C /* FTLAbbreviations.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -1414,6 +1416,8 @@ > 0FE5056E178F5B5300B35F8C /* DFGOSRAvailabilityAnalysisPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGOSRAvailabilityAnalysisPhase.h; path = dfg/DFGOSRAvailabilityAnalysisPhase.h; sourceTree = "<group>"; }; > 0FE5056F178F5B5300B35F8C /* DFGSSAConversionPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGSSAConversionPhase.cpp; path = dfg/DFGSSAConversionPhase.cpp; sourceTree = "<group>"; }; > 0FE50570178F5B5300B35F8C /* DFGSSAConversionPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGSSAConversionPhase.h; path = dfg/DFGSSAConversionPhase.h; sourceTree = "<group>"; }; >+ 0FE5058017965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGLoopPreHeaderCreationPhase.cpp; path = dfg/DFGLoopPreHeaderCreationPhase.cpp; sourceTree = "<group>"; }; >+ 0FE5058117965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGLoopPreHeaderCreationPhase.h; path = dfg/DFGLoopPreHeaderCreationPhase.h; sourceTree = "<group>"; }; > 0FE853491723CDA500B618F5 /* DFGDesiredWatchpoints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDesiredWatchpoints.cpp; path = dfg/DFGDesiredWatchpoints.cpp; sourceTree = "<group>"; }; > 0FE8534A1723CDA500B618F5 /* DFGDesiredWatchpoints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGDesiredWatchpoints.h; path = dfg/DFGDesiredWatchpoints.h; sourceTree = "<group>"; }; > 0FEA09FD170513DB00BB722C /* FTLAbbreviations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLAbbreviations.h; path = ftl/FTLAbbreviations.h; sourceTree = "<group>"; }; >@@ -3068,6 +3072,8 @@ > 0FE5056C178F5B5300B35F8C /* DFGLivenessAnalysisPhase.h */, > 0FB4B51C16B62772003F696B /* DFGLongLivedState.cpp */, > 0FB4B51D16B62772003F696B /* DFGLongLivedState.h */, >+ 0FE5058017965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.cpp */, >+ 0FE5058117965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.h */, > 0F2BDC3D1522801700CD8910 /* DFGMinifiedGraph.h */, > 0FB4B51016B3A964003F696B /* DFGMinifiedID.h */, > 0F2BDC4C1522818300CD8910 /* DFGMinifiedNode.cpp */, >@@ -3866,6 +3872,7 @@ > 0F2E892D16D02BAF009E4FD2 /* DFGMinifiedID.h in Headers */, > 0FFB921816D02EB20055A5DB /* DFGAllocator.h in Headers */, > 0FFB921A16D02EC50055A5DB /* DFGBasicBlockInlines.h in Headers */, >+ 0FE5058317965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.h in Headers */, > 0FFB921B16D02F010055A5DB /* DFGNodeAllocator.h in Headers */, > 0FFB921C16D02F110055A5DB /* DFGOSRExitCompilationInfo.h in Headers */, > 0F235BEE17178E7300690C7F /* DFGOSRExitPreparation.h in Headers */, >@@ -4451,6 +4458,7 @@ > 0F0B839C14BCF46300885B4F /* LLIntThunks.cpp in Sources */, > 0F4E1A13173AF07E007EE2D3 /* DFGDesiredStructureChains.cpp in Sources */, > 14469DDE107EC7E700650446 /* Lookup.cpp in Sources */, >+ 0FE5058217965C3D00B35F8C /* DFGLoopPreHeaderCreationPhase.cpp in Sources */, > 0F4680CC14BBB17A00BFE272 /* LowLevelInterpreter.cpp in Sources */, > 0FDB2CE41746CE9F007B3C1B /* CompilationResult.cpp in Sources */, > 14B723B212D7DA46003BD5ED /* MachineStackMarker.cpp in Sources */, >Index: Source/JavaScriptCore/dfg/DFGAnalysis.h >=================================================================== >--- Source/JavaScriptCore/dfg/DFGAnalysis.h (revision 152754) >+++ Source/JavaScriptCore/dfg/DFGAnalysis.h (working copy) >@@ -55,8 +55,10 @@ public: > { > if (m_valid) > return; >- static_cast<T*>(this)->compute(graph); >+ // Set to true early, since the analysis may choose to call its own methods in >+ // compute() and it may want to ASSERT() validity in those methods. > m_valid = true; >+ static_cast<T*>(this)->compute(graph); > } > > bool isValid() const { return m_valid; } >Index: Source/JavaScriptCore/dfg/DFGBlockInsertionSet.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGBlockInsertionSet.cpp (revision 152754) >+++ Source/JavaScriptCore/dfg/DFGBlockInsertionSet.cpp (working copy) >@@ -91,6 +91,7 @@ bool BlockInsertionSet::execute() > > // And finally, invalidate all analyses that rely on the CFG. > m_graph.invalidateCFG(); >+ m_graph.dethread(); > > return true; > } >Index: Source/JavaScriptCore/dfg/DFGCriticalEdgeBreakingPhase.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGCriticalEdgeBreakingPhase.cpp (revision 152754) >+++ Source/JavaScriptCore/dfg/DFGCriticalEdgeBreakingPhase.cpp (working copy) >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. >+ * Copyright (C) 2013 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -73,8 +73,6 @@ public: > private: > void breakCriticalEdge(BasicBlock* predecessor, BasicBlock** successor) > { >- m_graph.dethread(); >- > BasicBlock* pad = m_insertionSet.insertBefore(*successor); > pad->appendNode( > m_graph, SpecNone, Jump, (*successor)->at(0)->codeOrigin, OpInfo(*successor)); >Index: Source/JavaScriptCore/dfg/DFGGraph.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGGraph.cpp (revision 152754) >+++ Source/JavaScriptCore/dfg/DFGGraph.cpp (working copy) >@@ -404,7 +404,7 @@ void Graph::dump(PrintStream& out) > > void Graph::dethread() > { >- if (m_form == LoadStore) >+ if (m_form == LoadStore || m_form == SSA) > return; > > if (logCompilationChanges()) >Index: Source/JavaScriptCore/dfg/DFGLoopPreHeaderCreationPhase.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGLoopPreHeaderCreationPhase.cpp (revision 0) >+++ Source/JavaScriptCore/dfg/DFGLoopPreHeaderCreationPhase.cpp (working copy) >@@ -0,0 +1,111 @@ >+/* >+ * Copyright (C) 2013 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "DFGLoopPreHeaderCreationPhase.h" >+ >+#if ENABLE(DFG_JIT) >+ >+#include "DFGBasicBlockInlines.h" >+#include "DFGBlockInsertionSet.h" >+#include "DFGGraph.h" >+#include "DFGPhase.h" >+#include "Operations.h" >+#include <wtf/HashMap.h> >+ >+namespace JSC { namespace DFG { >+ >+class LoopPreHeaderCreationPhase : public Phase { >+public: >+ LoopPreHeaderCreationPhase(Graph& graph) >+ : Phase(graph, "loop pre-header creation") >+ , m_insertionSet(graph) >+ { >+ } >+ >+ bool run() >+ { >+ m_graph.m_dominators.computeIfNecessary(m_graph); >+ m_graph.m_naturalLoops.computeIfNecessary(m_graph); >+ >+ for (unsigned loopIndex = m_graph.m_naturalLoops.numLoops(); loopIndex--;) { >+ const NaturalLoop& loop = m_graph.m_naturalLoops.loop(loopIndex); >+ BasicBlock* existingPreHeader = 0; >+ bool needsNewPreHeader = false; >+ for (unsigned predecessorIndex = loop.header()->predecessors.size(); predecessorIndex--;) { >+ BasicBlock* predecessor = loop.header()->predecessors[predecessorIndex]; >+ if (m_graph.m_dominators.dominates(loop.header(), predecessor)) >+ continue; >+ if (!existingPreHeader) { >+ existingPreHeader = predecessor; >+ continue; >+ } >+ if (existingPreHeader == predecessor) >+ continue; >+ needsNewPreHeader = true; >+ break; >+ } >+ if (!needsNewPreHeader) >+ continue; >+ >+ BasicBlock* preHeader = m_insertionSet.insertBefore(loop.header()); >+ preHeader->appendNode( >+ m_graph, SpecNone, Jump, loop.header()->at(0)->codeOrigin, OpInfo(loop.header())); >+ >+ for (unsigned predecessorIndex = 0; predecessorIndex < loop.header()->predecessors.size(); predecessorIndex++) { >+ BasicBlock* predecessor = loop.header()->predecessors[predecessorIndex]; >+ if (m_graph.m_dominators.dominates(loop.header(), predecessor)) >+ continue; >+ loop.header()->predecessors[predecessorIndex--] = loop.header()->predecessors.last(); >+ loop.header()->predecessors.takeLast(); >+ for (unsigned successorIndex = predecessor->numSuccessors(); successorIndex--;) { >+ BasicBlock*& successor = predecessor->successor(successorIndex); >+ if (successor != loop.header()) >+ continue; >+ successor = preHeader; >+ preHeader->predecessors.append(predecessor); >+ } >+ } >+ >+ loop.header()->predecessors.append(preHeader); >+ } >+ >+ return m_insertionSet.execute(); >+ } >+ >+ BlockInsertionSet m_insertionSet; >+}; >+ >+bool performLoopPreHeaderCreation(Graph& graph) >+{ >+ SamplingRegion samplingRegion("DFG Loop Pre-Header Creation Phase"); >+ return runPhase<LoopPreHeaderCreationPhase>(graph); >+} >+ >+} } // namespace JSC::DFG >+ >+#endif // ENABLE(DFG_JIT) >+ >+ >Index: Source/JavaScriptCore/dfg/DFGLoopPreHeaderCreationPhase.h >=================================================================== >--- Source/JavaScriptCore/dfg/DFGLoopPreHeaderCreationPhase.h (revision 0) >+++ Source/JavaScriptCore/dfg/DFGLoopPreHeaderCreationPhase.h (working copy) >@@ -0,0 +1,47 @@ >+/* >+ * Copyright (C) 2013 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#ifndef DFGLoopPreHeaderCreationPhase_h >+#define DFGLoopPreHeaderCreationPhase_h >+ >+#include <wtf/Platform.h> >+ >+#if ENABLE(DFG_JIT) >+ >+namespace JSC { namespace DFG { >+ >+class Graph; >+ >+// Inserts dummy basic blocks before any loop headers that don't already have >+// a single non-loop predecessor. >+ >+bool performLoopPreHeaderCreation(Graph&); >+ >+} } // namespace JSC::DFG >+ >+#endif // ENABLE(DFG_JIT) >+ >+#endif // DFGLoopPreHeaderCreationPhase_h >+ >Index: Source/JavaScriptCore/dfg/DFGNaturalLoops.h >=================================================================== >--- Source/JavaScriptCore/dfg/DFGNaturalLoops.h (revision 152754) >+++ Source/JavaScriptCore/dfg/DFGNaturalLoops.h (working copy) >@@ -58,7 +58,9 @@ public: > unsigned size() const { return m_body.size(); } > BasicBlock* at(unsigned i) const { return m_body[i]; } > BasicBlock* operator[](unsigned i) const { return at(i); } >- >+ >+ // This is the slower, but simpler, way of asking if a block belongs to >+ // a natural loop. It's faster to call > bool contains(BasicBlock* block) const > { > for (unsigned i = m_body.size(); i--;) { >@@ -108,7 +110,10 @@ public: > // loop it belongs to. > const NaturalLoop* headerOf(BasicBlock* block) const > { >+ ASSERT(isValid()); > const NaturalLoop* loop = innerMostLoopOf(block); >+ if (!loop) >+ return 0; > if (loop->header() == block) > return loop; > if (!ASSERT_DISABLED) { >@@ -120,6 +125,7 @@ public: > > const NaturalLoop* innerMostLoopOf(BasicBlock* block) const > { >+ ASSERT(isValid()); > unsigned index = block->innerMostLoopIndices[0]; > if (index == UINT_MAX) > return 0; >@@ -128,11 +134,26 @@ public: > > const NaturalLoop* innerMostOuterLoop(const NaturalLoop& loop) const > { >+ ASSERT(isValid()); > if (loop.m_outerLoopIndex == UINT_MAX) > return 0; > return &m_loops[loop.m_outerLoopIndex]; > } > >+ bool belongsTo(BasicBlock* block, const NaturalLoop& candidateLoop) const >+ { >+ ASSERT(isValid()); >+ // It's faster to do this test using the loop itself, if it's small. >+ if (candidateLoop.size() < 4) >+ return candidateLoop.contains(block); >+ >+ for (const NaturalLoop* loop = innerMostLoopOf(block); loop; loop = innerMostOuterLoop(*loop)) { >+ if (loop == &candidateLoop) >+ return true; >+ } >+ return false; >+ } >+ > // Return the indices of all loops this belongs to. > Vector<const NaturalLoop*> loopsOf(BasicBlock*) const; > >Index: Source/JavaScriptCore/dfg/DFGPlan.cpp >=================================================================== >--- Source/JavaScriptCore/dfg/DFGPlan.cpp (revision 152754) >+++ Source/JavaScriptCore/dfg/DFGPlan.cpp (working copy) >@@ -43,6 +43,7 @@ > #include "DFGFixupPhase.h" > #include "DFGJITCompiler.h" > #include "DFGLivenessAnalysisPhase.h" >+#include "DFGLoopPreHeaderCreationPhase.h" > #include "DFGOSRAvailabilityAnalysisPhase.h" > #include "DFGPredictionInjectionPhase.h" > #include "DFGPredictionPropagationPhase.h" >@@ -201,6 +202,7 @@ Plan::CompilationPath Plan::compileInThr > && FTL::canCompile(dfg)) { > > performCriticalEdgeBreaking(dfg); >+ performLoopPreHeaderCreation(dfg); > performCPSRethreading(dfg); > performSSAConversion(dfg); > performLivenessAnalysis(dfg);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
oliver
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 118778
: 206854