ART: Dead block removal

Adds a new pass which finds all unreachable blocks, typically due to
simplifying an if-condition to a constant, and removes them from the
graph. The patch also slightly generalizes the graph-transforming
operations.

Change-Id: Iff7c97f1d10b52886f3cd7401689ebe1bfdbf456
diff --git a/compiler/optimizing/boolean_simplifier.cc b/compiler/optimizing/boolean_simplifier.cc
index 6ebfb45..30c89f2 100644
--- a/compiler/optimizing/boolean_simplifier.cc
+++ b/compiler/optimizing/boolean_simplifier.cc
@@ -120,8 +120,11 @@
     phi->ReplaceWith(replacement);
     merge_block->RemovePhi(phi);
 
-    // Link the start/end blocks and remove empty branches.
-    graph_->MergeEmptyBranches(block, merge_block);
+    // Delete the true branch and merge the resulting chain of blocks
+    // 'block->false_block->merge_block' into one.
+    true_block->DisconnectAndDelete();
+    block->MergeWith(false_block);
+    block->MergeWith(merge_block);
 
     // Remove the original condition if it is now unused.
     if (!if_condition->HasUses()) {