summaryrefslogtreecommitdiff
path: root/compiler/optimizing/nodes.cc
diff options
context:
space:
mode:
author David Brazdil <dbrazdil@google.com> 2015-08-19 15:04:01 +0100
committer David Brazdil <dbrazdil@google.com> 2015-08-19 17:43:13 +0100
commitec16f79a4d0aeff319bf52139a0c82de3080d73c (patch)
tree1306b2cbaa97bbacc2cbc100d6e157e14f9510cb /compiler/optimizing/nodes.cc
parent32f264e67afa8654a5570d38b627515fb73fc333 (diff)
ART: Refactor try/catch block info, store exception type
This patch replaces HBasicBlock fields storing try/catch info with a single TryCatchInformation data structure, saving memory for the majority of non-try/catch blocks. It also changes builder to store the exception type for catch blocks. Change-Id: Ib3e43f7db247e6915d67c267fc62410420e230c9
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r--compiler/optimizing/nodes.cc17
1 files changed, 11 insertions, 6 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index f2b63ae678..64c680c3fb 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -339,7 +339,10 @@ void HGraph::ComputeTryBlockInformation() {
// been visited already and had its try membership set.
HBasicBlock* first_predecessor = block->GetPredecessors().Get(0);
DCHECK(!block->IsLoopHeader() || !block->GetLoopInformation()->IsBackEdge(*first_predecessor));
- block->SetTryEntry(first_predecessor->ComputeTryEntryOfSuccessors());
+ const HTryBoundary* try_entry = first_predecessor->ComputeTryEntryOfSuccessors();
+ if (try_entry != nullptr) {
+ block->SetTryCatchInformation(new (arena_) TryCatchInformation(*try_entry));
+ }
}
}
@@ -1164,19 +1167,21 @@ HBasicBlock* HBasicBlock::SplitAfter(HInstruction* cursor) {
return new_block;
}
-HTryBoundary* HBasicBlock::ComputeTryEntryOfSuccessors() const {
+const HTryBoundary* HBasicBlock::ComputeTryEntryOfSuccessors() const {
if (EndsWithTryBoundary()) {
HTryBoundary* try_boundary = GetLastInstruction()->AsTryBoundary();
if (try_boundary->IsEntry()) {
- DCHECK(try_entry_ == nullptr);
+ DCHECK(!IsTryBlock());
return try_boundary;
} else {
- DCHECK(try_entry_ != nullptr);
- DCHECK(try_entry_->HasSameExceptionHandlersAs(*try_boundary));
+ DCHECK(IsTryBlock());
+ DCHECK(try_catch_information_->GetTryEntry().HasSameExceptionHandlersAs(*try_boundary));
return nullptr;
}
+ } else if (IsTryBlock()) {
+ return &try_catch_information_->GetTryEntry();
} else {
- return try_entry_;
+ return nullptr;
}
}