Support remaining instructions in virtual method hoister

Bug: b/241190995
Change-Id: I3c6be6a4699bb6f6e6685552b296688a04ec8cb9
diff --git a/src/main/java/com/android/tools/r8/optimize/virtualmethodhoisting/VirtualMethodHoister.java b/src/main/java/com/android/tools/r8/optimize/virtualmethodhoisting/VirtualMethodHoister.java
index a84c9aab..08500c2 100644
--- a/src/main/java/com/android/tools/r8/optimize/virtualmethodhoisting/VirtualMethodHoister.java
+++ b/src/main/java/com/android/tools/r8/optimize/virtualmethodhoisting/VirtualMethodHoister.java
@@ -7,6 +7,9 @@
 import static com.android.tools.r8.ir.code.Opcodes.ADD;
 import static com.android.tools.r8.ir.code.Opcodes.AND;
 import static com.android.tools.r8.ir.code.Opcodes.ARGUMENT;
+import static com.android.tools.r8.ir.code.Opcodes.ARRAY_GET;
+import static com.android.tools.r8.ir.code.Opcodes.ARRAY_LENGTH;
+import static com.android.tools.r8.ir.code.Opcodes.ARRAY_PUT;
 import static com.android.tools.r8.ir.code.Opcodes.ASSUME;
 import static com.android.tools.r8.ir.code.Opcodes.CHECK_CAST;
 import static com.android.tools.r8.ir.code.Opcodes.CMP;
@@ -28,6 +31,7 @@
 import static com.android.tools.r8.ir.code.Opcodes.INVOKE_SUPER;
 import static com.android.tools.r8.ir.code.Opcodes.INVOKE_VIRTUAL;
 import static com.android.tools.r8.ir.code.Opcodes.MONITOR;
+import static com.android.tools.r8.ir.code.Opcodes.MOVE_EXCEPTION;
 import static com.android.tools.r8.ir.code.Opcodes.MUL;
 import static com.android.tools.r8.ir.code.Opcodes.NEG;
 import static com.android.tools.r8.ir.code.Opcodes.NEW_ARRAY_EMPTY;
@@ -43,6 +47,7 @@
 import static com.android.tools.r8.ir.code.Opcodes.SHR;
 import static com.android.tools.r8.ir.code.Opcodes.STATIC_GET;
 import static com.android.tools.r8.ir.code.Opcodes.STATIC_PUT;
+import static com.android.tools.r8.ir.code.Opcodes.STORE_STORE_FENCE;
 import static com.android.tools.r8.ir.code.Opcodes.STRING_SWITCH;
 import static com.android.tools.r8.ir.code.Opcodes.SUB;
 import static com.android.tools.r8.ir.code.Opcodes.THROW;
@@ -65,6 +70,7 @@
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.ir.code.ArrayPut;
 import com.android.tools.r8.ir.code.FieldInstruction;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
@@ -316,6 +322,19 @@
         }
         int opcode = instruction.opcode();
         switch (opcode) {
+          case ARRAY_PUT:
+            {
+              ArrayPut arrayPut = instruction.asArrayPut();
+              if (isThis(arrayPut.value())) {
+                // We would need to check the array type, which is not embedded in the array-put.
+                // For now simply bail-out conservatively.
+                return false;
+              }
+
+              // Safe.
+              break;
+            }
+
           case CHECK_CAST:
           case CONST_CLASS:
           case INIT_CLASS:
@@ -455,6 +474,8 @@
       switch (opcode) {
         case ADD:
         case AND:
+        case ARRAY_GET:
+        case ARRAY_LENGTH:
         case ARGUMENT:
         case ASSUME:
         case CMP:
@@ -466,6 +487,7 @@
         case INC:
         case INT_SWITCH:
         case MONITOR:
+        case MOVE_EXCEPTION:
         case MUL:
         case NEG:
         case NOT:
@@ -475,6 +497,7 @@
         case RESOURCE_CONST_NUMBER:
         case SHL:
         case SHR:
+        case STORE_STORE_FENCE:
         case STRING_SWITCH:
         case SUB:
         case THROW: