[LIR] Add support for InvokeCustom.

Bug: b/225838009
Change-Id: I5841f6661ea0e6c21fb26768a8ca543435e6a0c5
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index 92ecb73..4539f17 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -25,6 +25,7 @@
 import com.android.tools.r8.ir.desugar.LambdaDescriptor;
 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;
 
@@ -157,6 +158,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addInvokeCustom(getCallSite(), arguments());
+  }
+
+  @Override
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isInvokeCustom() && callSite == other.asInvokeCustom().callSite;
   }
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 2244a37..8ab729f 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -6,8 +6,10 @@
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
+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;
@@ -42,6 +44,7 @@
 import com.android.tools.r8.ir.code.InstancePut;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.IntSwitch;
+import com.android.tools.r8.ir.code.InvokeCustom;
 import com.android.tools.r8.ir.code.InvokeDirect;
 import com.android.tools.r8.ir.code.InvokeInterface;
 import com.android.tools.r8.ir.code.InvokeMultiNewArray;
@@ -618,10 +621,23 @@
       addInstruction(instruction);
     }
 
+    @Override
+    public void onInvokeCustom(DexCallSite callSite, List<EV> arguments) {
+      Value dest = getInvokeInstructionOutputValue(callSite.methodProto);
+      List<Value> ssaArgumentValues = getValues(arguments);
+      InvokeCustom instruction = new InvokeCustom(callSite, dest, ssaArgumentValues);
+      addInstruction(instruction);
+    }
+
     private Value getInvokeInstructionOutputValue(DexMethod target) {
-      return target.getReturnType().isVoidType()
+      return getInvokeInstructionOutputValue(target.getProto());
+    }
+
+    private Value getInvokeInstructionOutputValue(DexProto target) {
+      DexType returnType = target.getReturnType();
+      return returnType.isVoidType()
           ? null
-          : getOutValueForNextInstruction(target.getReturnType().toTypeElement(appView));
+          : getOutValueForNextInstruction(returnType.toTypeElement(appView));
     }
 
     @Override
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 6f56349..1f4ac6b 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DebugLocalInfo;
+import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -497,7 +498,7 @@
         LirOpcodes.PUTFIELD, Collections.singletonList(field), ImmutableList.of(object, value));
   }
 
-  public LirBuilder<V, EV> addInvokeInstruction(int opcode, DexMethod method, List<V> arguments) {
+  public LirBuilder<V, EV> addInvokeInstruction(int opcode, DexItem method, List<V> arguments) {
     return addInstructionTemplate(opcode, Collections.singletonList(method), arguments);
   }
 
@@ -527,6 +528,10 @@
     return addInvokeInstruction(LirOpcodes.INVOKEINTERFACE, method, arguments);
   }
 
+  public LirBuilder<V, EV> addInvokeCustom(DexCallSite callSite, List<V> arguments) {
+    return addInvokeInstruction(LirOpcodes.INVOKEDYNAMIC, callSite, arguments);
+  }
+
   public LirBuilder<V, EV> addNewInstance(DexType clazz) {
     return addOneItemInstruction(LirOpcodes.NEW, clazz);
   }
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 e70b2e7..e9b52f7 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.cf.code.CfNumberConversion;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexMethod;
@@ -406,6 +407,10 @@
     onInvokeMethodInstruction(method, arguments);
   }
 
+  public void onInvokeCustom(DexCallSite callSite, List<EV> arguments) {
+    onInstruction();
+  }
+
   public void onNewInstance(DexType clazz) {
     onInstruction();
   }
@@ -975,6 +980,13 @@
           onInvokeInterface(target, arguments);
           return;
         }
+      case LirOpcodes.INVOKEDYNAMIC:
+        {
+          DexCallSite callSite = (DexCallSite) getConstantItem(view.getNextConstantOperand());
+          List<EV> arguments = getInvokeInstructionArguments(view);
+          onInvokeCustom(callSite, 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 d49c90f..c8d335f 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.lightir;
 
 import com.android.tools.r8.errors.Unimplemented;
+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.DexReference;
@@ -261,6 +262,12 @@
   }
 
   @Override
+  public void onInvokeCustom(DexCallSite callSite, List<EV> arguments) {
+    appendValueArguments(arguments);
+    builder.append(callSite);
+  }
+
+  @Override
   public void onStaticGet(DexField field) {
     appendOutValue();
     builder.append(field).append(' ');