Fix null check elimination

The existing null check elimination mechanism suffered from the same
limitation as the SSA renaming: it took shortcuts that were valid in
a trace compilation world, but not in a method compilation world.

This CL replaces the old mechanism, and additionally takes advantage
of some the fact that "this" is always non-null, as are objects returned
from OP_NEW_* (thanks Ian!).

Two test cases added.  The one for ensuring that unnecessary null checks
are elminated requires manual inspection.  The other - that we don't
eliminate a necessary null check - is disabled until exceptions are working.

Change-Id: I2a9b72741f56617bf609e4d7c20244796c988f28
diff --git a/src/compiler/CompilerIR.h b/src/compiler/CompilerIR.h
index e2418b8..e25acd9 100644
--- a/src/compiler/CompilerIR.h
+++ b/src/compiler/CompilerIR.h
@@ -111,7 +111,7 @@
     struct MIR* prev;
     struct MIR* next;
     struct SSARepresentation* ssaRep;
-    int OptimizationFlags;
+    int optimizationFlags;
     int seqNum;
     union {
         // Used by the inlined insn from the callee to find the mother method
@@ -135,6 +135,7 @@
     int id;
     bool visited;
     bool hidden;
+    bool catchEntry;
     unsigned int startOffset;
     const Method* containingMethod;     // For blocks from the callee
     BBType blockType;