[LIR] Add support for filled array.

Bug: b/167145686
Bug: b/225838009
Change-Id: Ifbee2162d3f3cbe1838cb8669d6be2d742e1c1c3
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 42dc600..a76bdf5 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -169,7 +169,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection collection) {
+  protected void collectMixedSectionItems(MixedSectionCollection collection) {
     throw new Unreachable();
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 25a5a97..968863a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -128,7 +128,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     mixedItems.add(this);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
index aa6aaec..6274296 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
@@ -66,7 +66,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     // Should never be visited.
     assert false;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
index 1cd2f4b..5dfb273 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
@@ -129,7 +129,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     mixedItems.add(this);
     collectAll(mixedItems, annotations);
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexCallSite.java b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
index e3b49d1..f5d8cea 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCallSite.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
@@ -172,7 +172,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     getEncodedArray().collectMixedSectionItems(mixedItems);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 342a214..c79cb1b 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -253,7 +253,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     throw new Unreachable();
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 9532f1e..4cb2a24 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -919,7 +919,7 @@
     }
 
     @Override
-    void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+    protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
       // Should never be visited.
       assert false;
     }
@@ -971,7 +971,7 @@
     }
 
     @Override
-    void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+    protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
       // Should never be visited.
       assert false;
     }
@@ -1034,7 +1034,7 @@
       }
 
       @Override
-      void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+      protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
         // Should never be visited.
         assert false;
       }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
index a7cd5d1..8826ec4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
@@ -60,7 +60,7 @@
   }
 
   @Override
-  abstract void collectMixedSectionItems(MixedSectionCollection collection);
+  protected abstract void collectMixedSectionItems(MixedSectionCollection collection);
 
   @Override
   public abstract DexDebugInfo self();
@@ -275,7 +275,7 @@
     }
 
     @Override
-    void collectMixedSectionItems(MixedSectionCollection collection) {
+    protected void collectMixedSectionItems(MixedSectionCollection collection) {
       // Only writable info should be iterated for collection.
       throw new Unreachable();
     }
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
index 0d4f388..19aad9e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
@@ -63,7 +63,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     // Should never be called.
     assert false;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java b/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java
index 4192720..663a2e5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java
@@ -22,7 +22,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     mixedItems.add(this);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 2b7a222..c6f2634 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -145,7 +145,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     annotations().collectMixedSectionItems(mixedItems);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 1c502d5..a45d542 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -786,7 +786,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     mixedItems.visit(this);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexItem.java b/src/main/java/com/android/tools/r8/graph/DexItem.java
index f26e41a..928673f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItem.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItem.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.dex.MixedSectionCollection;
 import java.util.Collection;
 import java.util.function.Consumer;
-import java.util.stream.Stream;
 
 public abstract class DexItem {
 
@@ -34,7 +33,7 @@
     }
   }
 
-  abstract void collectMixedSectionItems(MixedSectionCollection collection);
+  protected abstract void collectMixedSectionItems(MixedSectionCollection collection);
 
   protected void flushCachedValues() {
     // Overwritten in subclasses.
@@ -48,7 +47,4 @@
     return toString();
   }
 
-  static <T extends DexItem> Stream<T> filter(Stream<DexItem> stream, Class<T> clazz) {
-    return stream.filter(clazz::isInstance).map(clazz::cast);
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
index 5bac75e..2679186 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
@@ -17,7 +17,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     annotations.collectMixedSectionItems(mixedItems);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index a448af0..fc4c4a6 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -471,7 +471,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     assert getEnclosingMethodAttribute() == null;
     assert getInnerClasses().isEmpty();
     assert !classSignature.hasSignature();
diff --git a/src/main/java/com/android/tools/r8/graph/DexTypeAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexTypeAnnotation.java
index 99dadb8..c343889 100644
--- a/src/main/java/com/android/tools/r8/graph/DexTypeAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexTypeAnnotation.java
@@ -38,7 +38,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     throw new Unreachable("Should not collect type annotation in DEX");
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexTypeList.java b/src/main/java/com/android/tools/r8/graph/DexTypeList.java
index 7be2dce..3716f4e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexTypeList.java
+++ b/src/main/java/com/android/tools/r8/graph/DexTypeList.java
@@ -130,7 +130,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     mixedItems.add(this);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java
index 5271c0a..0dc1d16 100644
--- a/src/main/java/com/android/tools/r8/graph/DexValue.java
+++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -355,7 +355,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     // Should never be visited.
     throw new Unreachable();
   }
diff --git a/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java b/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java
index 96bfb47..f668585 100644
--- a/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java
+++ b/src/main/java/com/android/tools/r8/graph/IndexedDexItem.java
@@ -9,7 +9,7 @@
 public abstract class IndexedDexItem extends CachedHashValueDexItem {
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     // Should never be visited.
     assert false;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java b/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
index 5f7c865..7e21357 100644
--- a/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
+++ b/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
@@ -126,7 +126,7 @@
   }
 
   @Override
-  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
+  protected void collectMixedSectionItems(MixedSectionCollection mixedItems) {
     // Collect values first so that the annotation sets have sorted themselves before adding this.
     collectAll(mixedItems, values);
     mixedItems.add(this);
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 52d38b3..ba020a4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -26,6 +26,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 java.util.List;
 
 public class InvokeNewArray extends Invoke {
@@ -226,4 +227,9 @@
   public int size() {
     return inValues.size();
   }
+
+  @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addInvokeNewArray(getArrayType(), arguments());
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
index 15f7224..ddf7cba 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
@@ -18,6 +18,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 java.util.Arrays;
 
 public class NewArrayFilledData extends Instruction {
@@ -66,6 +67,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addNewArrayFilledData(element_width, size, data, src());
+  }
+
+  @Override
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     if (!other.isNewArrayFilledData()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index 98c55cc..ed5958c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -32,6 +32,7 @@
 import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
 import com.android.tools.r8.ir.optimize.InliningConstraints;
 import com.android.tools.r8.ir.regalloc.RegisterAllocator;
+import com.android.tools.r8.lightir.LirBuilder;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 
 public class StaticPut extends FieldInstruction implements FieldPut, StaticFieldInstruction {
@@ -235,6 +236,11 @@
   }
 
   @Override
+  public void buildLir(LirBuilder<Value, ?> builder) {
+    builder.addStaticPut(getField(), value());
+  }
+
+  @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 707e91c..6dcfe40 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -39,6 +39,7 @@
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InvokeDirect;
 import com.android.tools.r8.ir.code.InvokeInterface;
+import com.android.tools.r8.ir.code.InvokeNewArray;
 import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.InvokeSuper;
 import com.android.tools.r8.ir.code.InvokeVirtual;
@@ -48,6 +49,7 @@
 import com.android.tools.r8.ir.code.MoveException;
 import com.android.tools.r8.ir.code.Mul;
 import com.android.tools.r8.ir.code.NewArrayEmpty;
+import com.android.tools.r8.ir.code.NewArrayFilledData;
 import com.android.tools.r8.ir.code.NewInstance;
 import com.android.tools.r8.ir.code.NumberConversion;
 import com.android.tools.r8.ir.code.NumberGenerator;
@@ -58,6 +60,7 @@
 import com.android.tools.r8.ir.code.Rem;
 import com.android.tools.r8.ir.code.Return;
 import com.android.tools.r8.ir.code.StaticGet;
+import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Sub;
 import com.android.tools.r8.ir.code.Throw;
 import com.android.tools.r8.ir.code.Value;
@@ -532,6 +535,11 @@
     }
 
     @Override
+    public void onStaticPut(DexField field, EV value) {
+      addInstruction(new StaticPut(getValue(value), field));
+    }
+
+    @Override
     public void onInstanceGet(DexField field, EV object) {
       Value dest = getOutValueForNextInstruction(field.getTypeElement(appView));
       addInstruction(new InstanceGet(dest, getValue(object), field));
@@ -611,6 +619,19 @@
     }
 
     @Override
+    public void onInvokeNewArray(DexType type, List<EV> arguments) {
+      Value dest =
+          getOutValueForNextInstruction(
+              type.toTypeElement(appView, Nullability.definitelyNotNull()));
+      addInstruction(new InvokeNewArray(type, dest, getValues(arguments)));
+    }
+
+    @Override
+    public void onNewArrayFilledData(int elementWidth, long size, short[] data, EV src) {
+      addInstruction(new NewArrayFilledData(getValue(src), elementWidth, size, data));
+    }
+
+    @Override
     public void onCmpInstruction(int opcode, EV leftIndex, EV rightIndex) {
       NumericType type;
       Bias bias;
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 da03a02..1239c11 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.code.CfArithmeticBinop.Opcode;
 import com.android.tools.r8.cf.code.CfLogicalBinop;
 import com.android.tools.r8.cf.code.CfNumberConversion;
+import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DebugLocalInfo;
@@ -78,9 +79,32 @@
 
   // TODO(b/225838009): Reconsider this fixed space as the operand count for phis is much larger.
   // Pre-allocated space for caching value indexes when writing instructions.
-  private static final int MAX_VALUE_COUNT = 10;
+  private static final int MAX_VALUE_COUNT = 256;
   private int[] valueIndexBuffer = new int[MAX_VALUE_COUNT];
 
+  /**
+   * Internal "DexItem" for the fill-array payloads such that they can be put in the pool.
+   *
+   * <p>The instruction encoding assumes the instruction operand payload size is u1, so the data
+   * payload is stored in the constant pool instead.
+   */
+  public static class FillArrayPayload extends DexItem {
+    public final int element_width;
+    public final long size;
+    public final short[] data;
+
+    public FillArrayPayload(int element_width, long size, short[] data) {
+      this.element_width = element_width;
+      this.size = size;
+      this.data = data;
+    }
+
+    @Override
+    protected void collectMixedSectionItems(MixedSectionCollection collection) {
+      throw new Unreachable();
+    }
+  }
+
   public LirBuilder(DexMethod method, LirEncodingStrategy<V, EV> strategy, DexItemFactory factory) {
     this.factory = factory;
     constants = new Reference2IntOpenHashMap<>();
@@ -381,6 +405,11 @@
     return addOneItemInstruction(LirOpcodes.GETSTATIC, field);
   }
 
+  public LirBuilder<V, EV> addStaticPut(DexField field, V value) {
+    return addInstructionTemplate(
+        LirOpcodes.PUTSTATIC, Collections.singletonList(field), ImmutableList.of(value));
+  }
+
   public LirBuilder<V, EV> addInstanceGet(DexField field, V object) {
     return addInstructionTemplate(
         LirOpcodes.GETFIELD, Collections.singletonList(field), Collections.singletonList(object));
@@ -609,6 +638,19 @@
         LirOpcodes.NEWARRAY, Collections.singletonList(type), Collections.singletonList(size));
   }
 
+  public LirBuilder<V, EV> addInvokeNewArray(DexType type, List<V> arguments) {
+    return addInstructionTemplate(
+        LirOpcodes.INVOKENEWARRAY, Collections.singletonList(type), arguments);
+  }
+
+  public LirBuilder<V, EV> addNewArrayFilledData(int elementWidth, long size, short[] data, V src) {
+    FillArrayPayload payloadConstant = new FillArrayPayload(elementWidth, size, data);
+    return addInstructionTemplate(
+        LirOpcodes.NEWARRAYFILLEDDATA,
+        Collections.singletonList(payloadConstant),
+        Collections.singletonList(src));
+  }
+
   public LirBuilder<V, EV> addNumberConversion(NumericType from, NumericType to, V value) {
     int opcode = new CfNumberConversion(from, to).getAsmOpcode();
     assert LirOpcodes.I2L <= opcode;
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 302e85d..c4f2076 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirOpcodes.java
@@ -194,6 +194,8 @@
   int FALLTHROUGH = 211;
   int MOVEEXCEPTION = 212;
   int DEBUGLOCALWRITE = 213;
+  int INVOKENEWARRAY = 214;
+  int NEWARRAYFILLEDDATA = 215;
 
   static String toString(int opcode) {
     switch (opcode) {
@@ -506,6 +508,10 @@
         return "MOVEEXCEPTION";
       case DEBUGLOCALWRITE:
         return "DEBUGLOCALWRITE";
+      case INVOKENEWARRAY:
+        return "INVOKENEWARRAY";
+      case NEWARRAYFILLEDDATA:
+        return "NEWARRAYFILLEDDATA";
 
       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 23b20dd..8d81728 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.ir.code.IfType;
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.code.NumericType;
+import com.android.tools.r8.lightir.LirBuilder.FillArrayPayload;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -299,6 +300,14 @@
     onInstruction();
   }
 
+  public void onInvokeNewArray(DexType type, List<EV> arguments) {
+    onInstruction();
+  }
+
+  public void onNewArrayFilledData(int elementWidth, long size, short[] data, EV src) {
+    onInstruction();
+  }
+
   public void onInvokeMethodInstruction(DexMethod method, List<EV> arguments) {
     onInstruction();
   }
@@ -335,6 +344,10 @@
     onFieldInstruction(field);
   }
 
+  public void onStaticPut(DexField field, EV value) {
+    onFieldInstruction(field);
+  }
+
   public abstract void onInstanceGet(DexField field, EV object);
 
   public abstract void onInstancePut(DexField field, EV object, EV value);
@@ -867,6 +880,13 @@
           onStaticGet(field);
           return;
         }
+      case LirOpcodes.PUTSTATIC:
+        {
+          DexField field = (DexField) getConstantItem(view.getNextConstantOperand());
+          EV value = getNextValueOperand(view);
+          onStaticPut(field, value);
+          return;
+        }
       case LirOpcodes.GETFIELD:
         {
           DexField field = (DexField) getConstantItem(view.getNextConstantOperand());
@@ -962,6 +982,21 @@
           onDebugLocalWrite(srcIndex);
           return;
         }
+      case LirOpcodes.INVOKENEWARRAY:
+        {
+          DexType type = getNextDexTypeOperand(view);
+          List<EV> arguments = getInvokeInstructionArguments(view);
+          onInvokeNewArray(type, arguments);
+          return;
+        }
+      case LirOpcodes.NEWARRAYFILLEDDATA:
+        {
+          FillArrayPayload payload =
+              (FillArrayPayload) getConstantItem(view.getNextConstantOperand());
+          EV src = getNextValueOperand(view);
+          onNewArrayFilledData(payload.element_width, payload.size, payload.data, src);
+          return;
+        }
       case LirOpcodes.LCMP:
       case LirOpcodes.FCMPL:
       case LirOpcodes.FCMPG:
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 2a49d6c..58ac9b2 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -217,6 +217,19 @@
   }
 
   @Override
+  public void onInvokeNewArray(DexType type, List<EV> arguments) {
+    appendOutValue();
+    appendValueArguments(arguments);
+    builder.append(type);
+  }
+
+  @Override
+  public void onNewArrayFilledData(int elementWidth, long size, short[] data, EV src) {
+    appendValueArguments(src);
+    builder.append("w:").append(elementWidth).append(",s:").append(size);
+  }
+
+  @Override
   public void onNewInstance(DexType clazz) {
     appendOutValue();
     builder.append(clazz);
@@ -232,14 +245,15 @@
   }
 
   @Override
-  public void onFieldInstruction(DexField field) {
-    builder.append(field);
+  public void onStaticGet(DexField field) {
+    appendOutValue();
+    builder.append(field).append(' ');
   }
 
   @Override
-  public void onStaticGet(DexField field) {
-    appendOutValue();
-    super.onStaticGet(field);
+  public void onStaticPut(DexField field, EV value) {
+    builder.append(field).append(' ');
+    appendValueArguments(value);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index d57b60d..2a5bb6c 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -26,7 +26,6 @@
   public static Collection<String[]> data() {
     String[] tests = {
         "arithmetic.Arithmetic",
-        "filledarray.FilledArray",
         "hello.Hello",
         "ifstatements.IfStatements",
         "inlining.Inlining",
diff --git a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
index 9c33abc..7696491 100644
--- a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
@@ -60,11 +60,6 @@
   }
 
   @Test
-  public void testFilledArray() throws Exception {
-    testDebugging("filledarray", "FilledArray");
-  }
-
-  @Test
   public void testHello() throws Exception {
     testDebugging("hello", "Hello");
   }
diff --git a/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java b/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java
index 1850623..11576d6 100644
--- a/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java
+++ b/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java
@@ -105,6 +105,8 @@
         .setMinApi(parameters)
         .addProgramClasses(getTestClasses())
         .addKeepMainRule(getMainClass())
+        .addKeepRules("-keep,allowshrinking class *")
+        .addKeepAllAttributes()
         .debug()
         .compile()
         .debugConfig(parameters.getRuntime());
diff --git a/src/test/examples/filledarray/FilledArray.java b/src/test/java/com/android/tools/r8/examples/filledarray/FilledArray.java
similarity index 98%
rename from src/test/examples/filledarray/FilledArray.java
rename to src/test/java/com/android/tools/r8/examples/filledarray/FilledArray.java
index 46065e2..f25b76b 100644
--- a/src/test/examples/filledarray/FilledArray.java
+++ b/src/test/java/com/android/tools/r8/examples/filledarray/FilledArray.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-package filledarray;
+package com.android.tools.r8.examples.filledarray;
 
 import java.util.Arrays;
 
diff --git a/src/test/java/com/android/tools/r8/examples/filledarray/FilledArrayTestRunner.java b/src/test/java/com/android/tools/r8/examples/filledarray/FilledArrayTestRunner.java
new file mode 100644
index 0000000..6c4deee
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/examples/filledarray/FilledArrayTestRunner.java
@@ -0,0 +1,148 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.examples.filledarray;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.examples.ExamplesTestBase;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class FilledArrayTestRunner extends ExamplesTestBase {
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().enableApiLevelsForCf().build();
+  }
+
+  public FilledArrayTestRunner(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  public Class<?> getMainClass() {
+    return FilledArray.class;
+  }
+
+  @Override
+  public String getExpected() {
+    return StringUtils.lines(
+        "booleans",
+        "true",
+        "true",
+        "false",
+        "false",
+        "false",
+        "true",
+        "false",
+        "false",
+        "bytes",
+        "0",
+        "1",
+        "2",
+        "3",
+        "4",
+        "5",
+        "6",
+        "7",
+        "8",
+        "9",
+        "10",
+        "11",
+        "12",
+        "13",
+        "14",
+        "15",
+        "16",
+        "17",
+        "18",
+        "-19",
+        "-20",
+        "-96",
+        "127",
+        "-128",
+        "21",
+        "22",
+        "-23",
+        "chars",
+        "a",
+        "b",
+        "c",
+        "d",
+        "a",
+        "b",
+        "c",
+        "d",
+        "ints",
+        "2147483647",
+        "0",
+        "-42",
+        "42",
+        "-2147483648",
+        "2147483647",
+        "0",
+        "-42",
+        "42",
+        "-2147483648",
+        "shorts",
+        "32767",
+        "0",
+        "-42",
+        "42",
+        "-32768",
+        "32767",
+        "0",
+        "-42",
+        "42",
+        "-32768",
+        "longs",
+        "9223372036854775807",
+        "1311693406324658740",
+        "-1311693406324658740",
+        "-9223372036854775808",
+        "1311747200790041140",
+        "-1311693406324671263",
+        "floats",
+        "3.4028235E38",
+        "23.23",
+        "-43.123",
+        "1.4E-45",
+        "1.1754944E-38",
+        "23.23",
+        "-43.123",
+        "doubles",
+        "1.7976931348623157E308",
+        "1.23123123123E8",
+        "-43333.123",
+        "4.9E-324",
+        "2.2250738585072014E-308",
+        "1.23123123123E8",
+        "-43333.123",
+        "i = 1",
+        "ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]",
+        "ints2 = [0, 1, 2, 3, 4]",
+        "i = 7",
+        "ints = [0, 1, 2, 3, 4]",
+        "Exception: class java.lang.ArithmeticException",
+        "Exception: class java.lang.ArithmeticException");
+  }
+
+  @Test
+  public void testDesugaring() throws Exception {
+    runTestDesugaring();
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    runTestR8();
+  }
+
+  @Test
+  public void testDebug() throws Exception {
+    runTestDebugComparator();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java
index acba8f35..fb097c0 100644
--- a/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java
+++ b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java
@@ -5,10 +5,12 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.examples.ExamplesTestBase;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -67,6 +69,10 @@
 
   @Test
   public void testDebug() throws Exception {
+    Assume.assumeFalse(
+        "VMs 13 and 14 step-out to the continuation (line 28) and not the call-site (line 25).",
+        parameters.isDexRuntimeVersion(Version.V13_0_0)
+            || parameters.isDexRuntimeVersion(Version.V14_0_0));
     runTestDebugComparator();
   }
 }