Revert "Add argumentIndex field to Argument instruction"
This reverts commit 27ffa64ba51bab13f514156b1b427a72163b30bc.
Reason for revert: Leads to failures.
Change-Id: I4a8b972b3e781380b62f2ed2ddbf8f11534e555b
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
index ecc93b7..6c1fe58 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
@@ -78,7 +78,7 @@
if (root.isDefinedByInstructionSatisfying(Instruction::isArgument)) {
Argument argument = root.definition.asArgument();
builder.recordInitializationInfo(
- field, factory.createArgumentInitializationInfo(argument.getIndex()));
+ field, factory.createArgumentInitializationInfo(argument.getArgumentIndex()));
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Argument.java b/src/main/java/com/android/tools/r8/ir/code/Argument.java
index 1db2ba6..046af1b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Argument.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Argument.java
@@ -21,33 +21,26 @@
*/
public class Argument extends Instruction {
- private final int index;
private final boolean knownToBeBoolean;
- public Argument(Value outValue, int index, boolean knownToBeBoolean) {
+ public Argument(Value outValue, boolean knownToBeBoolean) {
super(outValue);
- this.index = index;
this.knownToBeBoolean = knownToBeBoolean;
+ outValue.markAsArgument();
}
- public int getIndex() {
- assert verifyIndex();
- return index;
- }
-
- private boolean verifyIndex() {
+ public int getArgumentIndex() {
int index = 0;
InstructionIterator instructionIterator = getBlock().iterator();
while (instructionIterator.hasNext()) {
Instruction instruction = instructionIterator.next();
assert instruction.isArgument();
if (instruction == this) {
- assert index == this.index;
- return true;
+ break;
}
index++;
}
- return false;
+ return index;
}
@Override
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 584ea2c..f4bb790 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
@@ -621,10 +621,6 @@
return instructions.isEmpty();
}
- public int size() {
- return instructions.size();
- }
-
public boolean isReturnBlock() {
return exit().isReturn();
}
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 5566552..e46aca6 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
@@ -226,6 +226,7 @@
private LiveIntervals liveIntervals;
private int needsRegister = -1;
private boolean isThis = false;
+ private boolean isArgument = false;
private LongInterval valueRange;
private DebugData debugData;
protected TypeLatticeElement typeLattice;
@@ -913,8 +914,14 @@
|| typeLattice.nullability().isDefinitelyNotNull();
}
+ public void markAsArgument() {
+ assert !isArgument;
+ assert !isThis;
+ isArgument = true;
+ }
+
public boolean isArgument() {
- return isDefinedByInstructionSatisfying(Instruction::isArgument);
+ return isArgument;
}
public boolean onlyDependsOnArgument() {
@@ -938,6 +945,21 @@
}
}
+ public int computeArgumentPosition(IRCode code) {
+ assert isArgument;
+ int position = 0;
+ InstructionIterator instructionIterator = code.entryBlock().iterator();
+ while (instructionIterator.hasNext()) {
+ Instruction instruction = instructionIterator.next();
+ assert instruction.isArgument();
+ if (instruction.outValue() == this) {
+ return position;
+ }
+ position++;
+ }
+ throw new Unreachable();
+ }
+
public boolean knownToBeBoolean() {
return knownToBeBoolean(null);
}
@@ -969,7 +991,7 @@
}
public void markAsThis() {
- assert isArgument();
+ assert isArgument;
assert !isThis;
isThis = true;
}
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 78b1405..7995fdb 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
@@ -914,7 +914,7 @@
public void addThisArgument(int register, TypeLatticeElement receiverType) {
DebugLocalInfo local = getOutgoingLocal(register);
Value value = writeRegister(register, receiverType, ThrowingInfo.NO_THROW, local);
- addInstruction(new Argument(value, currentBlock.size(), false));
+ addInstruction(new Argument(value, false));
receiverValue = value;
value.markAsThis();
}
@@ -922,13 +922,13 @@
public void addNonThisArgument(int register, TypeLatticeElement typeLattice) {
DebugLocalInfo local = getOutgoingLocal(register);
Value value = writeRegister(register, typeLattice, ThrowingInfo.NO_THROW, local);
- addNonThisArgument(new Argument(value, currentBlock.size(), false));
+ addNonThisArgument(new Argument(value, false));
}
public void addBooleanNonThisArgument(int register) {
DebugLocalInfo local = getOutgoingLocal(register);
Value value = writeRegister(register, getInt(), ThrowingInfo.NO_THROW, local);
- addNonThisArgument(new Argument(value, currentBlock.size(), true));
+ addNonThisArgument(new Argument(value, true));
}
private void addNonThisArgument(Argument argument) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index f1c5dc9..8370b69 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -607,11 +607,11 @@
for (Monitor monitor : inlinee.code.<Monitor>instructions(Instruction::isMonitorEnter)) {
Value monitorEnterValue = monitor.object().getAliasedValue();
- if (monitorEnterValue.isDefinedByInstructionSatisfying(Instruction::isArgument)) {
+ if (monitorEnterValue.isArgument()) {
monitorEnterValue =
invoke
.arguments()
- .get(monitorEnterValue.definition.asArgument().getIndex())
+ .get(monitorEnterValue.computeArgumentPosition(inlinee.code))
.getAliasedValue();
}
addMonitorEnterValue(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index b5215f6..b9345e9 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -338,7 +338,10 @@
if (!aliasedValue.isPhi()) {
Instruction definition = aliasedValue.definition;
if (definition.isArgument()) {
- feedback.methodReturnsArgument(method, definition.asArgument().getIndex());
+ // Find the argument number.
+ int index = aliasedValue.computeArgumentPosition(code);
+ assert index >= 0;
+ feedback.methodReturnsArgument(method, index);
}
DexType context = method.method.holder;
AbstractValue abstractReturnValue = definition.getAbstractValue(appView, context);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
index 6104883..5d48fa6 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -137,7 +137,7 @@
TypeLatticeElement.fromDexType(
app.dexItemFactory.throwableType, Nullability.definitelyNotNull(), appView),
null);
- instruction = new Argument(value, 0, false);
+ instruction = new Argument(value, false);
instruction.setPosition(position);
block0.add(instruction, metadata);
instruction = new If(Type.EQ, value);