2 * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "DFGBasicBlock.h"
31 #include "JSCInlines.h"
33 namespace JSC
{ namespace DFG
{
35 BasicBlock::BasicBlock(
36 unsigned bytecodeBegin
, unsigned numArguments
, unsigned numLocals
, float executionCount
)
37 : bytecodeBegin(bytecodeBegin
)
40 , cfaHasVisited(false)
41 , cfaShouldRevisit(false)
42 , cfaFoundConstants(false)
44 , cfaStructureClobberStateAtHead(StructuresAreWatched
)
45 , cfaStructureClobberStateAtTail(StructuresAreWatched
)
46 , cfaBranchDirection(InvalidBranchDirection
)
51 , variablesAtHead(numArguments
, numLocals
)
52 , variablesAtTail(numArguments
, numLocals
)
53 , valuesAtHead(numArguments
, numLocals
)
54 , valuesAtTail(numArguments
, numLocals
)
55 , intersectionOfPastValuesAtHead(numArguments
, numLocals
, AbstractValue::fullTop())
56 , intersectionOfCFAHasVisited(true)
57 , executionCount(executionCount
)
61 BasicBlock::~BasicBlock()
65 void BasicBlock::ensureLocals(unsigned newNumLocals
)
67 variablesAtHead
.ensureLocals(newNumLocals
);
68 variablesAtTail
.ensureLocals(newNumLocals
);
69 valuesAtHead
.ensureLocals(newNumLocals
);
70 valuesAtTail
.ensureLocals(newNumLocals
);
71 intersectionOfPastValuesAtHead
.ensureLocals(newNumLocals
, AbstractValue::fullTop());
74 void BasicBlock::replaceTerminal(Node
* node
)
76 NodeAndIndex result
= findTerminal();
80 m_nodes
.insert(result
.index
+ 1, node
);
81 result
.node
->remove();
87 bool BasicBlock::isInPhis(Node
* node
) const
89 for (size_t i
= 0; i
< phis
.size(); ++i
) {
96 bool BasicBlock::isInBlock(Node
* myNode
) const
98 for (size_t i
= 0; i
< numNodes(); ++i
) {
99 if (node(i
) == myNode
)
105 Node
* BasicBlock::firstOriginNode()
107 for (Node
* node
: *this) {
108 if (node
->origin
.isSet())
111 RELEASE_ASSERT_NOT_REACHED();
115 NodeOrigin
BasicBlock::firstOrigin()
117 return firstOriginNode()->origin
;
120 void BasicBlock::removePredecessor(BasicBlock
* block
)
122 for (unsigned i
= 0; i
< predecessors
.size(); ++i
) {
123 if (predecessors
[i
] != block
)
125 predecessors
[i
] = predecessors
.last();
126 predecessors
.removeLast();
129 RELEASE_ASSERT_NOT_REACHED();
132 void BasicBlock::replacePredecessor(BasicBlock
* from
, BasicBlock
* to
)
134 for (unsigned i
= predecessors
.size(); i
--;) {
135 if (predecessors
[i
] != from
)
137 predecessors
[i
] = to
;
140 RELEASE_ASSERT_NOT_REACHED();
143 void BasicBlock::dump(PrintStream
& out
) const
145 out
.print("#", index
);
148 BasicBlock::SSAData::SSAData(BasicBlock
* block
)
150 availabilityAtHead
.m_locals
= Operands
<Availability
>(OperandsLike
, block
->variablesAtHead
);
151 availabilityAtTail
.m_locals
= Operands
<Availability
>(OperandsLike
, block
->variablesAtHead
);
154 BasicBlock::SSAData::~SSAData() { }
156 } } // namespace JSC::DFG
158 #endif // ENABLE(DFG_JIT)