The DFG should be able to tier-up and OSR enter into the FTL
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGPredictionInjectionPhase.cpp
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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. 
24  */
25
26 #include "config.h"
27 #include "DFGPredictionInjectionPhase.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include "DFGBasicBlockInlines.h"
32 #include "DFGGraph.h"
33 #include "DFGPhase.h"
34 #include "Operations.h"
35
36 namespace JSC { namespace DFG {
37
38 class PredictionInjectionPhase : public Phase {
39 public:
40     PredictionInjectionPhase(Graph& graph)
41         : Phase(graph, "prediction injection")
42     {
43     }
44     
45     bool run()
46     {
47         ASSERT(m_graph.m_form == ThreadedCPS);
48         ASSERT(m_graph.m_unificationState == GloballyUnified);
49         
50         ASSERT(codeBlock()->numParameters() >= 1);
51         {
52             ConcurrentJITLocker locker(profiledBlock()->m_lock);
53             
54             for (size_t arg = 0; arg < static_cast<size_t>(codeBlock()->numParameters()); ++arg) {
55                 ValueProfile* profile = profiledBlock()->valueProfileForArgument(arg);
56                 if (!profile)
57                     continue;
58             
59                 m_graph.m_arguments[arg]->variableAccessData()->predict(
60                     profile->computeUpdatedPrediction(locker));
61             
62 #if DFG_ENABLE(DEBUG_VERBOSE)
63                 dataLog(
64                     "Argument [", arg, "] prediction: ",
65                     SpeculationDump(m_graph.m_arguments[arg]->variableAccessData()->prediction()),
66                     "\n");
67 #endif
68             }
69         }
70         
71         for (BlockIndex blockIndex = 0; blockIndex < m_graph.numBlocks(); ++blockIndex) {
72             BasicBlock* block = m_graph.block(blockIndex);
73             if (!block)
74                 continue;
75             if (!block->isOSRTarget)
76                 continue;
77             if (block->bytecodeBegin != m_graph.m_plan.osrEntryBytecodeIndex)
78                 continue;
79             for (size_t i = 0; i < m_graph.m_plan.mustHandleValues.size(); ++i) {
80                 int operand = m_graph.m_plan.mustHandleValues.operandForIndex(i);
81                 Node* node = block->variablesAtHead.operand(operand);
82                 if (!node)
83                     continue;
84                 ASSERT(node->hasLocal(m_graph));
85                 node->variableAccessData()->predict(
86                     speculationFromValue(m_graph.m_plan.mustHandleValues[i]));
87             }
88         }
89         
90         return true;
91     }
92 };
93
94 bool performPredictionInjection(Graph& graph)
95 {
96     SamplingRegion samplingRegion("DFG Prediction Injection Phase");
97     return runPhase<PredictionInjectionPhase>(graph);
98 }
99
100 } } // namespace JSC::DFG
101
102 #endif // ENABLE(DFG_JIT)
103