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 "DFGSSALoweringPhase.h"
31 #include "DFGBasicBlockInlines.h"
33 #include "DFGInsertionSet.h"
35 #include "JSCInlines.h"
37 namespace JSC
{ namespace DFG
{
39 class SSALoweringPhase
: public Phase
{
40 static const bool verbose
= false;
43 SSALoweringPhase(Graph
& graph
)
44 : Phase(graph
, "SSA lowering")
45 , m_insertionSet(graph
)
51 RELEASE_ASSERT(m_graph
.m_form
== SSA
);
53 for (BlockIndex blockIndex
= m_graph
.numBlocks(); blockIndex
--;) {
54 m_block
= m_graph
.block(blockIndex
);
57 for (m_nodeIndex
= 0; m_nodeIndex
< m_block
->size(); ++m_nodeIndex
) {
58 m_node
= m_block
->at(m_nodeIndex
);
61 m_insertionSet
.execute(m_block
);
70 switch (m_node
->op()) {
72 lowerBoundsCheck(m_node
->child1(), m_node
->child2(), m_node
->child3());
76 case PutByValDirect
: {
77 Edge base
= m_graph
.varArgChild(m_node
, 0);
78 Edge index
= m_graph
.varArgChild(m_node
, 1);
79 Edge storage
= m_graph
.varArgChild(m_node
, 3);
80 if (lowerBoundsCheck(base
, index
, storage
))
83 if (m_node
->arrayMode().typedArrayType() != NotTypedArray
&& m_node
->arrayMode().isOutOfBounds()) {
84 Node
* length
= m_insertionSet
.insertNode(
85 m_nodeIndex
, SpecInt32
, GetArrayLength
, m_node
->origin
,
86 OpInfo(m_node
->arrayMode().asWord()), base
, storage
);
88 m_graph
.varArgChild(m_node
, 4) = Edge(length
, KnownInt32Use
);
99 bool lowerBoundsCheck(Edge base
, Edge index
, Edge storage
)
101 if (!m_node
->arrayMode().permitsBoundsCheckLowering())
104 if (!m_node
->arrayMode().lengthNeedsStorage())
107 Node
* length
= m_insertionSet
.insertNode(
108 m_nodeIndex
, SpecInt32
, GetArrayLength
, m_node
->origin
,
109 OpInfo(m_node
->arrayMode().asWord()), base
, storage
);
110 m_insertionSet
.insertNode(
111 m_nodeIndex
, SpecInt32
, CheckInBounds
, m_node
->origin
,
112 index
, Edge(length
, KnownInt32Use
));
116 InsertionSet m_insertionSet
;
118 unsigned m_nodeIndex
;
122 bool performSSALowering(Graph
& graph
)
124 SamplingRegion
samplingRegion("DFG SSA Lowering Phase");
125 return runPhase
<SSALoweringPhase
>(graph
);
128 } } // namespace JSC::DFG
130 #endif // ENABLE(DFG_JIT)