Revert "Revert "Null check elimination improvement""

This reverts commit 31aa97cfec5ee76b2f2496464e1b6f9e11d21a29.

..and thereby brings back change 380165, which was reverted
because it was buggy.

Three problems with the original CL:

  1.  The author ran the pre-submit tests, but used -j24 and
      failed to search the output for fail messages.
  2.  The new null check analysis pass uses an interative
      approach to identify whether a null check is needed.  It
      is possible that the null-check-required state may
      oscillate, and a logic error caused it to stick in the
      "no check needed" state.
  3.  Our old nemesis Dalvik untyped constants, in which 0 values
      can be used both as object reference and non-object references.
      This CL conservatively treats all CONST definitions as
      potential object definitions for the purposes of null
      check elimination.

Change-Id: I3c1744e44318276e42989502a314585e56ac57a0
diff --git a/compiler/dex/mir_dataflow.cc b/compiler/dex/mir_dataflow.cc
index 9c8ce23..11e19dc 100644
--- a/compiler/dex/mir_dataflow.cc
+++ b/compiler/dex/mir_dataflow.cc
@@ -1243,7 +1243,8 @@
     if (mir->ssa_rep == NULL) {
       continue;
     }
-    uint32_t weight = std::min(16U, static_cast<uint32_t>(bb->nesting_depth));
+    // Each level of nesting adds *16 to count, up to 3 levels deep.
+    uint32_t weight = std::min(3U, static_cast<uint32_t>(bb->nesting_depth) * 4);
     for (int i = 0; i < mir->ssa_rep->num_uses; i++) {
       int s_reg = mir->ssa_rep->uses[i];
       raw_use_counts_.Increment(s_reg);