Changeset 192539 in webkit


Ignore:
Timestamp:
Nov 17, 2015, 2:29:54 PM (10 years ago)
Author:
fpizlo@apple.com
Message:

Air should lay out code optimally
https://bugs.webkit.org/show_bug.cgi?id=150478

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

This adds a phase that optimizes code layout using something that's worked well for me in the past.
Basically, it just forces pre-ordering on the CFG, except that:

  • Blocks that are only reachable by Rare control flow are scheduled separately, all the way at the end.
  • Successors of the same frequency class are pushed in ascending order of frequency, so that the most frequent successor is scheduled immediately after.

This also adds the requisite branch flipping, so that a branch's taken successor is not the
fall-through block. We want the fall-through to be the not-taken successor if at all possible.

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • b3/B3BlockWorklist.h:
  • b3/B3GenericFrequentedBlock.h:

(JSC::B3::GenericFrequentedBlock::frequency):
(JSC::B3::GenericFrequentedBlock::isRare):
(JSC::B3::GenericFrequentedBlock::dump):

  • b3/B3Procedure.h:
  • b3/air/AirArg.h:

(JSC::B3::Air::Arg::isDoubleCond):
(JSC::B3::Air::Arg::isCondition):
(JSC::B3::Air::Arg::isSpecial):
(JSC::B3::Air::Arg::asDoubleCondition):
(JSC::B3::Air::Arg::isInvertible):
(JSC::B3::Air::Arg::inverted):

  • b3/air/AirBasicBlock.h:

(JSC::B3::Air::BasicBlock::index):
(JSC::B3::Air::BasicBlock::setIndex):
(JSC::B3::Air::BasicBlock::size):
(JSC::B3::Air::BasicBlock::begin):
(JSC::B3::Air::BasicBlock::containsPredecessor):
(JSC::B3::Air::BasicBlock::frequency):

  • b3/air/AirBlockWorklist.h: Added.
  • b3/air/AirCode.cpp:

(JSC::B3::Air::Code::findNextBlock):

  • b3/air/AirCode.h:

(JSC::B3::Air::Code::proc):
(JSC::B3::Air::Code::at):
(JSC::B3::Air::Code::operator[]):
(JSC::B3::Air::Code::blockList):

  • b3/air/AirGenerate.cpp:

(JSC::B3::Air::generate):

  • b3/air/AirOpcode.opcodes:
  • b3/air/AirOptimizeBlockOrder.cpp: Added.

(JSC::B3::Air::optimizeBlockOrder):

  • b3/air/AirOptimizeBlockOrder.h: Added.

Source/WTF:

  • wtf/GraphNodeWorklist.h:

(WTF::GraphNodeWorklist::push):
(WTF::GraphNodeWorklist::isEmpty):
(WTF::GraphNodeWorklist::notEmpty):
(WTF::GraphNodeWorklist::pop):

Location:
trunk/Source
Files:
3 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r192536 r192539  
     12015-11-17  Filip Pizlo  <fpizlo@apple.com>
     2
     3        Air should lay out code optimally
     4        https://bugs.webkit.org/show_bug.cgi?id=150478
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        This adds a phase that optimizes code layout using something that's worked well for me in the past.
     9        Basically, it just forces pre-ordering on the CFG, except that:
     10
     11        - Blocks that are only reachable by Rare control flow are scheduled separately, all the way at the
     12          end.
     13
     14        - Successors of the same frequency class are pushed in ascending order of frequency, so that the most
     15          frequent successor is scheduled immediately after.
     16
     17        This also adds the requisite branch flipping, so that a branch's taken successor is not the
     18        fall-through block. We want the fall-through to be the not-taken successor if at all possible.
     19
     20        * JavaScriptCore.xcodeproj/project.pbxproj:
     21        * b3/B3BlockWorklist.h:
     22        * b3/B3GenericFrequentedBlock.h:
     23        (JSC::B3::GenericFrequentedBlock::frequency):
     24        (JSC::B3::GenericFrequentedBlock::isRare):
     25        (JSC::B3::GenericFrequentedBlock::dump):
     26        * b3/B3Procedure.h:
     27        * b3/air/AirArg.h:
     28        (JSC::B3::Air::Arg::isDoubleCond):
     29        (JSC::B3::Air::Arg::isCondition):
     30        (JSC::B3::Air::Arg::isSpecial):
     31        (JSC::B3::Air::Arg::asDoubleCondition):
     32        (JSC::B3::Air::Arg::isInvertible):
     33        (JSC::B3::Air::Arg::inverted):
     34        * b3/air/AirBasicBlock.h:
     35        (JSC::B3::Air::BasicBlock::index):
     36        (JSC::B3::Air::BasicBlock::setIndex):
     37        (JSC::B3::Air::BasicBlock::size):
     38        (JSC::B3::Air::BasicBlock::begin):
     39        (JSC::B3::Air::BasicBlock::containsPredecessor):
     40        (JSC::B3::Air::BasicBlock::frequency):
     41        * b3/air/AirBlockWorklist.h: Added.
     42        * b3/air/AirCode.cpp:
     43        (JSC::B3::Air::Code::findNextBlock):
     44        * b3/air/AirCode.h:
     45        (JSC::B3::Air::Code::proc):
     46        (JSC::B3::Air::Code::at):
     47        (JSC::B3::Air::Code::operator[]):
     48        (JSC::B3::Air::Code::blockList):
     49        * b3/air/AirGenerate.cpp:
     50        (JSC::B3::Air::generate):
     51        * b3/air/AirOpcode.opcodes:
     52        * b3/air/AirOptimizeBlockOrder.cpp: Added.
     53        (JSC::B3::Air::optimizeBlockOrder):
     54        * b3/air/AirOptimizeBlockOrder.h: Added.
     55
    1562015-11-17  Andreas Kling  <akling@apple.com>
    257
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r192321 r192539  
    287287                0F338DF91BE96AA80013C88F /* B3CCallValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338DF71BE96AA80013C88F /* B3CCallValue.cpp */; };
    288288                0F338DFA1BE96AA80013C88F /* B3CCallValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338DF81BE96AA80013C88F /* B3CCallValue.h */; };
    289                 0F338DFD1BED51270013C88F /* AirSimplifyCFG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338DFB1BED51270013C88F /* AirSimplifyCFG.cpp */; };
     289                0F338DFD1BED51270013C88F /* AirSimplifyCFG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338DFB1BED51270013C88F /* AirSimplifyCFG.cpp */; };
    290290                0F338DFE1BED51270013C88F /* AirSimplifyCFG.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338DFC1BED51270013C88F /* AirSimplifyCFG.h */; };
    291291                0F338E0B1BF0276C0013C88F /* B3Compilation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338DFF1BF0276C0013C88F /* B3Compilation.cpp */; };
     
    301301                0F338E151BF0276C0013C88F /* B3ValueKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338E091BF0276C0013C88F /* B3ValueKey.h */; };
    302302                0F338E161BF0276C0013C88F /* B3ValueKeyInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338E0A1BF0276C0013C88F /* B3ValueKeyInlines.h */; };
    303                 0F338E1B1BF286EA0013C88F /* B3BlockInsertionSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338E171BF286EA0013C88F /* B3BlockInsertionSet.cpp */; };
     303                0F338E1B1BF286EA0013C88F /* B3BlockInsertionSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338E171BF286EA0013C88F /* B3BlockInsertionSet.cpp */; };
    304304                0F338E1C1BF286EA0013C88F /* B3BlockInsertionSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338E181BF286EA0013C88F /* B3BlockInsertionSet.h */; };
    305305                0F338E1D1BF286EA0013C88F /* B3LowerMacros.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F338E191BF286EA0013C88F /* B3LowerMacros.cpp */; };
    306306                0F338E1E1BF286EA0013C88F /* B3LowerMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338E1A1BF286EA0013C88F /* B3LowerMacros.h */; };
    307307                0F34B14916D42010001CDA5A /* DFGUseKind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F34B14716D4200E001CDA5A /* DFGUseKind.cpp */; };
    308                 0F34B14A16D42013001CDA5A /* DFGUseKind.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F34B14816D4200E001CDA5A /* DFGUseKind.h */; };
     308                0F34B14A16D42013001CDA5A /* DFGUseKind.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F34B14816D4200E001CDA5A /* DFGUseKind.h */; };
    309309                0F38B01117CF078000B144D3 /* LLIntEntrypoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F38B00F17CF077F00B144D3 /* LLIntEntrypoint.cpp */; };
    310310                0F38B01217CF078300B144D3 /* LLIntEntrypoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F38B01017CF077F00B144D3 /* LLIntEntrypoint.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    528528                0FB17662196B8F9E0091052A /* DFGPureValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB1765E196B8F9E0091052A /* DFGPureValue.cpp */; };
    529529                0FB17663196B8F9E0091052A /* DFGPureValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB1765F196B8F9E0091052A /* DFGPureValue.h */; };
     530                0FB3878E1BFBC44D00E3AB1E /* AirBlockWorklist.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB3878B1BFBC44D00E3AB1E /* AirBlockWorklist.h */; };
     531                0FB3878F1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3878C1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp */; };
     532                0FB387901BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB3878D1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h */; };
    530533                0FB438A319270B1D00E1FBC9 /* StructureSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB438A219270B1D00E1FBC9 /* StructureSet.cpp */; };
    531534                0FB4FB731BC843140025CA5A /* FTLLazySlowPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4FB701BC843140025CA5A /* FTLLazySlowPath.cpp */; };
     
    23362339                0F338DF71BE96AA80013C88F /* B3CCallValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3CCallValue.cpp; path = b3/B3CCallValue.cpp; sourceTree = "<group>"; };
    23372340                0F338DF81BE96AA80013C88F /* B3CCallValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3CCallValue.h; path = b3/B3CCallValue.h; sourceTree = "<group>"; };
    2338                 0F338DFB1BED51270013C88F /* AirSimplifyCFG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AirSimplifyCFG.cpp; path = b3/air/AirSimplifyCFG.cpp; sourceTree = "<group>"; };
     2341                0F338DFB1BED51270013C88F /* AirSimplifyCFG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AirSimplifyCFG.cpp; path = b3/air/AirSimplifyCFG.cpp; sourceTree = "<group>"; };
    23392342                0F338DFC1BED51270013C88F /* AirSimplifyCFG.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AirSimplifyCFG.h; path = b3/air/AirSimplifyCFG.h; sourceTree = "<group>"; };
    23402343                0F338DFF1BF0276C0013C88F /* B3Compilation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3Compilation.cpp; path = b3/B3Compilation.cpp; sourceTree = "<group>"; };
     
    23502353                0F338E091BF0276C0013C88F /* B3ValueKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3ValueKey.h; path = b3/B3ValueKey.h; sourceTree = "<group>"; };
    23512354                0F338E0A1BF0276C0013C88F /* B3ValueKeyInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3ValueKeyInlines.h; path = b3/B3ValueKeyInlines.h; sourceTree = "<group>"; };
    2352                 0F338E171BF286EA0013C88F /* B3BlockInsertionSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3BlockInsertionSet.cpp; path = b3/B3BlockInsertionSet.cpp; sourceTree = "<group>"; };
     2355                0F338E171BF286EA0013C88F /* B3BlockInsertionSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3BlockInsertionSet.cpp; path = b3/B3BlockInsertionSet.cpp; sourceTree = "<group>"; };
    23532356                0F338E181BF286EA0013C88F /* B3BlockInsertionSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3BlockInsertionSet.h; path = b3/B3BlockInsertionSet.h; sourceTree = "<group>"; };
    23542357                0F338E191BF286EA0013C88F /* B3LowerMacros.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3LowerMacros.cpp; path = b3/B3LowerMacros.cpp; sourceTree = "<group>"; };
    23552358                0F338E1A1BF286EA0013C88F /* B3LowerMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3LowerMacros.h; path = b3/B3LowerMacros.h; sourceTree = "<group>"; };
    23562359                0F34B14716D4200E001CDA5A /* DFGUseKind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGUseKind.cpp; path = dfg/DFGUseKind.cpp; sourceTree = "<group>"; };
    2357                 0F34B14816D4200E001CDA5A /* DFGUseKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGUseKind.h; path = dfg/DFGUseKind.h; sourceTree = "<group>"; };
     2360                0F34B14816D4200E001CDA5A /* DFGUseKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGUseKind.h; path = dfg/DFGUseKind.h; sourceTree = "<group>"; };
    23582361                0F38B00F17CF077F00B144D3 /* LLIntEntrypoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LLIntEntrypoint.cpp; path = llint/LLIntEntrypoint.cpp; sourceTree = "<group>"; };
    23592362                0F38B01017CF077F00B144D3 /* LLIntEntrypoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LLIntEntrypoint.h; path = llint/LLIntEntrypoint.h; sourceTree = "<group>"; };
     
    25762579                0FB1765E196B8F9E0091052A /* DFGPureValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGPureValue.cpp; path = dfg/DFGPureValue.cpp; sourceTree = "<group>"; };
    25772580                0FB1765F196B8F9E0091052A /* DFGPureValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGPureValue.h; path = dfg/DFGPureValue.h; sourceTree = "<group>"; };
     2581                0FB3878B1BFBC44D00E3AB1E /* AirBlockWorklist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AirBlockWorklist.h; path = b3/air/AirBlockWorklist.h; sourceTree = "<group>"; };
     2582                0FB3878C1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AirOptimizeBlockOrder.cpp; path = b3/air/AirOptimizeBlockOrder.cpp; sourceTree = "<group>"; };
     2583                0FB3878D1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AirOptimizeBlockOrder.h; path = b3/air/AirOptimizeBlockOrder.h; sourceTree = "<group>"; };
    25782584                0FB438A219270B1D00E1FBC9 /* StructureSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureSet.cpp; sourceTree = "<group>"; };
    25792585                0FB4B51016B3A964003F696B /* DFGMinifiedID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGMinifiedID.h; path = dfg/DFGMinifiedID.h; sourceTree = "<group>"; };
     
    45694575                                0FEC854C1BDACDC70080FF74 /* AirBasicBlock.cpp */,
    45704576                                0FEC854D1BDACDC70080FF74 /* AirBasicBlock.h */,
     4577                                0FB3878B1BFBC44D00E3AB1E /* AirBlockWorklist.h */,
    45714578                                0FEC854E1BDACDC70080FF74 /* AirCCallSpecial.cpp */,
    45724579                                0FEC854F1BDACDC70080FF74 /* AirCCallSpecial.h */,
     
    45914598                                0FEC855D1BDACDC70080FF74 /* AirLiveness.h */,
    45924599                                264091FA1BE2FD4100684DB2 /* AirOpcode.opcodes */,
     4600                                0FB3878C1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp */,
     4601                                0FB3878D1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h */,
    45934602                                0FEC855E1BDACDC70080FF74 /* AirPhaseScope.cpp */,
    45944603                                0FEC855F1BDACDC70080FF74 /* AirPhaseScope.h */,
     
    75027511                                0FF729B9166AD360000F5BA3 /* ProfilerBytecodes.h in Headers */,
    75037512                                0F13912A16771C36009CCB07 /* ProfilerBytecodeSequence.h in Headers */,
     7513                                0FB387901BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h in Headers */,
    75047514                                0FF729BA166AD360000F5BA3 /* ProfilerCompilation.h in Headers */,
    75057515                                0FF729BB166AD360000F5BA3 /* ProfilerCompilationKind.h in Headers */,
     
    76037613                                BC18C4680E16F5CD00B34460 /* StringObject.h in Headers */,
    76047614                                BC18C46A0E16F5CD00B34460 /* StringPrototype.h in Headers */,
     7615                                0FB3878E1BFBC44D00E3AB1E /* AirBlockWorklist.h in Headers */,
    76057616                                142E313B134FF0A600AFADB5 /* Strong.h in Headers */,
    76067617                                145722861437E140005FDE26 /* StrongInlines.h in Headers */,
     
    84338444                                A737810D1799EA2E00817533 /* DFGNaturalLoops.cpp in Sources */,
    84348445                                0FF0F19C16B72A03005DF95B /* DFGNode.cpp in Sources */,
     8446                                0FB3878F1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp in Sources */,
    84358447                                0FA581BA150E952C00B9A2D9 /* DFGNodeFlags.cpp in Sources */,
    84368448                                0F5D085D1B8CF99D001143B4 /* DFGNodeOrigin.cpp in Sources */,
  • trunk/Source/JavaScriptCore/b3/B3BlockWorklist.h

    r191705 r192539  
    3636namespace JSC { namespace B3 {
    3737
    38 class BasicBlock;
    39 
    4038typedef GraphNodeWorklist<BasicBlock*, IndexSet<BasicBlock>> BlockWorklist;
    4139
  • trunk/Source/JavaScriptCore/b3/B3GenericFrequentedBlock.h

    r192295 r192539  
    6868    FrequencyClass& frequency() { return m_frequency; }
    6969
     70    bool isRare() const { return frequency() == FrequencyClass::Rare; }
     71
    7072    void dump(PrintStream& out) const
    7173    {
  • trunk/Source/JavaScriptCore/b3/B3Procedure.h

    r192295 r192539  
    5454    JS_EXPORT_PRIVATE ~Procedure();
    5555
    56     JS_EXPORT_PRIVATE BasicBlock* addBlock(double frequency = PNaN);
     56    JS_EXPORT_PRIVATE BasicBlock* addBlock(double frequency = 1);
    5757   
    5858    template<typename ValueType, typename... Arguments>
  • trunk/Source/JavaScriptCore/b3/air/AirArg.h

    r192072 r192539  
    381381    }
    382382
     383    bool isCondition() const
     384    {
     385        switch (kind()) {
     386        case RelCond:
     387        case ResCond:
     388        case DoubleCond:
     389            return true;
     390        default:
     391            return false;
     392        }
     393    }
     394
    383395    bool isSpecial() const
    384396    {
     
    725737    }
    726738
     739    // Tells you if the Arg is invertible. Only condition arguments are invertible, and even for those, there
     740    // are a few exceptions - notably Overflow and Signed.
     741    bool isInvertible() const
     742    {
     743        switch (kind()) {
     744        case RelCond:
     745        case DoubleCond:
     746            return true;
     747        case ResCond:
     748            return MacroAssembler::isInvertible(asResultCondition());
     749        default:
     750            return false;
     751        }
     752    }
     753
    727754    // This is valid for condition arguments. It will invert them.
    728755    Arg inverted(bool inverted = true) const
  • trunk/Source/JavaScriptCore/b3/air/AirBasicBlock.h

    r192121 r192539  
    5151
    5252    unsigned index() const { return m_index; }
     53
     54    // This method is exposed for phases that mess with the layout of basic blocks. Currently that means just
     55    // optimizeBlockOrder().
     56    void setIndex(unsigned index) { m_index = index; }
    5357   
    5458    unsigned size() const { return m_insts.size(); }
     
    111115    bool containsPredecessor(BasicBlock* predecessor) const { return m_predecessors.contains(predecessor); }
    112116
     117    double frequency() const { return m_frequency; }
     118
    113119    void dump(PrintStream&) const;
    114120    void deepDump(PrintStream&) const;
  • trunk/Source/JavaScriptCore/b3/air/AirCode.cpp

    r192345 r192539  
    129129BasicBlock* Code::findNextBlock(BasicBlock* block) const
    130130{
    131     return at(findNextBlockIndex(block->index()));
     131    unsigned index = findNextBlockIndex(block->index());
     132    if (index < size())
     133        return at(index);
     134    return nullptr;
    132135}
    133136
  • trunk/Source/JavaScriptCore/b3/air/AirCode.h

    r192183 r192539  
    5656    Procedure& proc() { return m_proc; }
    5757
    58     BasicBlock* addBlock(double frequency = PNaN);
     58    BasicBlock* addBlock(double frequency = 1);
    5959
    6060    StackSlot* addStackSlot(unsigned byteSize, StackSlotKind, StackSlotValue* = nullptr);
     
    115115    BasicBlock* at(unsigned index) const { return m_blocks[index].get(); }
    116116    BasicBlock* operator[](unsigned index) const { return at(index); }
     117
     118    // This is used by phases that optimize the block list. You shouldn't use this unless you really know
     119    // what you're doing.
     120    Vector<std::unique_ptr<BasicBlock>>& blockList() { return m_blocks; }
    117121
    118122    // Finds the smallest index' such that at(index') != null and index' >= index.
  • trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp

    r192497 r192539  
    3535#include "AirHandleCalleeSaves.h"
    3636#include "AirIteratedRegisterCoalescing.h"
     37#include "AirOptimizeBlockOrder.h"
    3738#include "AirReportUsedRegisters.h"
    3839#include "AirSimplifyCFG.h"
     
    8788    simplifyCFG(code);
    8889
    89     // FIXME: We should really have a code layout optimization here.
    90     // https://bugs.webkit.org/show_bug.cgi?id=150478
     90    // This sorts the basic blocks in Code to achieve an ordering that maximizes the likelihood that a high
     91    // frequency successor is also the fall-through target.
     92    optimizeBlockOrder(code);
    9193
     94    // This is needed to satisfy a requirement of B3::StackmapValue.
    9295    reportUsedRegisters(code);
    9396
  • trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes

    r192524 r192539  
    274274    ResCond, Tmp, Tmp, Tmp
    275275
     276# Note that branches have some logic in AirOptimizeBlockOrder.cpp. If you add new branches, please make sure
     277# you opt them into the block order optimizations.
     278
    276279Branch8 U:G, U:G, U:G /branch
    277280    RelCond, Addr, Imm
  • trunk/Source/WTF/ChangeLog

    r192376 r192539  
     12015-11-17  Filip Pizlo  <fpizlo@apple.com>
     2
     3        Air should lay out code optimally
     4        https://bugs.webkit.org/show_bug.cgi?id=150478
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * wtf/GraphNodeWorklist.h:
     9        (WTF::GraphNodeWorklist::push):
     10        (WTF::GraphNodeWorklist::isEmpty):
     11        (WTF::GraphNodeWorklist::notEmpty):
     12        (WTF::GraphNodeWorklist::pop):
     13
    1142015-11-11  Anders Carlsson  <andersca@apple.com>
    215
  • trunk/Source/WTF/wtf/GraphNodeWorklist.h

    r191865 r192539  
    4646    }
    4747
     48    bool isEmpty() const { return m_stack.isEmpty(); }
    4849    bool notEmpty() const { return !m_stack.isEmpty(); }
    4950   
Note: See TracChangeset for help on using the changeset viewer.