[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(' ');