]>
git.saurik.com Git - apple/javascriptcore.git/blob - dfg/DFGPredictionInjectionPhase.cpp
   2  * Copyright (C) 2013 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   7  * 1. Redistributions of source code must retain the above copyright 
   8  *    notice, this list of conditions and the following disclaimer. 
   9  * 2. Redistributions in binary form must reproduce the above copyright 
  10  *    notice, this list of conditions and the following disclaimer in the 
  11  *    documentation and/or other materials provided with the distribution. 
  13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 
  14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR 
  17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
  21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
  27 #include "DFGPredictionInjectionPhase.h" 
  31 #include "DFGBasicBlockInlines.h" 
  34 #include "Operations.h" 
  36 namespace JSC 
{ namespace DFG 
{ 
  38 class PredictionInjectionPhase 
: public Phase 
{ 
  40     PredictionInjectionPhase(Graph
& graph
) 
  41         : Phase(graph
, "prediction injection") 
  47         ASSERT(m_graph
.m_form 
== ThreadedCPS
); 
  48         ASSERT(m_graph
.m_unificationState 
== GloballyUnified
); 
  50         ASSERT(codeBlock()->numParameters() >= 1); 
  51         for (size_t arg 
= 0; arg 
< static_cast<size_t>(codeBlock()->numParameters()); ++arg
) { 
  52             ValueProfile
* profile 
= profiledBlock()->valueProfileForArgument(arg
); 
  56             m_graph
.m_arguments
[arg
]->variableAccessData()->predict(profile
->computeUpdatedPrediction()); 
  58 #if DFG_ENABLE(DEBUG_VERBOSE) 
  60                 "Argument [", arg
, "] prediction: ", 
  61                 SpeculationDump(m_graph
.m_arguments
[arg
]->variableAccessData()->prediction()), "\n"); 
  65         for (BlockIndex blockIndex 
= 0; blockIndex 
< m_graph
.m_blocks
.size(); ++blockIndex
) { 
  66             BasicBlock
* block 
= m_graph
.m_blocks
[blockIndex
].get(); 
  69             if (!block
->isOSRTarget
) 
  71             if (block
->bytecodeBegin 
!= m_graph
.m_osrEntryBytecodeIndex
) 
  73             for (size_t i 
= 0; i 
< m_graph
.m_mustHandleValues
.size(); ++i
) { 
  74                 Node
* node 
= block
->variablesAtHead
.operand( 
  75                     m_graph
.m_mustHandleValues
.operandForIndex(i
)); 
  78                 ASSERT(node
->hasLocal()); 
  79                 node
->variableAccessData()->predict( 
  80                     speculationFromValue(m_graph
.m_mustHandleValues
[i
])); 
  88 bool performPredictionInjection(Graph
& graph
) 
  90     SamplingRegion 
samplingRegion("DFG Prediction Injection Phase"); 
  91     return runPhase
<PredictionInjectionPhase
>(graph
); 
  94 } } // namespace JSC::DFG 
  96 #endif // ENABLE(DFG_JIT)