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(); + } }