[LIR] Add support for InvokePolymorphic.
Bug: b/225838009
Change-Id: I5e8a8eaf9a4834e47d39ef298f1466ead82ad5d3
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
index 08b3ab8..5e80e07ef 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
@@ -24,6 +24,7 @@
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
+import com.android.tools.r8.lightir.LirBuilder;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import java.util.List;
@@ -112,6 +113,11 @@
}
@Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addInvokePolymorphic(getInvokedMethod(), getProto(), arguments());
+ }
+
+ @Override
public boolean identicalNonValueNonPositionParts(Instruction other) {
return other.isInvokePolymorphic()
&& proto.equals(other.asInvokePolymorphic().proto)
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 ef76924..421be9b 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -51,6 +51,7 @@
import com.android.tools.r8.ir.code.InvokeInterface;
import com.android.tools.r8.ir.code.InvokeMultiNewArray;
import com.android.tools.r8.ir.code.InvokeNewArray;
+import com.android.tools.r8.ir.code.InvokePolymorphic;
import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.code.InvokeSuper;
import com.android.tools.r8.ir.code.InvokeVirtual;
@@ -631,6 +632,14 @@
addInstruction(instruction);
}
+ @Override
+ public void onInvokePolymorphic(DexMethod target, DexProto proto, List<EV> arguments) {
+ Value dest = getInvokeInstructionOutputValue(target);
+ List<Value> ssaArgumentValues = getValues(arguments);
+ InvokePolymorphic instruction = new InvokePolymorphic(target, proto, dest, ssaArgumentValues);
+ addInstruction(instruction);
+ }
+
private Value getInvokeInstructionOutputValue(DexMethod target) {
return getInvokeInstructionOutputValue(target.getProto());
}
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 bfd9541..60df1eb 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
@@ -532,6 +533,12 @@
return addInvokeInstruction(LirOpcodes.INVOKEDYNAMIC, callSite, arguments);
}
+ public LirBuilder<V, EV> addInvokePolymorphic(
+ DexMethod invokedMethod, DexProto proto, List<V> arguments) {
+ return addInstructionTemplate(
+ LirOpcodes.INVOKEPOLYMORPHIC, ImmutableList.of(invokedMethod, proto), arguments);
+ }
+
public LirBuilder<V, EV> addNewInstance(DexType clazz) {
return addOneItemInstruction(LirOpcodes.NEW, clazz);
}
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 7df9b5a..0f0811d 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -206,6 +206,7 @@
int LNOT = 219;
int DEBUGLOCALREAD = 220;
int INITCLASS = 221;
+ int INVOKEPOLYMORPHIC = 222;
static String toString(int opcode) {
switch (opcode) {
@@ -534,6 +535,8 @@
return "DEBUGLOCALREAD";
case INITCLASS:
return "INITCLASS";
+ case INVOKEPOLYMORPHIC:
+ return "INVOKEPOLYMORPHIC";
default:
throw new Unreachable("Unexpected LIR opcode: " + 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 9761ef4..781db23 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
@@ -417,6 +418,10 @@
onInstruction();
}
+ public void onInvokePolymorphic(DexMethod target, DexProto proto, List<EV> arguments) {
+ onInstruction();
+ }
+
public void onNewInstance(DexType clazz) {
onInstruction();
}
@@ -1001,6 +1006,14 @@
onInvokeCustom(callSite, arguments);
return;
}
+ case LirOpcodes.INVOKEPOLYMORPHIC:
+ {
+ DexMethod target = getInvokeInstructionTarget(view);
+ DexProto proto = (DexProto) getConstantItem(view.getNextConstantOperand());
+ List<EV> arguments = getInvokeInstructionArguments(view);
+ onInvokePolymorphic(target, proto, arguments);
+ return;
+ }
case LirOpcodes.NEW:
{
DexItem item = getConstantItem(view.getNextConstantOperand());
diff --git a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
index 74d0956..b20e303 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.DexCallSite;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
@@ -273,6 +274,12 @@
}
@Override
+ public void onInvokePolymorphic(DexMethod target, DexProto proto, List<EV> arguments) {
+ appendValueArguments(arguments);
+ builder.append(target).append(' ').append(proto);
+ }
+
+ @Override
public void onStaticGet(DexField field) {
appendOutValue();
builder.append(field).append(' ');