[LIR] Add invoke-super and clear unused values after IR conversion.

Bug: b/225838009
Change-Id: I3f1735e19fff1b17de5223ffa933613751177468
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
index 4eaae3c..84e6e99 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.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;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import java.util.List;
 
@@ -140,4 +141,9 @@
   void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) {
     registry.registerInvokeSuper(getInvokedMethod());
   }
+
+  @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addInvokeSuper(getInvokedMethod(), arguments());
+  }
 }
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 689d5ff..3bf81f0 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -33,6 +33,7 @@
 import com.android.tools.r8.ir.code.InvokeDirect;
 import com.android.tools.r8.ir.code.InvokeInterface;
 import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.InvokeSuper;
 import com.android.tools.r8.ir.code.InvokeVirtual;
 import com.android.tools.r8.ir.code.MoveException;
 import com.android.tools.r8.ir.code.NewInstance;
@@ -189,6 +190,12 @@
         BasicBlock block = blocks.get(blockIndices.getInt(i));
         block.setFilled();
         blockList.add(block);
+        // LIR has no value-user info so after building is done, removed unused values.
+        for (Instruction instruction : block.getInstructions()) {
+          if (!instruction.isArgument() && instruction.hasUnusedOutValue()) {
+            instruction.clearOutValue();
+          }
+        }
       }
       for (int i = 0; i < peekNextInstructionIndex(); ++i) {
         valueNumberGenerator.next();
@@ -369,6 +376,16 @@
     }
 
     @Override
+    public void onInvokeSuper(DexMethod method, List<EV> arguments) {
+      // TODO(b/225838009): Maintain is-interface bit.
+      boolean isInterface = false;
+      Value dest = getInvokeInstructionOutputValue(method);
+      List<Value> ssaArgumentValues = getValues(arguments);
+      InvokeSuper instruction = new InvokeSuper(method, dest, ssaArgumentValues, isInterface);
+      addInstruction(instruction);
+    }
+
+    @Override
     public void onInvokeVirtual(DexMethod target, List<EV> arguments) {
       // TODO(b/225838009): Maintain is-interface bit.
       Value dest = getInvokeInstructionOutputValue(target);
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 8209c80..906ab32 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -316,6 +316,10 @@
     return addInvokeInstruction(LirOpcodes.INVOKEDIRECT, method, arguments);
   }
 
+  public LirBuilder<V, EV> addInvokeSuper(DexMethod method, List<V> arguments) {
+    return addInvokeInstruction(LirOpcodes.INVOKESUPER, method, arguments);
+  }
+
   public LirBuilder<V, EV> addInvokeVirtual(DexMethod method, List<V> arguments) {
     return addInvokeInstruction(LirOpcodes.INVOKEVIRTUAL, method, arguments);
   }
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 0d30efd..8259d43 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -182,11 +182,12 @@
   int FCONST = 202;
   int DCONST = 203;
   int INVOKEDIRECT = 204;
-  int DEBUGPOS = 205;
-  int PHI = 206;
-  int FALLTHROUGH = 207;
-  int MOVEEXCEPTION = 208;
-  int DEBUGLOCALWRITE = 209;
+  int INVOKESUPER = 205;
+  int DEBUGPOS = 206;
+  int PHI = 207;
+  int FALLTHROUGH = 208;
+  int MOVEEXCEPTION = 209;
+  int DEBUGLOCALWRITE = 210;
 
   static String toString(int opcode) {
     switch (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 a83524c..80efe01 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -102,6 +102,10 @@
     onInvokeMethodInstruction(method, arguments);
   }
 
+  public void onInvokeSuper(DexMethod method, List<EV> arguments) {
+    onInvokeMethodInstruction(method, arguments);
+  }
+
   public void onInvokeVirtual(DexMethod method, List<EV> arguments) {
     onInvokeMethodInstruction(method, arguments);
   }
@@ -218,6 +222,13 @@
           onInvokeDirect(target, arguments);
           return;
         }
+      case LirOpcodes.INVOKESUPER:
+        {
+          DexMethod target = getInvokeInstructionTarget(view);
+          List<EV> arguments = getInvokeInstructionArguments(view);
+          onInvokeSuper(target, arguments);
+          return;
+        }
       case LirOpcodes.INVOKEVIRTUAL:
         {
           DexMethod target = getInvokeInstructionTarget(view);