[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();
}
}