8ed2f1e595b65477b47a91abd36e071f4f693e94
[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
28 #if ENABLE(DFG_JIT)
29
30 #include "DFGPredictionInjectionPhase.h"
31
32 #include "DFGBasicBlockInlines.h"
33 #include "DFGGraph.h"
34 #include "DFGPhase.h"
35 #include "JSCInlines.h"
36
37 namespace JSC { namespace DFG {
38
39 class PredictionInjectionPhase : public Phase {
40 public:
41     PredictionInjectionPhase(Graph& graph)
42         : Phase(graph, "prediction injection")
43     {
44     }
45     
46     bool run()
47     {
48         ASSERT(m_graph.m_form == ThreadedCPS);
49         ASSERT(m_graph.m_unificationState == GloballyUnified);
50         
51         ASSERT(codeBlock()->numParameters() >= 1);
52         {
53             ConcurrentJITLocker locker(profiledBlock()->m_lock);
54             
55             for (size_t arg = 0; arg < static_cast<size_t>(codeBlock()->numParameters()); ++arg) {
56                 ValueProfile* profile = profiledBlock()->valueProfileForArgument(arg);
57                 if (!profile)
58                     continue;
59             
60                 m_graph.m_arguments[arg]->variableAccessData()->predict(
61                     profile->computeUpdatedPrediction(locker));
62             }
63         }
64         
65         for (BlockIndex blockIndex = 0; blockIndex < m_graph.numBlocks(); ++blockIndex) {
66             BasicBlock* block = m_graph.block(blockIndex);
67             if (!block)
68                 continue;
69             if (!block->isOSRTarget)
70                 continue;
71             if (block->bytecodeBegin != m_graph.m_plan.osrEntryBytecodeIndex)
72                 continue;
73             for (size_t i = 0; i < m_graph.m_plan.mustHandleValues.size(); ++i) {
74                 int operand = m_graph.m_plan.mustHandleValues.operandForIndex(i);
75                 Node* node = block->variablesAtHead.operand(operand);
76                 if (!node)
77                     continue;
78                 ASSERT(node->hasLocal(m_graph));
79                 node->variableAccessData()->predict(
80                     speculationFromValue(m_graph.m_plan.mustHandleValues[i]));
81             }
82         }
83         
84         return true;
85     }
86 };
87
88 bool performPredictionInjection(Graph& graph)
89 {
90     SamplingRegion samplingRegion("DFG Prediction Injection Phase");
91     return runPhase<PredictionInjectionPhase>(graph);
92 }
93
94 } } // namespace JSC::DFG
95
96 #endif // ENABLE(DFG_JIT)
97