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