diff options
author | 2014-07-18 15:33:57 -0700 | |
---|---|---|
committer | 2014-08-26 17:07:13 -0700 | |
commit | 09321dfb4803669ba6d6f3fef6363a1fd7202eea (patch) | |
tree | 13c40e73bedfeaf994d62f1f27e56168634320d8 | |
parent | 07277a700cdc7de2f40773a05c7a791b71abd581 (diff) |
ART: Added dirty flag to optimizations
- Added a dirty flag to the PassMEDataHolder and use it to determine
if we want to perform the post-optimization passes or not.
Change-Id: I59a85f5198f9224d5fe8893397bfaf68a978d8f1
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
-rw-r--r-- | compiler/dex/bb_optimizations.cc | 8 | ||||
-rw-r--r-- | compiler/dex/bb_optimizations.h | 20 | ||||
-rw-r--r-- | compiler/dex/pass.h | 2 | ||||
-rw-r--r-- | compiler/dex/pass_driver_me_opts.cc | 14 | ||||
-rw-r--r-- | compiler/dex/pass_me.h | 3 | ||||
-rw-r--r-- | compiler/dex/post_opt_passes.cc | 8 | ||||
-rw-r--r-- | compiler/dex/post_opt_passes.h | 16 |
7 files changed, 40 insertions, 31 deletions
diff --git a/compiler/dex/bb_optimizations.cc b/compiler/dex/bb_optimizations.cc index 920cde28aa..6a610ab201 100644 --- a/compiler/dex/bb_optimizations.cc +++ b/compiler/dex/bb_optimizations.cc @@ -23,9 +23,9 @@ namespace art { /* * Code Layout pass implementation start. */ -bool CodeLayout::Worker(const PassDataHolder* data) const { +bool CodeLayout::Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* c_unit = pass_me_data_holder->c_unit; DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; @@ -38,9 +38,9 @@ bool CodeLayout::Worker(const PassDataHolder* data) const { /* * BasicBlock Combine pass implementation start. */ -bool BBCombine::Worker(const PassDataHolder* data) const { +bool BBCombine::Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* c_unit = pass_me_data_holder->c_unit; DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; diff --git a/compiler/dex/bb_optimizations.h b/compiler/dex/bb_optimizations.h index 7395324ea4..290523710d 100644 --- a/compiler/dex/bb_optimizations.h +++ b/compiler/dex/bb_optimizations.h @@ -95,9 +95,9 @@ class SpecialMethodInliner : public PassME { cUnit->mir_graph->InlineSpecialMethodsStart(); } - bool Worker(const PassDataHolder* data) const { + bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* cUnit = pass_me_data_holder->c_unit; DCHECK(cUnit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; @@ -131,7 +131,7 @@ class CodeLayout : public PassME { cUnit->mir_graph->VerifyDataflow(); } - bool Worker(const PassDataHolder* data) const; + bool Worker(PassDataHolder* data) const; }; /** @@ -151,9 +151,9 @@ class NullCheckEliminationAndTypeInference : public PassME { cUnit->mir_graph->EliminateNullChecksAndInferTypesStart(); } - bool Worker(const PassDataHolder* data) const { + bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* cUnit = pass_me_data_holder->c_unit; DCHECK(cUnit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; @@ -182,9 +182,9 @@ class ClassInitCheckElimination : public PassME { return cUnit->mir_graph->EliminateClassInitChecksGate(); } - bool Worker(const PassDataHolder* data) const { + bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* cUnit = pass_me_data_holder->c_unit; DCHECK(cUnit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; @@ -217,9 +217,9 @@ class GlobalValueNumberingPass : public PassME { return cUnit->mir_graph->ApplyGlobalValueNumberingGate(); } - bool Worker(const PassDataHolder* data) const OVERRIDE { + bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* cUnit = pass_me_data_holder->c_unit; DCHECK(cUnit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; @@ -251,7 +251,7 @@ class BBCombine : public PassME { return ((cUnit->disable_opt & (1 << kSuppressExceptionEdges)) != 0); } - bool Worker(const PassDataHolder* data) const; + bool Worker(PassDataHolder* data) const; }; /** diff --git a/compiler/dex/pass.h b/compiler/dex/pass.h index dbb5366af6..c377426ed5 100644 --- a/compiler/dex/pass.h +++ b/compiler/dex/pass.h @@ -81,7 +81,7 @@ class Pass { * @param data the object containing data necessary for the pass. * @return whether or not there is a change when walking the BasicBlock */ - virtual bool Worker(const PassDataHolder* data) const { + virtual bool Worker(PassDataHolder* data) const { // Unused parameter. UNUSED(data); diff --git a/compiler/dex/pass_driver_me_opts.cc b/compiler/dex/pass_driver_me_opts.cc index c72a4a667e..f3e82dac60 100644 --- a/compiler/dex/pass_driver_me_opts.cc +++ b/compiler/dex/pass_driver_me_opts.cc @@ -70,19 +70,27 @@ template<> bool PassDriver<PassDriverMEOpts>::default_print_passes_ = false; void PassDriverMEOpts::ApplyPass(PassDataHolder* data, const Pass* pass) { - // First call the base class' version. - PassDriver::ApplyPass(data, pass); - const PassME* pass_me = down_cast<const PassME*> (pass); DCHECK(pass_me != nullptr); PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); + // Set to dirty. + pass_me_data_holder->dirty = true; + + // First call the base class' version. + PassDriver::ApplyPass(data, pass); + // Now we care about flags. if ((pass_me->GetFlag(kOptimizationBasicBlockChange) == true) || (pass_me->GetFlag(kOptimizationDefUsesChange) == true)) { CompilationUnit* c_unit = pass_me_data_holder->c_unit; c_unit->mir_graph.get()->CalculateBasicBlockInformation(); + + // Is it dirty at least? + if (pass_me_data_holder->dirty == true) { + c_unit->mir_graph.get()->CalculateBasicBlockInformation(); + } } } diff --git a/compiler/dex/pass_me.h b/compiler/dex/pass_me.h index c7276eb905..01922c9a3e 100644 --- a/compiler/dex/pass_me.h +++ b/compiler/dex/pass_me.h @@ -42,7 +42,8 @@ class PassMEDataHolder: public PassDataHolder { public: CompilationUnit* c_unit; BasicBlock* bb; - void* data; + void* data; /**< @brief Any data the pass wants to use */ + bool dirty; /**< @brief Has the pass rendered the CFG dirty, requiring post-opt? */ }; enum DataFlowAnalysisMode { diff --git a/compiler/dex/post_opt_passes.cc b/compiler/dex/post_opt_passes.cc index 1371652984..b3d5c8a032 100644 --- a/compiler/dex/post_opt_passes.cc +++ b/compiler/dex/post_opt_passes.cc @@ -36,9 +36,9 @@ bool MethodUseCount::Gate(const PassDataHolder* data) const { return res; } -bool MethodUseCount::Worker(const PassDataHolder* data) const { +bool MethodUseCount::Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* c_unit = pass_me_data_holder->c_unit; DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; @@ -49,9 +49,9 @@ bool MethodUseCount::Worker(const PassDataHolder* data) const { } -bool ClearPhiInstructions::Worker(const PassDataHolder* data) const { +bool ClearPhiInstructions::Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data); + PassMEDataHolder* pass_me_data_holder = down_cast<PassMEDataHolder*>(data); CompilationUnit* c_unit = pass_me_data_holder->c_unit; DCHECK(c_unit != nullptr); BasicBlock* bb = pass_me_data_holder->bb; diff --git a/compiler/dex/post_opt_passes.h b/compiler/dex/post_opt_passes.h index a1b0df4b32..dfd2567c0f 100644 --- a/compiler/dex/post_opt_passes.h +++ b/compiler/dex/post_opt_passes.h @@ -52,7 +52,7 @@ class MethodUseCount : public PassME { MethodUseCount() : PassME("UseCount") { } - bool Worker(const PassDataHolder* data) const; + bool Worker(PassDataHolder* data) const; bool Gate(const PassDataHolder* data) const; }; @@ -66,7 +66,7 @@ class ClearPhiInstructions : public PassME { ClearPhiInstructions() : PassME("ClearPhiInstructions") { } - bool Worker(const PassDataHolder* data) const; + bool Worker(PassDataHolder* data) const; }; /** @@ -222,11 +222,11 @@ class PhiNodeOperands : public PassME { PhiNodeOperands() : PassME("PhiNodeOperands", kPreOrderDFSTraversal) { } - bool Worker(const PassDataHolder* data) const { + bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; DCHECK(c_unit != nullptr); - BasicBlock* bb = down_cast<const PassMEDataHolder*>(data)->bb; + BasicBlock* bb = down_cast<PassMEDataHolder*>(data)->bb; DCHECK(bb != nullptr); c_unit->mir_graph->InsertPhiNodeOperands(bb); // No need of repeating, so just return false. @@ -260,11 +260,11 @@ class ConstantPropagation : public PassME { ConstantPropagation() : PassME("ConstantPropagation") { } - bool Worker(const PassDataHolder* data) const { + bool Worker(PassDataHolder* data) const { DCHECK(data != nullptr); - CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; + CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; DCHECK(c_unit != nullptr); - BasicBlock* bb = down_cast<const PassMEDataHolder*>(data)->bb; + BasicBlock* bb = down_cast<PassMEDataHolder*>(data)->bb; DCHECK(bb != nullptr); c_unit->mir_graph->DoConstantPropagation(bb); // No need of repeating, so just return false. |