Loop detection, improved reg allocation

Detect loops and loop nesting depth, and use the latter to
weight register uses (which are then used to determine which
registers to promote).

Also:

   o Fixed typo that prevented squashing of useless fp reg copies

   o Rescheduled array access checks to hide latency of limit load.

   o Add basic-block optimization pass to remove duplicate range
     checks.

   o Fixed bug that prevented recognition of redundant null
     checks following iput-wide and aput-wide.

Change-Id: Icfbae39e89b1d14b8703ad6bbb0b29c0635fed1e
diff --git a/src/compiler/codegen/MethodCodegenDriver.cc b/src/compiler/codegen/MethodCodegenDriver.cc
index 64f55c6..45a0c75 100644
--- a/src/compiler/codegen/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/MethodCodegenDriver.cc
@@ -757,9 +757,12 @@
             newLIR1(cUnit, kPseudoSSARep, (int) ssaString);
             break;
         }
-        case kMirOpCopy:
-            UNIMPLEMENTED(FATAL) << "Need kMirOpCopy";
+        case kMirOpCopy: {
+            RegLocation rlSrc = oatGetSrc(cUnit, mir, 0);
+            RegLocation rlDest = oatGetDest(cUnit, mir, 0);
+            storeValue(cUnit, rlDest, rlSrc);
             break;
+        }
         default:
             break;
     }