diff options
author | 2015-01-02 17:00:44 +0000 | |
---|---|---|
committer | 2015-02-17 21:06:27 +0000 | |
commit | 7a01dc2107d4255b445c32867d15d45fcebb3acd (patch) | |
tree | 5f25d4a2889e6fbcb5119484f2b0b6a4253f9b00 /compiler/dex/bb_optimizations.h | |
parent | bce889940f10319bf67bdc5630c84dd7f6e5c246 (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.h | 35 |
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. */ |