Merge "Reland: Companion class must be public"
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
index e793190..8f8444c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
@@ -51,32 +51,33 @@
return !fitsInDexInstruction(value);
}
- public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+ @Override
+ public ConstInstruction fold(IRCode code) {
assert canBeFolded();
if (type == NumericType.INT) {
int left = leftValue().getConstInstruction().asConstNumber().getIntValue();
int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
int result = foldIntegers(left, right);
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.INT, value, result);
} else if (type == NumericType.LONG) {
long left = leftValue().getConstInstruction().asConstNumber().getLongValue();
long right = rightValue().getConstInstruction().asConstNumber().getLongValue();
long result = foldLongs(left, right);
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+ Value value = code.createValue(MoveType.WIDE, getDebugInfo());
return new ConstNumber(ConstType.LONG, value, result);
} else if (type == NumericType.FLOAT) {
float left = leftValue().getConstInstruction().asConstNumber().getFloatValue();
float right = rightValue().getConstInstruction().asConstNumber().getFloatValue();
float result = foldFloat(left, right);
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.FLOAT, value, Float.floatToIntBits(result));
} else {
assert type == NumericType.DOUBLE;
double left = leftValue().getConstInstruction().asConstNumber().getDoubleValue();
double right = rightValue().getConstInstruction().asConstNumber().getDoubleValue();
double result = foldDouble(left, right);
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+ Value value = code.createValue(MoveType.WIDE, getDebugInfo());
return new ConstNumber(ConstType.DOUBLE, value, Double.doubleToLongBits(result));
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
index b35812b..8e019cc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
@@ -327,7 +327,7 @@
if ((i == 0) && (downcast != null)) {
Value invokeValue = invoke.inValues().get(0);
Value receiverValue = arguments.get(0);
- Value value = new Value(code.valueNumberGenerator.next(), -1, MoveType.OBJECT, null);
+ Value value = code.createValue(MoveType.OBJECT);
castInstruction = new CheckCast(value, invokeValue, downcast);
receiverValue.replaceUsers(value);
} else {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Cmp.java b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
index c5cc82f..3d20415 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Cmp.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
@@ -147,7 +147,7 @@
}
@Override
- public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+ public ConstInstruction fold(IRCode code) {
assert canBeFolded();
int result;
if (type == NumericType.LONG) {
@@ -180,7 +180,7 @@
}
}
assert result == -1 || result == 0 || result == 1;
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.INT, value, result);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 94eeb55..c905a0f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -347,4 +347,12 @@
== method.method.proto.parameters.values.length + (method.accessFlags.isStatic() ? 0 : 1);
return arguments;
}
+
+ public Value createValue(MoveType moveType, Value.DebugInfo debugInfo) {
+ return new Value(valueNumberGenerator.next(), -1, moveType, debugInfo);
+ }
+
+ public Value createValue(MoveType moveType) {
+ return createValue(moveType, null);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index 045a6d0..1b18ccc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -792,7 +792,7 @@
return false;
}
- public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+ public ConstInstruction fold(IRCode code) {
throw new Unreachable("Unsupported folding for " + this);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
index dc16d43..52a0f55 100644
--- a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
@@ -30,13 +30,14 @@
return leftValue().isConstant() && rightValue().isConstant();
}
- public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+ @Override
+ public ConstInstruction fold(IRCode code) {
assert canBeFolded();
if (type == NumericType.INT) {
int left = leftValue().getConstInstruction().asConstNumber().getIntValue();
int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
int result = foldIntegers(left, right);
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.INT, value, result);
} else {
assert type == NumericType.LONG;
@@ -49,7 +50,7 @@
right = rightValue().getConstInstruction().asConstNumber().getLongValue();
}
long result = foldLongs(left, right);
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+ Value value = code.createValue(MoveType.WIDE, getDebugInfo());
return new ConstNumber(ConstType.LONG, value, result);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Neg.java b/src/main/java/com/android/tools/r8/ir/code/Neg.java
index 6066439..59022de 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Neg.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Neg.java
@@ -27,24 +27,24 @@
}
@Override
- public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+ public ConstInstruction fold(IRCode code) {
assert canBeFolded();
if (type == NumericType.INT) {
int result = -source().getConstInstruction().asConstNumber().getIntValue();
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.INT, value, result);
} else if (type == NumericType.LONG) {
long result = -source().getConstInstruction().asConstNumber().getLongValue();
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+ Value value = code.createValue(MoveType.WIDE, getDebugInfo());
return new ConstNumber(ConstType.LONG, value, result);
} else if (type == NumericType.FLOAT) {
float result = -source().getConstInstruction().asConstNumber().getFloatValue();
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.FLOAT, value, Float.floatToIntBits(result));
} else {
assert type == NumericType.DOUBLE;
double result = -source().getConstInstruction().asConstNumber().getDoubleValue();
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+ Value value = code.createValue(MoveType.WIDE, getDebugInfo());
return new ConstNumber(ConstType.DOUBLE, value, Double.doubleToLongBits(result));
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Not.java b/src/main/java/com/android/tools/r8/ir/code/Not.java
index 9e41f3e..cae6118 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Not.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Not.java
@@ -23,16 +23,16 @@
}
@Override
- public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+ public ConstInstruction fold(IRCode code) {
assert canBeFolded();
if (type == NumericType.INT) {
int result = ~(source().getConstInstruction().asConstNumber().getIntValue());
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+ Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
return new ConstNumber(ConstType.INT, value, result);
} else {
assert type == NumericType.LONG;
long result = ~source().getConstInstruction().asConstNumber().getLongValue();
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+ Value value = code.createValue(MoveType.WIDE, getDebugInfo());
return new ConstNumber(ConstType.LONG, value, result);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 1eb8707..a7c40d1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -51,7 +51,7 @@
if (insn.outValue() == null) {
return null;
} else {
- return new Value(code.valueNumberGenerator.next(), -1, insn.outType(), insn.getDebugInfo());
+ return code.createValue(insn.outType(), insn.getDebugInfo());
}
}
@@ -105,8 +105,7 @@
// Fix up the return type if needed.
if (actualTarget.proto.returnType != invokedMethod.proto.returnType
&& newInvoke.outValue() != null) {
- Value newValue = new Value(
- code.valueNumberGenerator.next(), -1, newInvoke.outType(), invoke.getDebugInfo());
+ Value newValue = code.createValue(newInvoke.outType(), invoke.getDebugInfo());
newInvoke.outValue().replaceUsers(newValue);
CheckCast cast = new CheckCast(
newValue,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 87241cf..34e60d1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -279,8 +279,7 @@
Value lambdaInstanceValue = invoke.outValue();
if (lambdaInstanceValue == null) {
// The out value might be empty in case it was optimized out.
- lambdaInstanceValue = new Value(
- code.valueNumberGenerator.next(), -1, MoveType.OBJECT, null);
+ lambdaInstanceValue = code.createValue(MoveType.OBJECT);
}
// For stateless lambdas we replace InvokeCustom instruction with StaticGet
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 9034c37..0830209 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -690,7 +690,7 @@
Instruction current = iterator.next();
Instruction folded;
if (canBeFolded(current)) {
- folded = current.fold(code.valueNumberGenerator);
+ folded = current.fold(code);
iterator.replaceCurrentInstruction(folded);
folded.outValue().uniqueUsers()
.forEach(instruction -> worklist.add(instruction.getBlock()));
@@ -1228,7 +1228,7 @@
// Replace call to Throwable::getSuppressed() with new Throwable[0].
// First insert the constant value *before* the current instruction.
- Value zero = new Value(code.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
+ Value zero = code.createValue(MoveType.SINGLE);
assert iterator.hasPrevious();
iterator.previous();
iterator.add(new ConstNumber(ConstType.INT, zero, 0));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
index 5842609..b122d23 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -75,8 +75,7 @@
MoveType moveType = instruction.outValue().outType();
if (rule != null && rule.hasReturnValue() && rule.getReturnValue().isSingleValue()) {
assert moveType != MoveType.OBJECT;
- Value value = new Value(
- code.valueNumberGenerator.next(), -1, moveType, instruction.getDebugInfo());
+ Value value = code.createValue(moveType, instruction.getDebugInfo());
replacement = new ConstNumber(
ConstType.fromMoveType(moveType), value, rule.getReturnValue().getSingleValue());
}
@@ -85,8 +84,7 @@
DexField field = rule.getReturnValue().getField();
DexEncodedField staticField = appInfo.lookupStaticTarget(field.clazz, field);
if (staticField != null) {
- Value value = new Value(
- code.valueNumberGenerator.next(), -1, moveType, instruction.getDebugInfo());
+ Value value = code.createValue(moveType, instruction.getDebugInfo());
replacement = staticField.staticValue.asConstInstruction(false, value);
} else {
throw new CompilationError(field.clazz.toSourceString() + "." + field.name.toString() +
@@ -171,7 +169,7 @@
assert constant == 0;
moveType = MoveType.SINGLE;
}
- Value value = new Value(code.valueNumberGenerator.next(), -1, moveType, null);
+ Value value = code.createValue(moveType);
// TODO(ager): Attempt to get a more precise const type from the method analysis?
Instruction knownConstReturn =
new ConstNumber(ConstType.fromMoveType(moveType), value, constant);
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index db3dce5d..9cffe15 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -77,15 +77,9 @@
// Set to true to enable verbose logs
private static final boolean DEBUG_TESTS = false;
- private static final List<DexVm> UNSUPPORTED_ART_VERSIONS = ImmutableList.<DexVm>builder()
- // Dalvik does not support command ReferenceType.Methods which is used to set breakpoint.
- // TODO(shertz) use command ReferenceType.MethodsWithGeneric instead
- .add(DexVm.ART_4_4_4)
- // Older runtimes fail on buildbot
- // TODO(shertz) re-enable once issue is solved
- .add(DexVm.ART_5_1_1)
- .add(DexVm.ART_6_0_1)
- .build();
+ // Dalvik does not support command ReferenceType.Methods which is used to set breakpoint.
+ // TODO(shertz) use command ReferenceType.MethodsWithGeneric instead
+ private static final List<DexVm> UNSUPPORTED_ART_VERSIONS = ImmutableList.of(DexVm.ART_4_4_4);
private static final Path JDWP_JAR = ToolHelper
.getJdwpTestsJarPath(ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()));