diff options
author | 2016-01-15 09:19:12 +0000 | |
---|---|---|
committer | 2016-01-15 09:19:12 +0000 | |
commit | 28943466954ca5d6f586bb5496f7f3f0f85fe87a (patch) | |
tree | 56a4f7427addf50aba847ea944ec24396c7e848f /compiler/optimizing/graph_checker.cc | |
parent | 68c56ae9ccdb6e348501456e374ae65e74f6270c (diff) | |
parent | 6de1938e562b0d06e462512dd806166e754035ea (diff) |
Merge "ART: Remove incorrect HFakeString optimization"
Diffstat (limited to 'compiler/optimizing/graph_checker.cc')
-rw-r--r-- | compiler/optimizing/graph_checker.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/compiler/optimizing/graph_checker.cc b/compiler/optimizing/graph_checker.cc index d60f3e31a5..9439ba0c8d 100644 --- a/compiler/optimizing/graph_checker.cc +++ b/compiler/optimizing/graph_checker.cc @@ -618,6 +618,34 @@ void SSAChecker::VisitInstruction(HInstruction* instruction) { instruction->GetId())); } } + + if (instruction->CanThrowIntoCatchBlock()) { + // Find the top-level environment. This corresponds to the environment of + // the catch block since we do not inline methods with try/catch. + HEnvironment* environment = instruction->GetEnvironment(); + while (environment->GetParent() != nullptr) { + environment = environment->GetParent(); + } + + // Find all catch blocks and test that `instruction` has an environment + // value for each one. + const HTryBoundary& entry = instruction->GetBlock()->GetTryCatchInformation()->GetTryEntry(); + for (HBasicBlock* catch_block : entry.GetExceptionHandlers()) { + for (HInstructionIterator phi_it(catch_block->GetPhis()); !phi_it.Done(); phi_it.Advance()) { + HPhi* catch_phi = phi_it.Current()->AsPhi(); + if (environment->GetInstructionAt(catch_phi->GetRegNumber()) == nullptr) { + AddError(StringPrintf("Instruction %s:%d throws into catch block %d " + "with catch phi %d for vreg %d but its " + "corresponding environment slot is empty.", + instruction->DebugName(), + instruction->GetId(), + catch_block->GetBlockId(), + catch_phi->GetId(), + catch_phi->GetRegNumber())); + } + } + } + } } static Primitive::Type PrimitiveKind(Primitive::Type type) { |