[LIR] Add support for DebugLocalRead.

Bug: b/225838009
Change-Id: Id817527267d07f19515af610540091b15cb5539b
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
index 5a3e094..3e8e999 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.ir.optimize.DeadCodeRemover.DeadInstructionResult;
 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 DebugLocalRead extends Instruction {
   private static final String ERROR_MESSAGE = "Unexpected attempt to emit debug-local read.";
@@ -51,6 +52,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addDebugLocalRead();
+  }
+
+  @Override
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isDebugLocalRead();
   }
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 8ab729f..9c3cb42 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -31,6 +31,7 @@
 import com.android.tools.r8.ir.code.ConstClass;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.ConstString;
+import com.android.tools.r8.ir.code.DebugLocalRead;
 import com.android.tools.r8.ir.code.DebugLocalWrite;
 import com.android.tools.r8.ir.code.DebugPosition;
 import com.android.tools.r8.ir.code.DexItemBasedConstString;
@@ -745,6 +746,11 @@
     }
 
     @Override
+    public void onDebugLocalRead() {
+      addInstruction(new DebugLocalRead());
+    }
+
+    @Override
     public void onInvokeMultiNewArray(DexType type, List<EV> arguments) {
       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 1f4ac6b..b5ece03 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -670,6 +670,10 @@
     return addOneValueInstruction(LirOpcodes.DEBUGLOCALWRITE, src);
   }
 
+  public LirBuilder<V, EV> addDebugLocalRead() {
+    return addNoOperandInstruction(LirOpcodes.DEBUGLOCALREAD);
+  }
+
   public LirCode<EV> build() {
     assert metadata != null;
     int constantsCount = constants.size();
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 d7ccc91..df85c0b 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -14,7 +14,11 @@
 
   static boolean isOneByteInstruction(int opcode) {
     assert opcode >= ACONST_NULL;
-    return opcode <= DCONST_1 || opcode == RETURN || opcode == DEBUGPOS || opcode == FALLTHROUGH;
+    return opcode <= DCONST_1
+        || opcode == RETURN
+        || opcode == DEBUGPOS
+        || opcode == FALLTHROUGH
+        || opcode == DEBUGLOCALREAD;
   }
 
   // Instructions maintaining the same opcode as defined in CF.
@@ -200,6 +204,7 @@
   int NEWUNBOXEDENUMINSTANCE = 217;
   int INOT = 218;
   int LNOT = 219;
+  int DEBUGLOCALREAD = 220;
 
   static String toString(int opcode) {
     switch (opcode) {
@@ -524,6 +529,8 @@
         return "INOT";
       case LNOT:
         return "LNOT";
+      case DEBUGLOCALREAD:
+        return "DEBUGLOCALREAD";
 
       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 e9b52f7..f715f0e 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -371,6 +371,10 @@
     onInstruction();
   }
 
+  public void onDebugLocalRead() {
+    onInstruction();
+  }
+
   public void onInvokeMultiNewArray(DexType type, List<EV> arguments) {
     onInstruction();
   }
@@ -1111,6 +1115,11 @@
           onDebugLocalWrite(srcIndex);
           return;
         }
+      case LirOpcodes.DEBUGLOCALREAD:
+        {
+          onDebugLocalRead();
+          return;
+        }
       case LirOpcodes.MULTIANEWARRAY:
         {
           DexType type = getNextDexTypeOperand(view);
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 c8d335f..02b6fc3 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -227,6 +227,11 @@
   }
 
   @Override
+  public void onDebugLocalRead() {
+    // Nothing to add.
+  }
+
+  @Override
   public void onInvokeMultiNewArray(DexType type, List<EV> arguments) {
     appendOutValue();
     appendValueArguments(arguments);