Merge "Change heuristic to split signature"
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/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index 35cf808..232e0ff 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -19,6 +19,7 @@
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Consumer;
@@ -632,8 +633,12 @@
assert unfilledPredecessorsCount > 0;
if (--unfilledPredecessorsCount == 0) {
assert estimatedPredecessorsCount == predecessors.size();
- for (Phi phi : incompletePhis.values()) {
- phi.addOperands(builder);
+ for (Entry<Integer, Phi> entry : incompletePhis.entrySet()) {
+ int register = entry.getKey();
+ if (register < 0) {
+ register = onThrowValueRegister(register);
+ }
+ entry.getValue().addOperands(builder, register);
}
sealed = true;
incompletePhis.clear();
@@ -1087,7 +1092,7 @@
newPredecessors.add(newBlock);
if (hasMoveException) {
Value value = new Value(
- valueNumberGenerator.next(), -1, MoveType.OBJECT, move.getDebugInfo());
+ valueNumberGenerator.next(), MoveType.OBJECT, move.getDebugInfo());
values.add(value);
newBlock.add(new MoveException(value));
}
@@ -1105,7 +1110,7 @@
// Insert a phi for the move-exception value.
if (hasMoveException) {
Phi phi = new Phi(valueNumberGenerator.next(),
- -1, this, MoveType.OBJECT, move.getLocalInfo());
+ this, MoveType.OBJECT, move.getLocalInfo());
phi.addOperands(values);
move.outValue().replaceUsers(phi);
}
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/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 8aff14a..451832f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -38,7 +38,6 @@
Value newValue =
new Value(
code.valueNumberGenerator.next(),
- original.outValue().getOriginalRegister(),
original.outType(),
original.getDebugInfo());
return new ConstNumber(original.type, newValue, original.getRawValue());
diff --git a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
index c63d323..c5a7bbb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
@@ -10,7 +10,7 @@
public FixedRegisterValue(MoveType type, int register) {
// Set local info to null since these values are never representatives of live-ranges.
- super(-1, -1, type, null);
+ super(-1, type, null);
setNeedsRegister(true);
this.register = register;
}
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..3ff0624 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(), 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/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index 0d74321..5912f0f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -34,8 +34,8 @@
// computation of the phi until all operands are known.
private MoveType outType = null;
- public Phi(int number, int register, BasicBlock block, MoveType type, DebugLocalInfo local) {
- super(number, register, type, local == null ? null : new DebugInfo(local, null));
+ public Phi(int number, BasicBlock block, MoveType type, DebugLocalInfo local) {
+ super(number, type, local == null ? null : new DebugInfo(local, null));
this.block = block;
block.addPhi(this);
}
@@ -54,7 +54,7 @@
return block;
}
- public void addOperands(IRBuilder builder) {
+ public void addOperands(IRBuilder builder, int register) {
// Phi operands are only filled in once to complete the phi. Some phis are incomplete for a
// period of time to break cycles. When the cycle has been resolved they are completed
// exactly once by adding the operands.
@@ -63,8 +63,7 @@
for (BasicBlock pred : block.getPredecessors()) {
EdgeType edgeType = pred.getEdgeType(block);
// Since this read has been delayed we must provide the local info for the value.
- Value operand = builder.readRegister(
- getOriginalRegister(), pred, edgeType, type, getLocalInfo());
+ Value operand = builder.readRegister(register, pred, edgeType, type, getLocalInfo());
canBeNull |= operand.canBeNull();
appendOperand(operand);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index 2b7c647..6487631 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -53,11 +53,10 @@
}
}
- public static final Value UNDEFINED = new Value(-1, -1, MoveType.OBJECT, null);
+ public static final Value UNDEFINED = new Value(-1, MoveType.OBJECT, null);
protected final int number;
protected MoveType type;
- private int originalRegister;
public Instruction definition = null;
private LinkedList<Instruction> users = new LinkedList<>();
private Set<Instruction> uniqueUsers = null;
@@ -73,10 +72,9 @@
private LongInterval valueRange;
private DebugData debugData;
- public Value(int number, int originalRegister, MoveType type, DebugInfo debugInfo) {
+ public Value(int number, MoveType type, DebugInfo debugInfo) {
this.number = number;
this.type = type;
- this.originalRegister = originalRegister;
this.debugData = debugInfo == null ? null : new DebugData(debugInfo);
}
@@ -92,10 +90,6 @@
return number;
}
- public int getOriginalRegister() {
- return originalRegister;
- }
-
public int requiredRegisters() {
return type.requiredRegisters();
}
@@ -374,26 +368,23 @@
StringBuilder builder = new StringBuilder();
builder.append("v");
builder.append(number);
- builder.append("(");
- if (definition != null && isConstant()) {
- ConstNumber constNumber = getConstInstruction().asConstNumber();
- if (constNumber.outType() == MoveType.SINGLE) {
- builder.append((int) constNumber.getRawValue());
- } else {
- builder.append(constNumber.getRawValue());
+ boolean isConstant = definition != null && isConstant();
+ boolean hasLocalInfo = getLocalInfo() != null;
+ if (isConstant || hasLocalInfo) {
+ builder.append("(");
+ if (isConstant) {
+ ConstNumber constNumber = getConstInstruction().asConstNumber();
+ if (constNumber.outType() == MoveType.SINGLE) {
+ builder.append((int) constNumber.getRawValue());
+ } else {
+ builder.append(constNumber.getRawValue());
+ }
}
- } else {
- if (originalRegister >= 0) {
- builder.append("r");
- builder.append(originalRegister);
- } else {
- builder.append("_");
+ if (hasLocalInfo) {
+ builder.append(", ").append(getLocalInfo());
}
+ builder.append(")");
}
- if (getLocalInfo() != null) {
- builder.append(", ").append(getLocalInfo());
- }
- builder.append(")");
if (valueRange != null) {
builder.append(valueRange);
}
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 b92ff71..bd8a469 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
@@ -1379,7 +1379,7 @@
Value value;
if (!block.isSealed()) {
assert !blocks.isEmpty() : "No write to " + register;
- Phi phi = new Phi(valueNumberGenerator.next(), register, block, type, local);
+ Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
block.addIncompletePhi(register, phi, readingEdge);
value = phi;
} else if (block.getPredecessors().size() == 1) {
@@ -1388,11 +1388,11 @@
EdgeType edgeType = pred.getEdgeType(block);
value = readRegister(register, pred, edgeType, type, local);
} else {
- Phi phi = new Phi(valueNumberGenerator.next(), register, block, type, local);
+ Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
// We need to write the phi before adding operands to break cycles. If the phi is trivial
// and is removed by addOperands, the definition is overwritten and looked up again below.
block.updateCurrentDefinition(register, phi, readingEdge);
- phi.addOperands(this);
+ phi.addOperands(this, register);
// Lookup the value for the register again at this point. Recursive trivial
// phi removal could have simplified what we wanted to return here.
value = block.readCurrentDefinition(register, readingEdge);
@@ -1406,7 +1406,7 @@
}
public Value readLiteral(NumericType type, long constant) {
- Value value = new Value(valueNumberGenerator.next(), -1, MoveType.fromNumericType(type), null);
+ Value value = new Value(valueNumberGenerator.next(), MoveType.fromNumericType(type), null);
add(new ConstNumber(ConstType.fromNumericType(type), value, constant));
return value;
}
@@ -1415,7 +1415,7 @@
// See addDebugLocalStart and addDebugLocalEnd.
private Value writeRegister(int register, MoveType type, ThrowingInfo throwing, DebugInfo info) {
checkRegister(register);
- Value value = new Value(valueNumberGenerator.next(), register, type, info);
+ Value value = new Value(valueNumberGenerator.next(), type, info);
currentBlock.writeCurrentDefinition(register, value, throwing);
return value;
}
@@ -1610,7 +1610,7 @@
MoveType returnType = origReturn.getReturnType();
assert origReturn.getLocalInfo() == null;
phi = new Phi(
- valueNumberGenerator.next(), -1, normalExitBlock, returnValue.outType(), null);
+ valueNumberGenerator.next(), normalExitBlock, returnValue.outType(), null);
normalExitBlock.add(new Return(phi, returnType));
assert returnType == MoveType.fromDexType(method.method.proto.returnType);
}
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/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
index 772d74c..66cd7d9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -121,6 +121,8 @@
companionClassFlags.unsetInterface();
companionClassFlags.setFinal();
companionClassFlags.setSynthetic();
+ // Companion class must be public so moved methods can be called from anywhere.
+ companionClassFlags.setPublic();
// Create companion class.
DexType companionClassType = rewriter.getCompanionClassType(iface.type);
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/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 3ccf2b3..a981990 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -1726,7 +1726,7 @@
}
private Value createValue(MoveType type, DebugInfo debugInfo) {
- Value value = new Value(code.valueNumberGenerator.next(), NO_REGISTER, type, debugInfo);
+ Value value = code.createValue(type, debugInfo);
value.setNeedsRegister(true);
return value;
}
diff --git a/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java b/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java
index ef49f4e..25e3fea 100644
--- a/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java
+++ b/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java
@@ -4,6 +4,8 @@
package interfacemethods;
+import interfacemethods.p1.I4;
+
public class DefaultMethods {
interface I3 {
@@ -22,8 +24,12 @@
static class C4 extends C3 implements I3 {
}
+ static class C5 implements I4 {
+ }
+
public static void main(String[] args) {
new C2().d1();
System.out.println(new C4().getValue());
+ new C5().dump();
}
}
diff --git a/src/test/examplesAndroidN/interfacemethods/p1/I3.java b/src/test/examplesAndroidN/interfacemethods/p1/I3.java
new file mode 100644
index 0000000..f956279
--- /dev/null
+++ b/src/test/examplesAndroidN/interfacemethods/p1/I3.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package interfacemethods.p1;
+
+interface I3 {
+
+ default void dump() {
+ System.out.println("I3");
+ }
+}
diff --git a/src/test/examplesAndroidN/interfacemethods/p1/I4.java b/src/test/examplesAndroidN/interfacemethods/p1/I4.java
new file mode 100644
index 0000000..1bb946b
--- /dev/null
+++ b/src/test/examplesAndroidN/interfacemethods/p1/I4.java
@@ -0,0 +1,8 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package interfacemethods.p1;
+
+public interface I4 extends I3 {
+}
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()));
diff --git a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
index 291c2c5..90e2089 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -355,8 +355,8 @@
BasicBlock originalReturnBlock = code.getNormalExitBlock();
BasicBlock newReturnBlock = originalReturnBlock.listIterator().split(code);
// Modify the code to make the inserted block add the constant 10 to the original return value.
- Value newConstValue = new Value(test.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
- Value newReturnValue = new Value(test.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
+ Value newConstValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
+ Value newReturnValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
Value oldReturnValue = newReturnBlock.listIterator().next().asReturn().returnValue();
newReturnBlock.listIterator().next().asReturn().returnValue().replaceUsers(newReturnValue);
Instruction constInstruction = new ConstNumber(ConstType.INT, newConstValue, 10);
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
index 7eebf9b..0df0031 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
@@ -41,13 +41,13 @@
@Test
public void equalityOfConstantOperands() {
RegisterAllocator allocator = new MockRegisterAllocator();
- Value value0 = new Value(0, -1, MoveType.SINGLE, null);
+ Value value0 = new Value(0, MoveType.SINGLE, null);
ConstNumber const0 = new ConstNumber(ConstType.INT, value0, 0);
- Value value1 = new Value(1, -1, MoveType.SINGLE, null);
+ Value value1 = new Value(1, MoveType.SINGLE, null);
ConstNumber const1 = new ConstNumber(ConstType.INT, value1, 1);
- Value value2 = new Value(2, -1, MoveType.SINGLE, null);
+ Value value2 = new Value(2, MoveType.SINGLE, null);
ConstNumber const2 = new ConstNumber(ConstType.INT, value2, 2);
- Value value3 = new Value(2, -1, MoveType.SINGLE, null);
+ Value value3 = new Value(2, MoveType.SINGLE, null);
Add add0 = new Add(NumericType.INT, value3, value0, value1);
Add add1 = new Add(NumericType.INT, value3, value0, value2);
value0.computeNeedsRegister();