diff options
author | Bill Buzbee <buzbee@android.com> | 2014-09-10 22:30:52 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-09-10 22:30:52 +0000 |
commit | be428b4da47339409aac0cfa153888c384dfaef7 (patch) | |
tree | 4231e198b9feb50991cf2f51dfa374b414c441f8 | |
parent | 958d78e51725730ccc38c33ff9424887adc7343b (diff) | |
parent | 75bcc3780bc40dd7c265e150aff5b891135ff6e3 (diff) | |
download | art-be428b4da47339409aac0cfa153888c384dfaef7.zip art-be428b4da47339409aac0cfa153888c384dfaef7.tar.gz art-be428b4da47339409aac0cfa153888c384dfaef7.tar.bz2 |
Merge "ART: Fix variable formatting and CodeLayout's multiple visits"
-rw-r--r-- | compiler/dex/bb_optimizations.h | 121 | ||||
-rw-r--r-- | compiler/dex/mir_optimization.cc | 28 |
2 files changed, 84 insertions, 65 deletions
diff --git a/compiler/dex/bb_optimizations.h b/compiler/dex/bb_optimizations.h index 2920190..b2c348b 100644 --- a/compiler/dex/bb_optimizations.h +++ b/compiler/dex/bb_optimizations.h @@ -34,16 +34,16 @@ class CacheFieldLoweringInfo : public PassME { void Start(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->DoCacheFieldLoweringInfo(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->DoCacheFieldLoweringInfo(); } bool Gate(const PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return cUnit->mir_graph->HasFieldAccess(); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return c_unit->mir_graph->HasFieldAccess(); } }; @@ -58,16 +58,16 @@ class CacheMethodLoweringInfo : public PassME { void Start(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->DoCacheMethodLoweringInfo(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->DoCacheMethodLoweringInfo(); } bool Gate(const PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return cUnit->mir_graph->HasInvokes(); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return c_unit->mir_graph->HasInvokes(); } }; @@ -84,35 +84,35 @@ class SpecialMethodInliner : public PassME { bool Gate(const PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return cUnit->mir_graph->InlineSpecialMethodsGate(); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return c_unit->mir_graph->InlineSpecialMethodsGate(); } void Start(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->InlineSpecialMethodsStart(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->InlineSpecialMethodsStart(); } bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); - CompilationUnit* cUnit = pass_me_data_holder->c_unit; - DCHECK(cUnit != nullptr); + CompilationUnit* c_unit = pass_me_data_holder->c_unit; + DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; DCHECK(bb != nullptr); - cUnit->mir_graph->InlineSpecialMethods(bb); + c_unit->mir_graph->InlineSpecialMethods(bb); // No need of repeating, so just return false. return false; } void End(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->InlineSpecialMethodsEnd(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->InlineSpecialMethodsEnd(); } }; @@ -127,9 +127,10 @@ class CodeLayout : public PassME { void Start(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->VerifyDataflow(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->VerifyDataflow(); + c_unit->mir_graph->ClearAllVisitedFlags(); } bool Worker(PassDataHolder* data) const; @@ -147,26 +148,26 @@ class NullCheckEliminationAndTypeInference : public PassME { void Start(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->EliminateNullChecksAndInferTypesStart(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->EliminateNullChecksAndInferTypesStart(); } bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); - CompilationUnit* cUnit = pass_me_data_holder->c_unit; - DCHECK(cUnit != nullptr); + CompilationUnit* c_unit = pass_me_data_holder->c_unit; + DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; DCHECK(bb != nullptr); - return cUnit->mir_graph->EliminateNullChecksAndInferTypes(bb); + return c_unit->mir_graph->EliminateNullChecksAndInferTypes(bb); } void End(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->EliminateNullChecksAndInferTypesEnd(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->EliminateNullChecksAndInferTypesEnd(); } }; @@ -178,26 +179,26 @@ class ClassInitCheckElimination : public PassME { bool Gate(const PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return cUnit->mir_graph->EliminateClassInitChecksGate(); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return c_unit->mir_graph->EliminateClassInitChecksGate(); } bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); - CompilationUnit* cUnit = pass_me_data_holder->c_unit; - DCHECK(cUnit != nullptr); + CompilationUnit* c_unit = pass_me_data_holder->c_unit; + DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; DCHECK(bb != nullptr); - return cUnit->mir_graph->EliminateClassInitChecks(bb); + return c_unit->mir_graph->EliminateClassInitChecks(bb); } void End(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->EliminateClassInitChecksEnd(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->EliminateClassInitChecksEnd(); } }; @@ -213,26 +214,26 @@ class GlobalValueNumberingPass : public PassME { bool Gate(const PassDataHolder* data) const OVERRIDE { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return cUnit->mir_graph->ApplyGlobalValueNumberingGate(); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return c_unit->mir_graph->ApplyGlobalValueNumberingGate(); } bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); - CompilationUnit* cUnit = pass_me_data_holder->c_unit; - DCHECK(cUnit != nullptr); + CompilationUnit* c_unit = pass_me_data_holder->c_unit; + DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; DCHECK(bb != nullptr); - return cUnit->mir_graph->ApplyGlobalValueNumbering(bb); + return c_unit->mir_graph->ApplyGlobalValueNumbering(bb); } void End(PassDataHolder* data) const OVERRIDE { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - cUnit->mir_graph->ApplyGlobalValueNumberingEnd(); + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + c_unit->mir_graph->ApplyGlobalValueNumberingEnd(); } }; @@ -247,9 +248,9 @@ class BBCombine : public PassME { bool Gate(const PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return ((cUnit->disable_opt & (1 << kSuppressExceptionEdges)) != 0); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return ((c_unit->disable_opt & (1 << kSuppressExceptionEdges)) != 0); } bool Worker(PassDataHolder* data) const; @@ -266,9 +267,9 @@ class BBOptimizations : public PassME { bool Gate(const PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit; - DCHECK(cUnit != nullptr); - return ((cUnit->disable_opt & (1 << kBBOpt)) == 0); + CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + DCHECK(c_unit != nullptr); + return ((c_unit->disable_opt & (1 << kBBOpt)) == 0); } void Start(PassDataHolder* data) const; diff --git a/compiler/dex/mir_optimization.cc b/compiler/dex/mir_optimization.cc index 5d7cbed..7ac878f 100644 --- a/compiler/dex/mir_optimization.cc +++ b/compiler/dex/mir_optimization.cc @@ -678,26 +678,40 @@ void MIRGraph::CountChecks(struct BasicBlock* bb) { } } -/* Try to make common case the fallthrough path */ +/* Try to make common case the fallthrough path. */ bool MIRGraph::LayoutBlocks(BasicBlock* bb) { - // TODO: For now, just looking for direct throws. Consider generalizing for profile feedback + // TODO: For now, just looking for direct throws. Consider generalizing for profile feedback. if (!bb->explicit_throw) { return false; } + + // If we visited it, we are done. + if (bb->visited) { + return false; + } + bb->visited = true; + BasicBlock* walker = bb; while (true) { - // Check termination conditions + // Check termination conditions. if ((walker->block_type == kEntryBlock) || (Predecessors(walker) != 1)) { break; } BasicBlock* prev = GetBasicBlock(walker->predecessors->Get(0)); + + // If we visited the predecessor, we are done. + if (prev->visited) { + return false; + } + prev->visited = true; + if (prev->conditional_branch) { if (GetBasicBlock(prev->fall_through) == walker) { - // Already done - return + // Already done - return. break; } DCHECK_EQ(walker, GetBasicBlock(prev->taken)); - // Got one. Flip it and exit + // Got one. Flip it and exit. Instruction::Code opcode = prev->last_mir_insn->dalvikInsn.opcode; switch (opcode) { case Instruction::IF_EQ: opcode = Instruction::IF_NE; break; @@ -721,6 +735,10 @@ bool MIRGraph::LayoutBlocks(BasicBlock* bb) { break; } walker = prev; + + if (walker->visited) { + break; + } } return false; } |