OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/verifier.h" | 5 #include "src/compiler/verifier.h" |
6 | 6 |
7 #include "src/compiler/generic-algorithm.h" | 7 #include "src/compiler/generic-algorithm.h" |
8 #include "src/compiler/generic-node-inl.h" | 8 #include "src/compiler/generic-node-inl.h" |
9 #include "src/compiler/generic-node.h" | 9 #include "src/compiler/generic-node.h" |
10 #include "src/compiler/graph-inl.h" | 10 #include "src/compiler/graph-inl.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 CHECK(NodeProperties::HasControlOutput(control)); | 95 CHECK(NodeProperties::HasControlOutput(control)); |
96 CHECK(IsDefUseChainLinkPresent(control, node)); | 96 CHECK(IsDefUseChainLinkPresent(control, node)); |
97 CHECK(IsUseDefChainLinkPresent(control, node)); | 97 CHECK(IsUseDefChainLinkPresent(control, node)); |
98 } | 98 } |
99 | 99 |
100 // Verify all successors are projections if multiple value outputs exist. | 100 // Verify all successors are projections if multiple value outputs exist. |
101 if (NodeProperties::GetValueOutputCount(node) > 1) { | 101 if (NodeProperties::GetValueOutputCount(node) > 1) { |
102 Node::Uses uses = node->uses(); | 102 Node::Uses uses = node->uses(); |
103 for (Node::Uses::iterator it = uses.begin(); it != uses.end(); ++it) { | 103 for (Node::Uses::iterator it = uses.begin(); it != uses.end(); ++it) { |
104 CHECK(!NodeProperties::IsValueEdge(it.edge()) || | 104 CHECK(!NodeProperties::IsValueEdge(it.edge()) || |
105 (*it)->opcode() == IrOpcode::kProjection); | 105 (*it)->opcode() == IrOpcode::kProjection || |
| 106 (*it)->opcode() == IrOpcode::kParameter); |
106 } | 107 } |
107 } | 108 } |
108 | 109 |
109 switch (node->opcode()) { | 110 switch (node->opcode()) { |
110 case IrOpcode::kStart: | 111 case IrOpcode::kStart: |
111 // Start has no inputs. | 112 // Start has no inputs. |
112 CHECK_EQ(0, input_count); | 113 CHECK_EQ(0, input_count); |
113 break; | 114 break; |
114 case IrOpcode::kEnd: | 115 case IrOpcode::kEnd: |
115 // End has no outputs. | 116 // End has no outputs. |
(...skipping 25 matching lines...) Expand all Loading... |
141 break; | 142 break; |
142 case IrOpcode::kLoop: | 143 case IrOpcode::kLoop: |
143 case IrOpcode::kMerge: | 144 case IrOpcode::kMerge: |
144 break; | 145 break; |
145 case IrOpcode::kReturn: | 146 case IrOpcode::kReturn: |
146 // TODO(rossberg): check successor is End | 147 // TODO(rossberg): check successor is End |
147 break; | 148 break; |
148 case IrOpcode::kThrow: | 149 case IrOpcode::kThrow: |
149 // TODO(rossberg): what are the constraints on these? | 150 // TODO(rossberg): what are the constraints on these? |
150 break; | 151 break; |
151 case IrOpcode::kParameter: | 152 case IrOpcode::kParameter: { |
152 // Parameters have no inputs. | 153 // Parameters have the start node as inputs. |
153 CHECK_EQ(0, input_count); | 154 CHECK_EQ(1, input_count); |
| 155 CHECK_EQ(IrOpcode::kStart, |
| 156 NodeProperties::GetValueInput(node, 0)->opcode()); |
| 157 // Parameter has an input that produces enough values. |
| 158 int index = static_cast<Operator1<int>*>(node->op())->parameter(); |
| 159 Node* input = NodeProperties::GetValueInput(node, 0); |
| 160 // Currently, parameter indices start at -1 instead of 0. |
| 161 CHECK_GT(NodeProperties::GetValueOutputCount(input), index + 1); |
154 break; | 162 break; |
| 163 } |
155 case IrOpcode::kInt32Constant: | 164 case IrOpcode::kInt32Constant: |
156 case IrOpcode::kInt64Constant: | 165 case IrOpcode::kInt64Constant: |
157 case IrOpcode::kFloat64Constant: | 166 case IrOpcode::kFloat64Constant: |
158 case IrOpcode::kExternalConstant: | 167 case IrOpcode::kExternalConstant: |
159 case IrOpcode::kNumberConstant: | 168 case IrOpcode::kNumberConstant: |
160 case IrOpcode::kHeapConstant: | 169 case IrOpcode::kHeapConstant: |
161 // Constants have no inputs. | 170 // Constants have no inputs. |
162 CHECK_EQ(0, input_count); | 171 CHECK_EQ(0, input_count); |
163 break; | 172 break; |
164 case IrOpcode::kPhi: { | 173 case IrOpcode::kPhi: { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 // All control nodes reachable from end are reachable from start. | 232 // All control nodes reachable from end are reachable from start. |
224 for (NodeSet::iterator it = visitor.reached_from_end.begin(); | 233 for (NodeSet::iterator it = visitor.reached_from_end.begin(); |
225 it != visitor.reached_from_end.end(); ++it) { | 234 it != visitor.reached_from_end.end(); ++it) { |
226 CHECK(!NodeProperties::IsControl(*it) || | 235 CHECK(!NodeProperties::IsControl(*it) || |
227 visitor.reached_from_start.count(*it)); | 236 visitor.reached_from_start.count(*it)); |
228 } | 237 } |
229 } | 238 } |
230 } | 239 } |
231 } | 240 } |
232 } // namespace v8::internal::compiler | 241 } // namespace v8::internal::compiler |
OLD | NEW |