| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <queue> | 9 #include <queue> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "src/compiler/schedule.h" | 22 #include "src/compiler/schedule.h" |
| 23 #include "src/compiler/simplified-operator.h" | 23 #include "src/compiler/simplified-operator.h" |
| 24 #include "src/ostreams.h" | 24 #include "src/ostreams.h" |
| 25 | 25 |
| 26 namespace v8 { | 26 namespace v8 { |
| 27 namespace internal { | 27 namespace internal { |
| 28 namespace compiler { | 28 namespace compiler { |
| 29 | 29 |
| 30 | 30 |
| 31 static bool IsDefUseChainLinkPresent(Node* def, Node* use) { | 31 static bool IsDefUseChainLinkPresent(Node* def, Node* use) { |
| 32 auto const uses = def->uses(); | 32 const Node::Uses uses = def->uses(); |
| 33 return std::find(uses.begin(), uses.end(), use) != uses.end(); | 33 return std::find(uses.begin(), uses.end(), use) != uses.end(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 | 36 |
| 37 static bool IsUseDefChainLinkPresent(Node* def, Node* use) { | 37 static bool IsUseDefChainLinkPresent(Node* def, Node* use) { |
| 38 auto const inputs = use->inputs(); | 38 const Node::Inputs inputs = use->inputs(); |
| 39 return std::find(inputs.begin(), inputs.end(), def) != inputs.end(); | 39 return std::find(inputs.begin(), inputs.end(), def) != inputs.end(); |
| 40 } | 40 } |
| 41 | 41 |
| 42 | 42 |
| 43 class Verifier::Visitor { | 43 class Verifier::Visitor { |
| 44 public: | 44 public: |
| 45 Visitor(Zone* z, Typing typed) : zone(z), typing(typed) {} | 45 Visitor(Zone* z, Typing typed) : zone(z), typing(typed) {} |
| 46 | 46 |
| 47 void Check(Node* node); | 47 void Check(Node* node); |
| 48 | 48 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 // Type is empty. | 187 // Type is empty. |
| 188 CheckNotTyped(node); | 188 CheckNotTyped(node); |
| 189 break; | 189 break; |
| 190 case IrOpcode::kDead: | 190 case IrOpcode::kDead: |
| 191 // Dead is never connected to the graph. | 191 // Dead is never connected to the graph. |
| 192 UNREACHABLE(); | 192 UNREACHABLE(); |
| 193 break; | 193 break; |
| 194 case IrOpcode::kBranch: { | 194 case IrOpcode::kBranch: { |
| 195 // Branch uses are IfTrue and IfFalse. | 195 // Branch uses are IfTrue and IfFalse. |
| 196 int count_true = 0, count_false = 0; | 196 int count_true = 0, count_false = 0; |
| 197 for (auto use : node->uses()) { | 197 for (const Node* use : node->uses()) { |
| 198 CHECK(use->opcode() == IrOpcode::kIfTrue || | 198 CHECK(use->opcode() == IrOpcode::kIfTrue || |
| 199 use->opcode() == IrOpcode::kIfFalse); | 199 use->opcode() == IrOpcode::kIfFalse); |
| 200 if (use->opcode() == IrOpcode::kIfTrue) ++count_true; | 200 if (use->opcode() == IrOpcode::kIfTrue) ++count_true; |
| 201 if (use->opcode() == IrOpcode::kIfFalse) ++count_false; | 201 if (use->opcode() == IrOpcode::kIfFalse) ++count_false; |
| 202 } | 202 } |
| 203 CHECK_EQ(1, count_true); | 203 CHECK_EQ(1, count_true); |
| 204 CHECK_EQ(1, count_false); | 204 CHECK_EQ(1, count_false); |
| 205 // Type is empty. | 205 // Type is empty. |
| 206 CheckNotTyped(node); | 206 CheckNotTyped(node); |
| 207 break; | 207 break; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 225 // IfSuccess and IfException continuation only on throwing nodes. | 225 // IfSuccess and IfException continuation only on throwing nodes. |
| 226 Node* input = NodeProperties::GetControlInput(node, 0); | 226 Node* input = NodeProperties::GetControlInput(node, 0); |
| 227 CHECK(!input->op()->HasProperty(Operator::kNoThrow)); | 227 CHECK(!input->op()->HasProperty(Operator::kNoThrow)); |
| 228 // Type can be anything. | 228 // Type can be anything. |
| 229 CheckUpperIs(node, Type::Any()); | 229 CheckUpperIs(node, Type::Any()); |
| 230 break; | 230 break; |
| 231 } | 231 } |
| 232 case IrOpcode::kSwitch: { | 232 case IrOpcode::kSwitch: { |
| 233 // Switch uses are Case and Default. | 233 // Switch uses are Case and Default. |
| 234 int count_case = 0, count_default = 0; | 234 int count_case = 0, count_default = 0; |
| 235 for (auto use : node->uses()) { | 235 for (const Node* use : node->uses()) { |
| 236 switch (use->opcode()) { | 236 switch (use->opcode()) { |
| 237 case IrOpcode::kIfValue: { | 237 case IrOpcode::kIfValue: { |
| 238 for (auto user : node->uses()) { | 238 for (const Node* user : node->uses()) { |
| 239 if (user != use && user->opcode() == IrOpcode::kIfValue) { | 239 if (user != use && user->opcode() == IrOpcode::kIfValue) { |
| 240 CHECK_NE(OpParameter<int32_t>(use->op()), | 240 CHECK_NE(OpParameter<int32_t>(use->op()), |
| 241 OpParameter<int32_t>(user->op())); | 241 OpParameter<int32_t>(user->op())); |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 ++count_case; | 244 ++count_case; |
| 245 break; | 245 break; |
| 246 } | 246 } |
| 247 case IrOpcode::kIfDefault: { | 247 case IrOpcode::kIfDefault: { |
| 248 ++count_default; | 248 ++count_default; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 276 break; | 276 break; |
| 277 case IrOpcode::kDeoptimizeIf: | 277 case IrOpcode::kDeoptimizeIf: |
| 278 case IrOpcode::kDeoptimizeUnless: | 278 case IrOpcode::kDeoptimizeUnless: |
| 279 // Type is empty. | 279 // Type is empty. |
| 280 CheckNotTyped(node); | 280 CheckNotTyped(node); |
| 281 break; | 281 break; |
| 282 case IrOpcode::kDeoptimize: | 282 case IrOpcode::kDeoptimize: |
| 283 case IrOpcode::kReturn: | 283 case IrOpcode::kReturn: |
| 284 case IrOpcode::kThrow: | 284 case IrOpcode::kThrow: |
| 285 // Deoptimize, Return and Throw uses are End. | 285 // Deoptimize, Return and Throw uses are End. |
| 286 for (auto use : node->uses()) { | 286 for (const Node* use : node->uses()) { |
| 287 CHECK_EQ(IrOpcode::kEnd, use->opcode()); | 287 CHECK_EQ(IrOpcode::kEnd, use->opcode()); |
| 288 } | 288 } |
| 289 // Type is empty. | 289 // Type is empty. |
| 290 CheckNotTyped(node); | 290 CheckNotTyped(node); |
| 291 break; | 291 break; |
| 292 case IrOpcode::kTerminate: | 292 case IrOpcode::kTerminate: |
| 293 // Terminates take one loop and effect. | 293 // Terminates take one loop and effect. |
| 294 CHECK_EQ(1, control_count); | 294 CHECK_EQ(1, control_count); |
| 295 CHECK_EQ(1, effect_count); | 295 CHECK_EQ(1, effect_count); |
| 296 CHECK_EQ(2, input_count); | 296 CHECK_EQ(2, input_count); |
| 297 CHECK_EQ(IrOpcode::kLoop, | 297 CHECK_EQ(IrOpcode::kLoop, |
| 298 NodeProperties::GetControlInput(node)->opcode()); | 298 NodeProperties::GetControlInput(node)->opcode()); |
| 299 // Terminate uses are End. | 299 // Terminate uses are End. |
| 300 for (auto use : node->uses()) { | 300 for (const Node* use : node->uses()) { |
| 301 CHECK_EQ(IrOpcode::kEnd, use->opcode()); | 301 CHECK_EQ(IrOpcode::kEnd, use->opcode()); |
| 302 } | 302 } |
| 303 // Type is empty. | 303 // Type is empty. |
| 304 CheckNotTyped(node); | 304 CheckNotTyped(node); |
| 305 break; | 305 break; |
| 306 case IrOpcode::kOsrNormalEntry: | 306 case IrOpcode::kOsrNormalEntry: |
| 307 case IrOpcode::kOsrLoopEntry: | 307 case IrOpcode::kOsrLoopEntry: |
| 308 // Osr entries take one control and effect. | 308 // Osr entries take one control and effect. |
| 309 CHECK_EQ(1, control_count); | 309 CHECK_EQ(1, control_count); |
| 310 CHECK_EQ(1, effect_count); | 310 CHECK_EQ(1, effect_count); |
| (...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1279 replacement->op()->EffectOutputCount() > 0); | 1279 replacement->op()->EffectOutputCount() > 0); |
| 1280 DCHECK(!NodeProperties::IsFrameStateEdge(edge) || | 1280 DCHECK(!NodeProperties::IsFrameStateEdge(edge) || |
| 1281 replacement->opcode() == IrOpcode::kFrameState); | 1281 replacement->opcode() == IrOpcode::kFrameState); |
| 1282 } | 1282 } |
| 1283 | 1283 |
| 1284 #endif // DEBUG | 1284 #endif // DEBUG |
| 1285 | 1285 |
| 1286 } // namespace compiler | 1286 } // namespace compiler |
| 1287 } // namespace internal | 1287 } // namespace internal |
| 1288 } // namespace v8 | 1288 } // namespace v8 |
| OLD | NEW |