1/* 2 * Copyright (C) 2013, 2014 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 "DFGBasicBlock.h" 28 29#if ENABLE(DFG_JIT) 30 31#include "JSCInlines.h" 32 33namespace JSC { namespace DFG { 34 35BasicBlock::BasicBlock( 36 unsigned bytecodeBegin, unsigned numArguments, unsigned numLocals, float executionCount) 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 , executionCount(executionCount) 54{ 55} 56 57BasicBlock::~BasicBlock() { } 58 59void BasicBlock::ensureLocals(unsigned newNumLocals) 60{ 61 variablesAtHead.ensureLocals(newNumLocals); 62 variablesAtTail.ensureLocals(newNumLocals); 63 valuesAtHead.ensureLocals(newNumLocals); 64 valuesAtTail.ensureLocals(newNumLocals); 65} 66 67bool BasicBlock::isInPhis(Node* node) const 68{ 69 for (size_t i = 0; i < phis.size(); ++i) { 70 if (phis[i] == node) 71 return true; 72 } 73 return false; 74} 75 76bool BasicBlock::isInBlock(Node* myNode) const 77{ 78 for (size_t i = 0; i < numNodes(); ++i) { 79 if (node(i) == myNode) 80 return true; 81 } 82 return false; 83} 84 85void BasicBlock::removePredecessor(BasicBlock* block) 86{ 87 for (unsigned i = 0; i < predecessors.size(); ++i) { 88 if (predecessors[i] != block) 89 continue; 90 predecessors[i] = predecessors.last(); 91 predecessors.removeLast(); 92 return; 93 } 94 RELEASE_ASSERT_NOT_REACHED(); 95} 96 97void BasicBlock::replacePredecessor(BasicBlock* from, BasicBlock* to) 98{ 99 for (unsigned i = predecessors.size(); i--;) { 100 if (predecessors[i] != from) 101 continue; 102 predecessors[i] = to; 103 return; 104 } 105 RELEASE_ASSERT_NOT_REACHED(); 106} 107 108void BasicBlock::dump(PrintStream& out) const 109{ 110 out.print("#", index); 111} 112 113BasicBlock::SSAData::SSAData(BasicBlock* block) 114 : availabilityAtHead(OperandsLike, block->variablesAtHead) 115 , availabilityAtTail(OperandsLike, block->variablesAtHead) 116{ 117} 118 119BasicBlock::SSAData::~SSAData() { } 120 121} } // namespace JSC::DFG 122 123#endif // ENABLE(DFG_JIT) 124 125