MovHint should be a strong use
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGMayExit.cpp
1 /*
2  * Copyright (C) 2014, 2015 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 "DFGMayExit.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include "DFGGraph.h"
32 #include "DFGNode.h"
33 #include "Operations.h"
34
35 namespace JSC { namespace DFG {
36
37 namespace {
38
39 class EdgeMayExit {
40 public:
41     EdgeMayExit()
42         : m_result(false)
43     {
44     }
45     
46     void operator()(Node*, Edge edge)
47     {
48         m_result |= edge.willHaveCheck();
49     }
50     
51     bool result() const { return m_result; }
52     
53 private:
54     bool m_result;
55 };
56
57 } // anonymous namespace
58
59 bool mayExit(Graph& graph, Node* node)
60 {
61     switch (node->op()) {
62     // This is a carefully curated list of nodes that definitely do not exit. We try to be very
63     // conservative when maintaining this list, because adding new node types to it doesn't
64     // generally make things a lot better but it might introduce insanely subtle bugs.
65     case SetArgument:
66     case JSConstant:
67     case DoubleConstant:
68     case Int52Constant:
69     case MovHint:
70     case SetLocal:
71     case Flush:
72     case Phantom:
73     case Check:
74     case HardPhantom:
75     case GetLocal:
76     case LoopHint:
77     case Phi:
78     case Upsilon:
79     case ZombieHint:
80     case BottomValue:
81     case PutHint:
82     case PhantomNewObject:
83     case PutStack:
84     case KillStack:
85     case GetStack:
86     case GetCallee:
87     case GetArgumentCount:
88     case GetScope:
89     case PhantomLocal:
90     case CountExecution:
91         break;
92         
93     default:
94         // If in doubt, return true.
95         return true;
96     }
97
98     EdgeMayExit functor;
99     DFG_NODE_DO_TO_CHILDREN(graph, node, functor);
100     return functor.result();
101 }
102
103 } } // namespace JSC::DFG
104
105 #endif // ENABLE(DFG_JIT)