| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 class HValidator extends HInstructionVisitor { | 7 class HValidator extends HInstructionVisitor { |
| 8 bool isValid = true; | 8 bool isValid = true; |
| 9 HGraph graph; | 9 HGraph graph; |
| 10 | 10 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 } | 143 } |
| 144 return true; | 144 return true; |
| 145 } | 145 } |
| 146 | 146 |
| 147 void visitInstruction(HInstruction instruction) { | 147 void visitInstruction(HInstruction instruction) { |
| 148 // Verifies that we are in the use list of our inputs. | 148 // Verifies that we are in the use list of our inputs. |
| 149 bool hasCorrectInputs() { | 149 bool hasCorrectInputs() { |
| 150 bool inBasicBlock = instruction.isInBasicBlock(); | 150 bool inBasicBlock = instruction.isInBasicBlock(); |
| 151 return everyInstruction(instruction.inputs, (input, count) { | 151 return everyInstruction(instruction.inputs, (input, count) { |
| 152 if (inBasicBlock) { | 152 if (inBasicBlock) { |
| 153 return countInstruction(input.usedBy, instruction) == count; | 153 return input.isInBasicBlock() |
| 154 && countInstruction(input.usedBy, instruction) == count; |
| 154 } else { | 155 } else { |
| 155 return countInstruction(input.usedBy, instruction) == 0; | 156 return countInstruction(input.usedBy, instruction) == 0; |
| 156 } | 157 } |
| 157 }); | 158 }); |
| 158 } | 159 } |
| 159 | 160 |
| 160 // Verifies that all our uses have us in their inputs. | 161 // Verifies that all our uses have us in their inputs. |
| 161 bool hasCorrectUses() { | 162 bool hasCorrectUses() { |
| 162 if (!instruction.isInBasicBlock()) return true; | 163 if (!instruction.isInBasicBlock()) return true; |
| 163 return everyInstruction(instruction.usedBy, (use, count) { | 164 return everyInstruction(instruction.usedBy, (use, count) { |
| 164 return countInstruction(use.inputs, instruction) == count; | 165 return use.isInBasicBlock() |
| 166 && countInstruction(use.inputs, instruction) == count; |
| 165 }); | 167 }); |
| 166 } | 168 } |
| 167 | 169 |
| 168 if (!identical(instruction.block, currentBlock)) { | 170 if (!identical(instruction.block, currentBlock)) { |
| 169 markInvalid("Instruction in wrong block"); | 171 markInvalid("Instruction in wrong block"); |
| 170 } | 172 } |
| 171 if (!hasCorrectInputs()) { | 173 if (!hasCorrectInputs()) { |
| 172 markInvalid("Incorrect inputs"); | 174 markInvalid("Incorrect inputs"); |
| 173 } | 175 } |
| 174 if (!hasCorrectUses()) { | 176 if (!hasCorrectUses()) { |
| 175 markInvalid("Incorrect uses"); | 177 markInvalid("Incorrect uses"); |
| 176 } | 178 } |
| 177 } | 179 } |
| 178 } | 180 } |
| OLD | NEW |