[LIR] Add invoke-super and clear unused values after IR conversion.
Bug: b/225838009
Change-Id: I3f1735e19fff1b17de5223ffa933613751177468
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
index 4eaae3c..84e6e99 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
@@ -22,6 +22,7 @@
import com.android.tools.r8.ir.conversion.DexBuilder;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
+import com.android.tools.r8.lightir.LirBuilder;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.List;
@@ -140,4 +141,9 @@
void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) {
registry.registerInvokeSuper(getInvokedMethod());
}
+
+ @Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addInvokeSuper(getInvokedMethod(), arguments());
+ }
}
diff --git a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
index 689d5ff..3bf81f0 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -33,6 +33,7 @@
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.ir.code.InvokeInterface;
import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.InvokeSuper;
import com.android.tools.r8.ir.code.InvokeVirtual;
import com.android.tools.r8.ir.code.MoveException;
import com.android.tools.r8.ir.code.NewInstance;
@@ -189,6 +190,12 @@
BasicBlock block = blocks.get(blockIndices.getInt(i));
block.setFilled();
blockList.add(block);
+ // LIR has no value-user info so after building is done, removed unused values.
+ for (Instruction instruction : block.getInstructions()) {
+ if (!instruction.isArgument() && instruction.hasUnusedOutValue()) {
+ instruction.clearOutValue();
+ }
+ }
}
for (int i = 0; i < peekNextInstructionIndex(); ++i) {
valueNumberGenerator.next();
@@ -369,6 +376,16 @@
}
@Override
+ public void onInvokeSuper(DexMethod method, List<EV> arguments) {
+ // TODO(b/225838009): Maintain is-interface bit.
+ boolean isInterface = false;
+ Value dest = getInvokeInstructionOutputValue(method);
+ List<Value> ssaArgumentValues = getValues(arguments);
+ InvokeSuper instruction = new InvokeSuper(method, dest, ssaArgumentValues, isInterface);
+ addInstruction(instruction);
+ }
+
+ @Override
public void onInvokeVirtual(DexMethod target, List<EV> arguments) {
// TODO(b/225838009): Maintain is-interface bit.
Value dest = getInvokeInstructionOutputValue(target);
diff --git a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
index 8209c80..906ab32 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -316,6 +316,10 @@
return addInvokeInstruction(LirOpcodes.INVOKEDIRECT, method, arguments);
}
+ public LirBuilder<V, EV> addInvokeSuper(DexMethod method, List<V> arguments) {
+ return addInvokeInstruction(LirOpcodes.INVOKESUPER, method, arguments);
+ }
+
public LirBuilder<V, EV> addInvokeVirtual(DexMethod method, List<V> arguments) {
return addInvokeInstruction(LirOpcodes.INVOKEVIRTUAL, method, arguments);
}
diff --git a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
index 0d30efd..8259d43 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -182,11 +182,12 @@
int FCONST = 202;
int DCONST = 203;
int INVOKEDIRECT = 204;
- int DEBUGPOS = 205;
- int PHI = 206;
- int FALLTHROUGH = 207;
- int MOVEEXCEPTION = 208;
- int DEBUGLOCALWRITE = 209;
+ int INVOKESUPER = 205;
+ int DEBUGPOS = 206;
+ int PHI = 207;
+ int FALLTHROUGH = 208;
+ int MOVEEXCEPTION = 209;
+ int DEBUGLOCALWRITE = 210;
static String toString(int opcode) {
switch (opcode) {
diff --git a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
index a83524c..80efe01 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -102,6 +102,10 @@
onInvokeMethodInstruction(method, arguments);
}
+ public void onInvokeSuper(DexMethod method, List<EV> arguments) {
+ onInvokeMethodInstruction(method, arguments);
+ }
+
public void onInvokeVirtual(DexMethod method, List<EV> arguments) {
onInvokeMethodInstruction(method, arguments);
}
@@ -218,6 +222,13 @@
onInvokeDirect(target, arguments);
return;
}
+ case LirOpcodes.INVOKESUPER:
+ {
+ DexMethod target = getInvokeInstructionTarget(view);
+ List<EV> arguments = getInvokeInstructionArguments(view);
+ onInvokeSuper(target, arguments);
+ return;
+ }
case LirOpcodes.INVOKEVIRTUAL:
{
DexMethod target = getInvokeInstructionTarget(view);