Version 1.0.11.

Merge: Do not use "not" instructions when targeting Dalvik.
CL: https://r8-review.googlesource.com/c/r8/+/16880

R=sgjesse@google.com
Change-Id: I4eb427b0eeb99d192783e0a6b570df304652200b
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 8127c8c..96af965 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "v1.0.10";
+  public static final String LABEL = "v1.0.11";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 43b10f1..0a27017 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -1517,7 +1517,8 @@
     Value in2 = readNumericRegister(right, type);
     Value out = writeNumericRegister(dest, type, ThrowingInfo.NO_THROW);
     Instruction instruction;
-    if (in2.isConstNumber() &&
+    if (options.canUseNotInstruction() &&
+        in2.isConstNumber() &&
         in2.getConstInstruction().asConstNumber().isIntegerNegativeOne(type)) {
       instruction = new Not(type, out, in1);
     } else {
@@ -1531,7 +1532,7 @@
     assert isNonLongIntegerType(type);
     Value in1 = readNumericRegister(value, type);
     Instruction instruction;
-    if (constant == -1) {
+    if (options.canUseNotInstruction() && constant == -1) {
       Value out = writeNumericRegister(dest, type, ThrowingInfo.NO_THROW);
       instruction = new Not(type, out, in1);
     } else {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 7bb23d4..4ebe661 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -466,4 +466,13 @@
   public boolean canHaveBoundsCheckEliminationBug() {
     return minApiLevel <= AndroidApiLevel.L.getLevel();
   }
+
+  // MediaTek JIT compilers for KitKat phones did not implement the not
+  // instruction as it was not generated by DX. Therefore, apps containing
+  // not instructions would crash if the code was JIT compiled. Therefore,
+  // we can only use not instructions if we are targeting Art-based
+  // phones.
+  public boolean canUseNotInstruction() {
+    return minApiLevel >= AndroidApiLevel.L.getLevel();
+  }
 }