[LIR] Add support for const method-handle and method-type.

Bug: b/225838009
Change-Id: I6af20a6bcd596ae8be627963e84b20b715432742
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
index 15afa68..58928b0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.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;
 
 public class ConstMethodHandle extends ConstInstruction {
 
@@ -72,6 +73,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addConstMethodHandle(methodHandle);
+  }
+
+  @Override
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isConstMethodHandle() && other.asConstMethodHandle().methodHandle == methodHandle;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
index 0b586ca..87031d2 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
@@ -20,6 +20,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;
 
 public class ConstMethodType extends ConstInstruction {
 
@@ -70,6 +71,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addConstMethodType(methodType);
+  }
+
+  @Override
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isConstMethodType() && other.asConstMethodType().methodType == methodType;
   }
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 421be9b..babbcdf 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -9,6 +9,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.DexMethodHandle;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexString;
@@ -29,6 +30,8 @@
 import com.android.tools.r8.ir.code.Cmp;
 import com.android.tools.r8.ir.code.Cmp.Bias;
 import com.android.tools.r8.ir.code.ConstClass;
+import com.android.tools.r8.ir.code.ConstMethodHandle;
+import com.android.tools.r8.ir.code.ConstMethodType;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.ConstString;
 import com.android.tools.r8.ir.code.DebugLocalRead;
@@ -509,6 +512,24 @@
     }
 
     @Override
+    public void onConstMethodHandle(DexMethodHandle methodHandle) {
+      TypeElement handleType =
+          TypeElement.fromDexType(
+              appView.dexItemFactory().methodHandleType, Nullability.definitelyNotNull(), appView);
+      Value dest = getOutValueForNextInstruction(handleType);
+      addInstruction(new ConstMethodHandle(dest, methodHandle));
+    }
+
+    @Override
+    public void onConstMethodType(DexProto methodType) {
+      TypeElement typeElement =
+          TypeElement.fromDexType(
+              appView.dexItemFactory().methodTypeType, Nullability.definitelyNotNull(), appView);
+      Value dest = getOutValueForNextInstruction(typeElement);
+      addInstruction(new ConstMethodType(dest, methodType));
+    }
+
+    @Override
     public void onNumberConversion(NumericType from, NumericType to, EV value) {
       Value dest =
           getOutValueForNextInstruction(
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 8c17950..5a8ccd0 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.DexMethodHandle;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexString;
@@ -387,6 +388,14 @@
     return addOneItemInstruction(LirOpcodes.LDC, type);
   }
 
+  public LirBuilder<V, EV> addConstMethodHandle(DexMethodHandle methodHandle) {
+    return addOneItemInstruction(LirOpcodes.LDC, methodHandle);
+  }
+
+  public LirBuilder<V, EV> addConstMethodType(DexProto methodType) {
+    return addOneItemInstruction(LirOpcodes.LDC, methodType);
+  }
+
   public LirBuilder<V, EV> addNeg(NumericType type, V value) {
     int opcode;
     switch (type) {
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 781db23..5b8458a 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.DexMethodHandle;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexString;
@@ -101,6 +102,14 @@
     onInstruction();
   }
 
+  public void onConstMethodHandle(DexMethodHandle methodHandle) {
+    onInstruction();
+  }
+
+  public void onConstMethodType(DexProto methodType) {
+    onInstruction();
+  }
+
   private void onArrayGetInternal(MemberType type, LirInstructionView view) {
     if (type.isObject()) {
       DexType destType = (DexType) getConstantItem(view.getNextConstantOperand());
@@ -515,6 +524,14 @@
             onConstClass((DexType) item);
             return;
           }
+          if (item instanceof DexMethodHandle) {
+            onConstMethodHandle((DexMethodHandle) item);
+            return;
+          }
+          if (item instanceof DexProto) {
+            onConstMethodType((DexProto) item);
+            return;
+          }
           throw new Unimplemented();
         }
       case LirOpcodes.ICONST_M1:
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 b20e303..2598acb3 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.DexMethodHandle;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexString;
@@ -166,6 +167,16 @@
   }
 
   @Override
+  public void onConstMethodHandle(DexMethodHandle methodHandle) {
+    appendOutValue().append("methodHandle(").append(methodHandle).append(")");
+  }
+
+  @Override
+  public void onConstMethodType(DexProto methodType) {
+    appendOutValue().append("methodType(").append(methodType).append(")");
+  }
+
+  @Override
   public void onBinop(NumericType type, EV left, EV right) {
     appendOutValue();
     appendValueArguments(left, right);