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