Add extra number conversion check in StringBuilder optimization
Change-Id: I2592378000ca2f35d18bb3931c6d7585ca8e7215
diff --git a/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java b/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
index 72e5bc1..c039248 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
@@ -38,6 +38,7 @@
super(dest, source);
this.from = from;
this.to = to;
+ assert isValid();
}
@Override
@@ -173,4 +174,50 @@
public boolean outTypeKnownToBeBoolean(Set<Phi> seen) {
return to == NumericType.BYTE && source().knownToBeBoolean(seen);
}
+
+ public boolean isValid() {
+ switch (from) {
+ case INT:
+ switch (to) {
+ case BYTE:
+ case CHAR:
+ case SHORT:
+ case LONG:
+ case FLOAT:
+ case DOUBLE:
+ return true;
+ default:
+ return false;
+ }
+ case LONG:
+ switch (to) {
+ case INT:
+ case FLOAT:
+ case DOUBLE:
+ return true;
+ default:
+ return false;
+ }
+ case FLOAT:
+ switch (to) {
+ case INT:
+ case LONG:
+ case DOUBLE:
+ return true;
+ default:
+ return false;
+ }
+ case DOUBLE:
+ switch (to) {
+ case INT:
+ case LONG:
+ case FLOAT:
+ return true;
+ default:
+ return false;
+ }
+ default:
+ return false;
+ }
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
index d341de9..7fa1447 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
@@ -101,6 +101,9 @@
} else if (arg.definition.isNumberConversion()) {
NumberConversion conversion = arg.definition.asNumberConversion();
assert conversion.inValues().size() == 1;
+ if (!conversion.isValid()) {
+ return null;
+ }
Number temp = extractConstantNumber(factory, conversion.inValues().get(0));
if (temp == null) {
return null;