summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jean Christophe Beyler <jean.christophe.beyler@intel.com> 2014-07-18 15:33:57 -0700
committer Jean Christophe Beyler <jean.christophe.beyler@intel.com> 2014-08-26 17:07:13 -0700
commit09321dfb4803669ba6d6f3fef6363a1fd7202eea (patch)
tree13c40e73bedfeaf994d62f1f27e56168634320d8
parent07277a700cdc7de2f40773a05c7a791b71abd581 (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.cc8
-rw-r--r--compiler/dex/bb_optimizations.h20
-rw-r--r--compiler/dex/pass.h2
-rw-r--r--compiler/dex/pass_driver_me_opts.cc14
-rw-r--r--compiler/dex/pass_me.h3
-rw-r--r--compiler/dex/post_opt_passes.cc8
-rw-r--r--compiler/dex/post_opt_passes.h16
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.