b5bfef893849ddd877924c81933c17526ece596d
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGBasicBlock.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 "DFGBasicBlock.h"
31
32 #include "JSCInlines.h"
33
34 namespace JSC { namespace DFG {
35
36 BasicBlock::BasicBlock(unsigned bytecodeBegin, unsigned numArguments, unsigned numLocals)
37     : bytecodeBegin(bytecodeBegin)
38     , index(NoBlock)
39     , isOSRTarget(false)
40     , cfaHasVisited(false)
41     , cfaShouldRevisit(false)
42     , cfaFoundConstants(false)
43     , cfaDidFinish(true)
44     , cfaBranchDirection(InvalidBranchDirection)
45 #if !ASSERT_DISABLED
46     , isLinked(false)
47 #endif
48     , isReachable(false)
49     , variablesAtHead(numArguments, numLocals)
50     , variablesAtTail(numArguments, numLocals)
51     , valuesAtHead(numArguments, numLocals)
52     , valuesAtTail(numArguments, numLocals)
53 {
54 }
55
56 BasicBlock::~BasicBlock() { }
57
58 void BasicBlock::ensureLocals(unsigned newNumLocals)
59 {
60     variablesAtHead.ensureLocals(newNumLocals);
61     variablesAtTail.ensureLocals(newNumLocals);
62     valuesAtHead.ensureLocals(newNumLocals);
63     valuesAtTail.ensureLocals(newNumLocals);
64 }
65
66 bool BasicBlock::isInPhis(Node* node) const
67 {
68     for (size_t i = 0; i < phis.size(); ++i) {
69         if (phis[i] == node)
70             return true;
71     }
72     return false;
73 }
74
75 bool BasicBlock::isInBlock(Node* myNode) const
76 {
77     for (size_t i = 0; i < numNodes(); ++i) {
78         if (node(i) == myNode)
79             return true;
80     }
81     return false;
82 }
83
84 void BasicBlock::removePredecessor(BasicBlock* block)
85 {
86     for (unsigned i = 0; i < predecessors.size(); ++i) {
87         if (predecessors[i] != block)
88             continue;
89         predecessors[i] = predecessors.last();
90         predecessors.removeLast();
91         return;
92     }
93     RELEASE_ASSERT_NOT_REACHED();
94 }
95
96 void BasicBlock::replacePredecessor(BasicBlock* from, BasicBlock* to)
97 {
98     for (unsigned i = predecessors.size(); i--;) {
99         if (predecessors[i] != from)
100             continue;
101         predecessors[i] = to;
102         return;
103     }
104     RELEASE_ASSERT_NOT_REACHED();
105 }
106
107 void BasicBlock::dump(PrintStream& out) const
108 {
109     out.print("#", index);
110 }
111
112 BasicBlock::SSAData::SSAData(BasicBlock* block)
113     : flushAtHead(OperandsLike, block->variablesAtHead)
114     , flushAtTail(OperandsLike, block->variablesAtHead)
115     , availabilityAtHead(OperandsLike, block->variablesAtHead)
116     , availabilityAtTail(OperandsLike, block->variablesAtHead)
117 {
118 }
119
120 BasicBlock::SSAData::~SSAData() { }
121
122 } } // namespace JSC::DFG
123
124 #endif // ENABLE(DFG_JIT)
125