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 <deque> | 7 #include <deque> |
8 #include <queue> | 8 #include <queue> |
9 #include <sstream> | 9 #include <sstream> |
10 #include <string> | 10 #include <string> |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 // TODO(rossberg): what are the constraints on these? | 240 // TODO(rossberg): what are the constraints on these? |
241 // Type is empty. | 241 // Type is empty. |
242 CheckNotTyped(node); | 242 CheckNotTyped(node); |
243 break; | 243 break; |
244 case IrOpcode::kTerminate: | 244 case IrOpcode::kTerminate: |
245 // Type is empty. | 245 // Type is empty. |
246 CheckNotTyped(node); | 246 CheckNotTyped(node); |
247 CHECK_EQ(1, control_count); | 247 CHECK_EQ(1, control_count); |
248 CHECK_EQ(input_count, 1 + effect_count); | 248 CHECK_EQ(input_count, 1 + effect_count); |
249 break; | 249 break; |
| 250 case IrOpcode::kOsrNormalEntry: |
| 251 case IrOpcode::kOsrLoopEntry: |
| 252 // Osr entries have |
| 253 CHECK_EQ(1, effect_count); |
| 254 CHECK_EQ(1, control_count); |
| 255 // Type is empty. |
| 256 CheckNotTyped(node); |
| 257 break; |
250 | 258 |
251 // Common operators | 259 // Common operators |
252 // ---------------- | 260 // ---------------- |
253 case IrOpcode::kParameter: { | 261 case IrOpcode::kParameter: { |
254 // Parameters have the start node as inputs. | 262 // Parameters have the start node as inputs. |
255 CHECK_EQ(1, input_count); | 263 CHECK_EQ(1, input_count); |
256 CHECK_EQ(IrOpcode::kStart, | 264 CHECK_EQ(IrOpcode::kStart, |
257 NodeProperties::GetValueInput(node, 0)->opcode()); | 265 NodeProperties::GetValueInput(node, 0)->opcode()); |
258 // Parameter has an input that produces enough values. | 266 // Parameter has an input that produces enough values. |
259 int index = OpParameter<int>(node); | 267 int index = OpParameter<int>(node); |
(...skipping 30 matching lines...) Expand all Loading... |
290 CHECK_EQ(0, input_count); | 298 CHECK_EQ(0, input_count); |
291 // Type can be anything represented as a heap pointer. | 299 // Type can be anything represented as a heap pointer. |
292 CheckUpperIs(node, Type::TaggedPointer()); | 300 CheckUpperIs(node, Type::TaggedPointer()); |
293 break; | 301 break; |
294 case IrOpcode::kExternalConstant: | 302 case IrOpcode::kExternalConstant: |
295 // Constants have no inputs. | 303 // Constants have no inputs. |
296 CHECK_EQ(0, input_count); | 304 CHECK_EQ(0, input_count); |
297 // Type is considered internal. | 305 // Type is considered internal. |
298 CheckUpperIs(node, Type::Internal()); | 306 CheckUpperIs(node, Type::Internal()); |
299 break; | 307 break; |
| 308 case IrOpcode::kOsrValue: |
| 309 // OSR values have a value and a control input. |
| 310 CHECK_EQ(1, control_count); |
| 311 CHECK_EQ(1, input_count); |
| 312 // Type is merged from other values in the graph and could be any. |
| 313 CheckUpperIs(node, Type::Any()); |
| 314 break; |
300 case IrOpcode::kProjection: { | 315 case IrOpcode::kProjection: { |
301 // Projection has an input that produces enough values. | 316 // Projection has an input that produces enough values. |
302 int index = static_cast<int>(OpParameter<size_t>(node->op())); | 317 int index = static_cast<int>(OpParameter<size_t>(node->op())); |
303 Node* input = NodeProperties::GetValueInput(node, 0); | 318 Node* input = NodeProperties::GetValueInput(node, 0); |
304 CHECK_GT(input->op()->ValueOutputCount(), index); | 319 CHECK_GT(input->op()->ValueOutputCount(), index); |
305 // Type can be anything. | 320 // Type can be anything. |
306 // TODO(rossberg): Introduce tuple types for this. | 321 // TODO(rossberg): Introduce tuple types for this. |
307 // TODO(titzer): Convince rossberg not to. | 322 // TODO(titzer): Convince rossberg not to. |
308 CheckUpperIs(node, Type::Any()); | 323 CheckUpperIs(node, Type::Any()); |
309 break; | 324 break; |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 // Check inputs for all nodes in the block. | 1003 // Check inputs for all nodes in the block. |
989 for (size_t i = 0; i < block->NodeCount(); i++) { | 1004 for (size_t i = 0; i < block->NodeCount(); i++) { |
990 Node* node = block->NodeAt(i); | 1005 Node* node = block->NodeAt(i); |
991 CheckInputsDominate(schedule, block, node, static_cast<int>(i) - 1); | 1006 CheckInputsDominate(schedule, block, node, static_cast<int>(i) - 1); |
992 } | 1007 } |
993 } | 1008 } |
994 } | 1009 } |
995 } | 1010 } |
996 } | 1011 } |
997 } // namespace v8::internal::compiler | 1012 } // namespace v8::internal::compiler |
OLD | NEW |