summaryrefslogtreecommitdiff
path: root/compiler/dex/bb_optimizations.h
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2015-01-02 17:00:44 +0000
committer Vladimir Marko <vmarko@google.com> 2015-02-17 21:06:27 +0000
commit7a01dc2107d4255b445c32867d15d45fcebb3acd (patch)
tree5f25d4a2889e6fbcb5119484f2b0b6a4253f9b00 /compiler/dex/bb_optimizations.h
parentbce889940f10319bf67bdc5630c84dd7f6e5c246 (diff)
Dead code elimination based on GVN results.
Change-Id: I5b77411a8f088f0b561da14b123cf6b0501c9db5
Diffstat (limited to 'compiler/dex/bb_optimizations.h')
-rw-r--r--compiler/dex/bb_optimizations.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/compiler/dex/bb_optimizations.h b/compiler/dex/bb_optimizations.h
index 7685200261..93d83c6fd4 100644
--- a/compiler/dex/bb_optimizations.h
+++ b/compiler/dex/bb_optimizations.h
@@ -240,6 +240,41 @@ class GlobalValueNumberingPass : public PassME {
};
/**
+ * @class DeadCodeEliminationPass
+ * @brief Performs the GVN-based dead code elimination pass.
+ */
+class DeadCodeEliminationPass : public PassME {
+ public:
+ DeadCodeEliminationPass() : PassME("DCE", kPreOrderDFSTraversal, "4_post_dce_cfg") {
+ }
+
+ bool Gate(const PassDataHolder* data) const OVERRIDE {
+ DCHECK(data != nullptr);
+ CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit;
+ DCHECK(c_unit != nullptr);
+ return c_unit->mir_graph->EliminateDeadCodeGate();
+ }
+
+ bool Worker(PassDataHolder* data) const {
+ DCHECK(data != nullptr);
+ 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;
+ DCHECK(bb != nullptr);
+ return c_unit->mir_graph->EliminateDeadCode(bb);
+ }
+
+ void End(PassDataHolder* data) const OVERRIDE {
+ DCHECK(data != nullptr);
+ CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit;
+ DCHECK(c_unit != nullptr);
+ c_unit->mir_graph->EliminateDeadCodeEnd();
+ down_cast<PassMEDataHolder*>(data)->dirty = !c_unit->mir_graph->MirSsaRepUpToDate();
+ }
+};
+
+/**
* @class BBCombine
* @brief Perform the basic block combination pass.
*/