DFGPredictionInjectionPhase.cpp [plain text]
#include "config.h"
#include "DFGPredictionInjectionPhase.h"
#if ENABLE(DFG_JIT)
#include "DFGBasicBlockInlines.h"
#include "DFGGraph.h"
#include "DFGPhase.h"
#include "Operations.h"
namespace JSC { namespace DFG {
class PredictionInjectionPhase : public Phase {
public:
PredictionInjectionPhase(Graph& graph)
: Phase(graph, "prediction injection")
{
}
bool run()
{
ASSERT(m_graph.m_form == ThreadedCPS);
ASSERT(m_graph.m_unificationState == GloballyUnified);
ASSERT(codeBlock()->numParameters() >= 1);
for (size_t arg = 0; arg < static_cast<size_t>(codeBlock()->numParameters()); ++arg) {
ValueProfile* profile = profiledBlock()->valueProfileForArgument(arg);
if (!profile)
continue;
m_graph.m_arguments[arg]->variableAccessData()->predict(profile->computeUpdatedPrediction());
#if DFG_ENABLE(DEBUG_VERBOSE)
dataLog(
"Argument [", arg, "] prediction: ",
SpeculationDump(m_graph.m_arguments[arg]->variableAccessData()->prediction()), "\n");
#endif
}
for (BlockIndex blockIndex = 0; blockIndex < m_graph.m_blocks.size(); ++blockIndex) {
BasicBlock* block = m_graph.m_blocks[blockIndex].get();
if (!block)
continue;
if (!block->isOSRTarget)
continue;
if (block->bytecodeBegin != m_graph.m_osrEntryBytecodeIndex)
continue;
for (size_t i = 0; i < m_graph.m_mustHandleValues.size(); ++i) {
Node* node = block->variablesAtHead.operand(
m_graph.m_mustHandleValues.operandForIndex(i));
if (!node)
continue;
ASSERT(node->hasLocal());
node->variableAccessData()->predict(
speculationFromValue(m_graph.m_mustHandleValues[i]));
}
}
return true;
}
};
bool performPredictionInjection(Graph& graph)
{
SamplingRegion samplingRegion("DFG Prediction Injection Phase");
return runPhase<PredictionInjectionPhase>(graph);
}
} }
#endif // ENABLE(DFG_JIT)