]>
git.saurik.com Git - apple/javascriptcore.git/blob - dfg/DFGBasicBlock.cpp
2 * Copyright (C) 2013, 2014 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 , cfaBranchDirection(InvalidBranchDirection
)
49 , variablesAtHead(numArguments
, numLocals
)
50 , variablesAtTail(numArguments
, numLocals
)
51 , valuesAtHead(numArguments
, numLocals
)
52 , valuesAtTail(numArguments
, numLocals
)
53 , executionCount(executionCount
)
57 BasicBlock::~BasicBlock() { }
59 void BasicBlock::ensureLocals(unsigned newNumLocals
)
61 variablesAtHead
.ensureLocals(newNumLocals
);
62 variablesAtTail
.ensureLocals(newNumLocals
);
63 valuesAtHead
.ensureLocals(newNumLocals
);
64 valuesAtTail
.ensureLocals(newNumLocals
);
67 bool BasicBlock::isInPhis(Node
* node
) const
69 for (size_t i
= 0; i
< phis
.size(); ++i
) {
76 bool BasicBlock::isInBlock(Node
* myNode
) const
78 for (size_t i
= 0; i
< numNodes(); ++i
) {
79 if (node(i
) == myNode
)
85 void BasicBlock::removePredecessor(BasicBlock
* block
)
87 for (unsigned i
= 0; i
< predecessors
.size(); ++i
) {
88 if (predecessors
[i
] != block
)
90 predecessors
[i
] = predecessors
.last();
91 predecessors
.removeLast();
94 RELEASE_ASSERT_NOT_REACHED();
97 void BasicBlock::replacePredecessor(BasicBlock
* from
, BasicBlock
* to
)
99 for (unsigned i
= predecessors
.size(); i
--;) {
100 if (predecessors
[i
] != from
)
102 predecessors
[i
] = to
;
105 RELEASE_ASSERT_NOT_REACHED();
108 void BasicBlock::dump(PrintStream
& out
) const
110 out
.print("#", index
);
113 BasicBlock::SSAData::SSAData(BasicBlock
* block
)
114 : availabilityAtHead(OperandsLike
, block
->variablesAtHead
)
115 , availabilityAtTail(OperandsLike
, block
->variablesAtHead
)
119 BasicBlock::SSAData::~SSAData() { }
121 } } // namespace JSC::DFG
123 #endif // ENABLE(DFG_JIT)