Move back primary header includes next to config.h
[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 "JSCInlines.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         }
63         
64         for (BlockIndex blockIndex = 0; blockIndex < m_graph.numBlocks(); ++blockIndex) {
65             BasicBlock* block = m_graph.block(blockIndex);
66             if (!block)
67                 continue;
68             if (!block->isOSRTarget)
69                 continue;
70             if (block->bytecodeBegin != m_graph.m_plan.osrEntryBytecodeIndex)
71                 continue;
72             for (size_t i = 0; i < m_graph.m_plan.mustHandleValues.size(); ++i) {
73                 int operand = m_graph.m_plan.mustHandleValues.operandForIndex(i);
74                 Node* node = block->variablesAtHead.operand(operand);
75                 if (!node)
76                     continue;
77                 ASSERT(node->hasLocal(m_graph));
78                 node->variableAccessData()->predict(
79                     speculationFromValue(m_graph.m_plan.mustHandleValues[i]));
80             }
81         }
82         
83         return true;
84     }
85 };
86
87 bool performPredictionInjection(Graph& graph)
88 {
89     SamplingRegion samplingRegion("DFG Prediction Injection Phase");
90     return runPhase<PredictionInjectionPhase>(graph);
91 }
92
93 } } // namespace JSC::DFG
94
95 #endif // ENABLE(DFG_JIT)
96