Fix tests that don't ensure unique SSA value numbers

Change-Id: I8cf1560e8865407bcd160b25458c156917b1d20c
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 edf0246..d72358a 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
@@ -694,11 +694,14 @@
     return false;
   }
 
-  private static void addValueAndCheckUniqueNumber(Int2ReferenceMap<Value> values, Value value) {
+  private void addValueAndCheckUniqueNumber(Int2ReferenceMap<Value> values, Value value) {
     assert value != null;
     int number = value.getNumber();
     Value old = values.put(number, value);
-    assert old == null || old == value || (number == -1 && value.isValueOnStack())
+    assert options.testing.ignoreValueNumbering
+            || old == null
+            || old == value
+            || (number == -1 && value.isValueOnStack())
         : "Multiple value definitions with number " + number + ": " + value + " and " + old;
   }
 
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 89edec3..538b9ee 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2078,6 +2078,7 @@
     public boolean roundtripThroughLir = false;
     public boolean checkReceiverAlwaysNullInCallSiteOptimization = true;
     public boolean forceInlineAPIConversions = false;
+    public boolean ignoreValueNumbering = false;
     private boolean hasReadCheckDeterminism = false;
     private DeterminismChecker determinismChecker = null;
     public boolean usePcEncodingInCfForTesting = false;
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index d89807c..9100c82 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -72,6 +72,10 @@
       MethodSubject method,
       List<IRCode> additionalCode)
       throws ExecutionException {
+    // Some tests play fast and loose with IR and the SSA value numbers are not generally unique.
+    if (additionalCode != null && !additionalCode.isEmpty()) {
+      options.testing.ignoreValueNumbering = true;
+    }
     AppView<AppInfoWithClassHierarchy> appView = AppView.createForR8(application.asDirect());
     appView.setAppServices(AppServices.builder(appView).build());
     ProfileCollectionAdditions profileCollectionAdditions = ProfileCollectionAdditions.nop();
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index 0d23c77..25fc777 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -9,9 +9,11 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionIterator;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.NumberGenerator;
+import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
@@ -69,6 +71,20 @@
       this.code = method.buildIR();
       this.additionalCode = additionalCode;
       this.consumers = new AndroidAppConsumers(appView.options());
+      int largestValueNumber = -1;
+      for (BasicBlock block : code.blocks) {
+        for (Phi phi : block.getPhis()) {
+          largestValueNumber = Math.max(largestValueNumber, phi.getNumber());
+        }
+        for (Instruction instruction : block.getInstructions()) {
+          if (instruction.hasOutValue()) {
+            largestValueNumber = Math.max(largestValueNumber, instruction.outValue().getNumber());
+          }
+        }
+      }
+      while (valueNumberGenerator.peek() <= largestValueNumber) {
+        valueNumberGenerator.next();
+      }
     }
 
     public int countArgumentInstructions() {