[LIR] Add support for InitClass.

Bug: b/225838009
Change-Id: Id397b1ff43487de909244fb7aad2ea0b252da03f
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
index 765d4a1..7d1b853 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -23,6 +23,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;
 
 public class InitClass extends Instruction {
@@ -82,6 +83,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addInitClass(clazz);
+  }
+
+  @Override
   public boolean definitelyTriggersClassInitialization(
       DexType clazz,
       ProgramMethod context,
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 c80020b..ef76924 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -40,6 +40,7 @@
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.If;
 import com.android.tools.r8.ir.code.IfType;
+import com.android.tools.r8.ir.code.InitClass;
 import com.android.tools.r8.ir.code.InstanceGet;
 import com.android.tools.r8.ir.code.InstanceOf;
 import com.android.tools.r8.ir.code.InstancePut;
@@ -843,5 +844,11 @@
       Value dest = getOutValueForNextInstruction(type);
       addInstruction(new NewUnboxedEnumInstance(clazz, ordinal, dest));
     }
+
+    @Override
+    public void onInitClass(DexType clazz) {
+      Value dest = getOutValueForNextInstruction(TypeElement.getInt());
+      addInstruction(new InitClass(dest, clazz));
+    }
   }
 }
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 b5ece03..bfd9541 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -849,4 +849,8 @@
     ByteUtils.writeEncodedInt(ordinal, writer::writeOperand);
     return this;
   }
+
+  public LirBuilder<V, EV> addInitClass(DexType clazz) {
+    return addOneItemInstruction(LirOpcodes.INITCLASS, 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 df85c0b..7df9b5a 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -205,6 +205,7 @@
   int INOT = 218;
   int LNOT = 219;
   int DEBUGLOCALREAD = 220;
+  int INITCLASS = 221;
 
   static String toString(int opcode) {
     switch (opcode) {
@@ -531,6 +532,8 @@
         return "LNOT";
       case DEBUGLOCALREAD:
         return "DEBUGLOCALREAD";
+      case INITCLASS:
+        return "INITCLASS";
 
       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 57e0914..c999baf 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -482,6 +482,10 @@
     onInstruction();
   }
 
+  public void onInitClass(DexType clazz) {
+    onInstruction();
+  }
+
   private DexItem getConstantItem(int index) {
     return code.getConstantItem(index);
   }
@@ -1177,6 +1181,12 @@
           onNot(opcode == LirOpcodes.INOT ? NumericType.INT : NumericType.LONG, value);
           return;
         }
+      case LirOpcodes.INITCLASS:
+        {
+          DexType clazz = getNextDexTypeOperand(view);
+          onInitClass(clazz);
+          return;
+        }
       default:
         throw new Unimplemented("No dispatch for opcode " + LirOpcodes.toString(opcode));
     }
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 02b6fc3..74d0956 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -390,4 +390,9 @@
   public void onNewUnboxedEnumInstance(DexType type, int ordinal) {
     appendOutValue().append("type(").append(type).append(") ordinal(").append(ordinal).append(")");
   }
+
+  @Override
+  public void onInitClass(DexType clazz) {
+    builder.append(clazz);
+  }
 }