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