Merge commit '7899e0ce754ad72ce6e99559dcb4143a04470687' into dev-release
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
index fa105e6..6731b5e 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
@@ -211,6 +211,10 @@
return TraversalContinuation.CONTINUE;
}
+ public Set<DexType> getInstantiatedLambdaInterfaces() {
+ return instantiatedLambdas.keySet();
+ }
+
public static class Builder extends ObjectAllocationInfoCollectionImpl {
private static class Data {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraproceduralDataflowAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraproceduralDataflowAnalysis.java
index f290cf1..a8482bb 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraproceduralDataflowAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraproceduralDataflowAnalysis.java
@@ -59,7 +59,7 @@
// Update the block exit state, and re-enqueue all successor blocks if the abstract state
// changed.
if (setBlockExitState(block, state)) {
- worklist.addAll(block.getSuccessors());
+ worklist.addAllIgnoringSeenSet(block.getSuccessors());
}
}
return new SuccessfulDataflowAnalysisResult();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 8db8c01..100131c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -1132,13 +1132,9 @@
return false;
}
boolean didDesugar = false;
- Supplier<AppInfoWithClassHierarchy> lazyAppInfo =
- Suppliers.memoize(() -> appView.appInfoForDesugaring());
if (lambdaRewriter != null) {
- didDesugar |= lambdaRewriter.desugarLambdas(method, lazyAppInfo.get()) > 0;
- }
- if (backportedMethodRewriter != null) {
- didDesugar |= backportedMethodRewriter.desugar(method, lazyAppInfo.get());
+ AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
+ didDesugar |= lambdaRewriter.desugarLambdas(method, appInfo) > 0;
}
return didDesugar;
}
@@ -1424,6 +1420,12 @@
timing.end();
}
+ if (backportedMethodRewriter != null) {
+ timing.begin("Rewrite backport methods");
+ backportedMethodRewriter.desugar(code);
+ timing.end();
+ }
+
timing.begin("Desugar string concat");
stringConcatRewriter.desugarStringConcats(method.method, code);
timing.end();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 1f41aa4..da1a799 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -4,25 +4,27 @@
package com.android.tools.r8.ir.desugar;
-import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.cf.code.CfInvoke;
+
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfo;
-import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
+import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.code.Instruction;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.desugar.backports.BackportedMethods;
import com.android.tools.r8.ir.desugar.backports.BooleanMethodRewrites;
@@ -38,19 +40,19 @@
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.InternalOptions.DesugarState;
import com.android.tools.r8.utils.Timing;
+import com.google.common.collect.Sets;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.List;
-import java.util.ListIterator;
import java.util.Map;
import java.util.Queue;
+import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
-import org.objectweb.asm.Opcodes;
public final class BackportedMethodRewriter {
@@ -109,34 +111,29 @@
BackportedMethods.registerSynthesizedCodeReferences(options.itemFactory);
}
- public boolean desugar(ProgramMethod method, AppInfoWithClassHierarchy appInfo) {
+ public void desugar(IRCode code) {
if (!enabled) {
- return false;
+ return; // Nothing to do!
}
- CfCode code = method.getDefinition().getCode().asCfCode();
- ListIterator<CfInstruction> iterator = code.getInstructions().listIterator();
- boolean replaced = false;
+ Set<Value> affectedValues = Sets.newIdentityHashSet();
+ InstructionListIterator iterator = code.instructionListIterator();
while (iterator.hasNext()) {
- CfInvoke invoke = iterator.next().asInvoke();
- if (invoke == null) {
+ Instruction instruction = iterator.next();
+ if (!instruction.isInvokeMethod()) {
continue;
}
- DexMethod invokedMethod = invoke.getMethod();
+
+ InvokeMethod invoke = instruction.asInvokeMethod();
+ DexMethod invokedMethod = invoke.getInvokedMethod();
MethodProvider provider = getMethodProviderOrNull(invokedMethod);
if (provider != null) {
- if (!replaced) {
- // Create mutable instructions on first write.
- ArrayList<CfInstruction> mutableInstructions = new ArrayList<>(code.getInstructions());
- code.setInstructions(mutableInstructions);
- iterator = mutableInstructions.listIterator(iterator.previousIndex());
- iterator.next();
- }
provider.rewriteInvoke(
- invoke, iterator, method.getHolder(), appInfo, synthesizedMethods::add);
- replaced = true;
+ invoke, iterator, code, appView, affectedValues, synthesizedMethods::add);
}
}
- return replaced;
+ if (!affectedValues.isEmpty()) {
+ new TypeAnalysis(appView).narrowing(affectedValues);
+ }
}
public void processSynthesizedClasses(IRConverter converter, ExecutorService executor)
@@ -251,7 +248,7 @@
name = factory.createString("compare");
proto = factory.createProto(factory.intType, factory.longType, factory.longType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, LongMethodRewrites.rewriteCompare()));
+ addProvider(new InvokeRewriter(method, LongMethodRewrites::rewriteCompare));
// Boolean
type = factory.boxedBooleanType;
@@ -296,7 +293,7 @@
name = factory.createString("hash");
proto = factory.createProto(factory.intType, factory.objectArrayType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, ObjectsMethodRewrites.rewriteToArraysHashCode()));
+ addProvider(new InvokeRewriter(method, ObjectsMethodRewrites::rewriteToArraysHashCode));
// int Objects.hashCode(Object o)
name = factory.createString("hashCode");
@@ -306,7 +303,7 @@
// T Objects.requireNonNull(T obj)
method = factory.objectsMethods.requireNonNull;
- addProvider(new InvokeRewriter(method, ObjectsMethodRewrites.rewriteRequireNonNull()));
+ addProvider(new InvokeRewriter(method, ObjectsMethodRewrites::rewriteRequireNonNull));
// T Objects.requireNonNull(T obj, String message)
name = factory.createString("requireNonNull");
@@ -363,7 +360,7 @@
DexString name = factory.createString("hashCode");
DexProto proto = factory.createProto(factory.intType, factory.byteType);
DexMethod method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteAsIdentity()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteAsIdentity));
// Short
type = factory.boxedShortType;
@@ -371,7 +368,7 @@
name = factory.createString("hashCode");
proto = factory.createProto(factory.intType, factory.shortType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteAsIdentity()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteAsIdentity));
// Integer
type = factory.boxedIntType;
@@ -380,25 +377,25 @@
name = factory.createString("hashCode");
proto = factory.createProto(factory.intType, factory.intType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteAsIdentity()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteAsIdentity));
// int Integer.max(int a, int b)
name = factory.createString("max");
proto = factory.createProto(factory.intType, factory.intType, factory.intType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// int Integer.min(int a, int b)
name = factory.createString("min");
proto = factory.createProto(factory.intType, factory.intType, factory.intType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// int Integer.sum(int a, int b)
name = factory.createString("sum");
proto = factory.createProto(factory.intType, factory.intType, factory.intType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToAddInstruction()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToAddInstruction));
// Double
type = factory.boxedDoubleType;
@@ -413,19 +410,19 @@
name = factory.createString("max");
proto = factory.createProto(factory.doubleType, factory.doubleType, factory.doubleType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// double Double.min(double a, double b)
name = factory.createString("min");
proto = factory.createProto(factory.doubleType, factory.doubleType, factory.doubleType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// double Double.sum(double a, double b)
name = factory.createString("sum");
proto = factory.createProto(factory.doubleType, factory.doubleType, factory.doubleType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToAddInstruction()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToAddInstruction));
// boolean Double.isFinite(double a)
name = factory.createString("isFinite");
@@ -440,25 +437,25 @@
name = factory.createString("hashCode");
proto = factory.createProto(factory.intType, factory.floatType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, FloatMethodRewrites.rewriteHashCode()));
+ addProvider(new InvokeRewriter(method, FloatMethodRewrites::rewriteHashCode));
// float Float.max(float a, float b)
name = factory.createString("max");
proto = factory.createProto(factory.floatType, factory.floatType, factory.floatType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// float Float.min(float a, float b)
name = factory.createString("min");
proto = factory.createProto(factory.floatType, factory.floatType, factory.floatType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// float Float.sum(float a, float b)
name = factory.createString("sum");
proto = factory.createProto(factory.floatType, factory.floatType, factory.floatType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToAddInstruction()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToAddInstruction));
// boolean Float.isFinite(float a)
name = factory.createString("isFinite");
@@ -479,19 +476,19 @@
name = factory.createString("logicalAnd");
proto = factory.createProto(factory.booleanType, factory.booleanType, factory.booleanType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, BooleanMethodRewrites.rewriteLogicalAnd()));
+ addProvider(new InvokeRewriter(method, BooleanMethodRewrites::rewriteLogicalAnd));
// boolean Boolean.logicalOr(boolean a, boolean b)
name = factory.createString("logicalOr");
proto = factory.createProto(factory.booleanType, factory.booleanType, factory.booleanType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, BooleanMethodRewrites.rewriteLogicalOr()));
+ addProvider(new InvokeRewriter(method, BooleanMethodRewrites::rewriteLogicalOr));
// boolean Boolean.logicalXor(boolean a, boolean b)
name = factory.createString("logicalXor");
proto = factory.createProto(factory.booleanType, factory.booleanType, factory.booleanType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, BooleanMethodRewrites.rewriteLogicalXor()));
+ addProvider(new InvokeRewriter(method, BooleanMethodRewrites::rewriteLogicalXor));
// Long
type = factory.boxedLongType;
@@ -506,19 +503,19 @@
name = factory.createString("max");
proto = factory.createProto(factory.longType, factory.longType, factory.longType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// long Long.min(long a, long b)
name = factory.createString("min");
proto = factory.createProto(factory.longType, factory.longType, factory.longType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToInvokeMath()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToInvokeMath));
// long Long.sum(long a, long b)
name = factory.createString("sum");
proto = factory.createProto(factory.longType, factory.longType, factory.longType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteToAddInstruction()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteToAddInstruction));
// Character
type = factory.boxedCharType;
@@ -527,7 +524,7 @@
name = factory.createString("hashCode");
proto = factory.createProto(factory.intType, factory.charType);
method = factory.createMethod(type, proto, name);
- addProvider(new InvokeRewriter(method, NumericMethodRewrites.rewriteAsIdentity()));
+ addProvider(new InvokeRewriter(method, NumericMethodRewrites::rewriteAsIdentity));
// Objects
type = factory.objectsType;
@@ -919,7 +916,7 @@
method = factory.createMethod(type, proto, name);
addProvider(
i == 0
- ? new InvokeRewriter(method, CollectionMethodRewrites.rewriteListOfEmpty())
+ ? new InvokeRewriter(method, CollectionMethodRewrites::rewriteListOfEmpty)
: new MethodGenerator(
method,
(options, methodArg) ->
@@ -940,7 +937,7 @@
method = factory.createMethod(type, proto, name);
addProvider(
i == 0
- ? new InvokeRewriter(method, CollectionMethodRewrites.rewriteSetOfEmpty())
+ ? new InvokeRewriter(method, CollectionMethodRewrites::rewriteSetOfEmpty)
: new MethodGenerator(
method,
(options, methodArg) ->
@@ -960,7 +957,7 @@
method = factory.createMethod(type, proto, name);
addProvider(
i == 0
- ? new InvokeRewriter(method, CollectionMethodRewrites.rewriteMapOfEmpty())
+ ? new InvokeRewriter(method, CollectionMethodRewrites::rewriteMapOfEmpty)
: new MethodGenerator(
method,
(options, methodArg) ->
@@ -1227,10 +1224,10 @@
};
MethodInvokeRewriter[] rewriters =
new MethodInvokeRewriter[] {
- OptionalMethodRewrites.rewriteOrElseGet(),
- OptionalMethodRewrites.rewriteDoubleOrElseGet(),
- OptionalMethodRewrites.rewriteLongOrElseGet(),
- OptionalMethodRewrites.rewriteIntOrElseGet(),
+ OptionalMethodRewrites::rewriteOrElseGet,
+ OptionalMethodRewrites::rewriteDoubleOrElseGet,
+ OptionalMethodRewrites::rewriteLongOrElseGet,
+ OptionalMethodRewrites::rewriteIntOrElseGet,
};
DexString name = factory.createString("orElseThrow");
for (int i = 0; i < optionalTypes.length; i++) {
@@ -1297,10 +1294,11 @@
}
public abstract void rewriteInvoke(
- CfInvoke invoke,
- ListIterator<CfInstruction> iterator,
- DexProgramClass context,
- AppInfoWithClassHierarchy appInfo,
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ IRCode code,
+ AppView<?> appView,
+ Set<Value> affectedValues,
Consumer<ProgramMethod> registerSynthesizedMethod);
}
@@ -1315,12 +1313,14 @@
@Override
public void rewriteInvoke(
- CfInvoke invoke,
- ListIterator<CfInstruction> iterator,
- DexProgramClass context,
- AppInfoWithClassHierarchy appInfo,
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ IRCode code,
+ AppView<?> appView,
+ Set<Value> affectedValues,
Consumer<ProgramMethod> registerSynthesizedMethod) {
- rewriter.rewrite(invoke, iterator, appInfo.dexItemFactory());
+ rewriter.rewrite(invoke, iterator, appView.dexItemFactory(), affectedValues);
+ assert code.isConsistentSSA();
}
}
@@ -1341,33 +1341,34 @@
@Override
public void rewriteInvoke(
- CfInvoke invoke,
- ListIterator<CfInstruction> iterator,
- DexProgramClass context,
- AppInfoWithClassHierarchy appInfo,
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ IRCode code,
+ AppView<?> appView,
+ Set<Value> affectedValues,
Consumer<ProgramMethod> registerSynthesizedMethod) {
- ProgramMethod method = getSyntheticMethod(context, appInfo);
- registerSynthesizedMethod.accept(method);
- iterator.remove();
- iterator.add(new CfInvoke(Opcodes.INVOKESTATIC, method.getReference(), false));
- }
+ ProgramMethod method =
+ appView
+ .getSyntheticItems()
+ .createMethod(
+ code.context().getHolder(),
+ appView.dexItemFactory(),
+ builder ->
+ builder
+ .setProto(getProto(appView.dexItemFactory()))
+ .setAccessFlags(
+ MethodAccessFlags.fromSharedAccessFlags(
+ Constants.ACC_PUBLIC
+ | Constants.ACC_STATIC
+ | Constants.ACC_SYNTHETIC,
+ false))
+ .setCode(
+ methodSig -> generateTemplateMethod(appView.options(), methodSig)));
- private ProgramMethod getSyntheticMethod(
- DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
- return appInfo
- .getSyntheticItems()
- .createMethod(
- context,
- appInfo.dexItemFactory(),
- builder ->
- builder
- .setProto(getProto(appInfo.dexItemFactory()))
- .setAccessFlags(
- MethodAccessFlags.fromSharedAccessFlags(
- Constants.ACC_PUBLIC | Constants.ACC_STATIC | Constants.ACC_SYNTHETIC,
- false))
- .setCode(
- methodSig -> generateTemplateMethod(appInfo.app().options, methodSig)));
+ iterator.replaceCurrentInstruction(
+ new InvokeStatic(method.getReference(), invoke.outValue(), invoke.inValues()));
+
+ registerSynthesizedMethod.accept(method);
}
public DexProto getProto(DexItemFactory itemFactory) {
@@ -1399,30 +1400,16 @@
}
private interface TemplateMethodFactory {
+
Code create(InternalOptions options, DexMethod method);
}
- public interface MethodInvokeRewriter {
+ private interface MethodInvokeRewriter {
- CfInstruction rewriteSingle(CfInvoke invoke, DexItemFactory factory);
-
- // Convenience wrapper since most rewrites are to a single instruction.
- default void rewrite(
- CfInvoke invoke, ListIterator<CfInstruction> iterator, DexItemFactory factory) {
- iterator.remove();
- iterator.add(rewriteSingle(invoke, factory));
- }
- }
-
- public abstract static class FullMethodInvokeRewriter implements MethodInvokeRewriter {
-
- @Override
- public final CfInstruction rewriteSingle(CfInvoke invoke, DexItemFactory factory) {
- throw new Unreachable();
- }
-
- @Override
- public abstract void rewrite(
- CfInvoke invoke, ListIterator<CfInstruction> iterator, DexItemFactory factory);
+ void rewrite(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/BooleanMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/BooleanMethodRewrites.java
index ec0a554..90654b2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/BooleanMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/BooleanMethodRewrites.java
@@ -4,27 +4,52 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.cf.code.CfLogicalBinop.Opcode;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.ir.code.And;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.NumericType;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
+import com.android.tools.r8.ir.code.Or;
+import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.Xor;
+import java.util.List;
+import java.util.Set;
public final class BooleanMethodRewrites {
+ public static void rewriteLogicalAnd(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ List<Value> inValues = invoke.inValues();
+ assert inValues.size() == 2;
- private static MethodInvokeRewriter createRewriter(CfLogicalBinop.Opcode op) {
- return (invoke, factory) -> new CfLogicalBinop(op, NumericType.INT);
+ iterator.replaceCurrentInstruction(
+ new And(NumericType.INT, invoke.outValue(), inValues.get(0), inValues.get(1)));
}
- public static MethodInvokeRewriter rewriteLogicalAnd() {
- return createRewriter(Opcode.And);
+ public static void rewriteLogicalOr(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ List<Value> inValues = invoke.inValues();
+ assert inValues.size() == 2;
+
+ iterator.replaceCurrentInstruction(
+ new Or(NumericType.INT, invoke.outValue(), inValues.get(0), inValues.get(1)));
}
- public static MethodInvokeRewriter rewriteLogicalOr() {
- return createRewriter(Opcode.Or);
- }
+ public static void rewriteLogicalXor(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ List<Value> inValues = invoke.inValues();
+ assert inValues.size() == 2;
- public static MethodInvokeRewriter rewriteLogicalXor() {
- return createRewriter(Opcode.Xor);
+ iterator.replaceCurrentInstruction(
+ new Xor(NumericType.INT, invoke.outValue(), inValues.get(0), inValues.get(1)));
}
private BooleanMethodRewrites() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodRewrites.java
index 64c94c5..354040f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodRewrites.java
@@ -4,31 +4,54 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
-import org.objectweb.asm.Opcodes;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.Value;
+import java.util.Collections;
+import java.util.Set;
public final class CollectionMethodRewrites {
private CollectionMethodRewrites() {}
- public static MethodInvokeRewriter rewriteListOfEmpty() {
- return rewriteToCollectionMethod("emptyList");
+ public static void rewriteListOfEmpty(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ rewriteToCollectionMethod(invoke, iterator, factory, "emptyList");
}
- public static MethodInvokeRewriter rewriteSetOfEmpty() {
- return rewriteToCollectionMethod("emptySet");
+ public static void rewriteSetOfEmpty(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ rewriteToCollectionMethod(invoke, iterator, factory, "emptySet");
}
- public static MethodInvokeRewriter rewriteMapOfEmpty() {
- return rewriteToCollectionMethod("emptyMap");
+ public static void rewriteMapOfEmpty(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ rewriteToCollectionMethod(invoke, iterator, factory, "emptyMap");
}
- private static MethodInvokeRewriter rewriteToCollectionMethod(String methodName) {
- return (invoke, factory) ->
- new CfInvoke(
- Opcodes.INVOKESTATIC,
- factory.createMethod(factory.collectionsType, invoke.getMethod().proto, methodName),
- false);
+ private static void rewriteToCollectionMethod(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ String methodName) {
+ assert invoke.inValues().isEmpty();
+
+ DexMethod collectionsEmptyList =
+ factory.createMethod(factory.collectionsType, invoke.getInvokedMethod().proto, methodName);
+ InvokeStatic newInvoke =
+ new InvokeStatic(collectionsEmptyList, invoke.outValue(), Collections.emptyList());
+ iterator.replaceCurrentInstruction(newInvoke);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethodRewrites.java
index 8670d3b..3601c51 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethodRewrites.java
@@ -4,20 +4,29 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
-import org.objectweb.asm.Opcodes;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.Value;
+import java.util.Set;
public final class FloatMethodRewrites {
private FloatMethodRewrites() {}
- public static MethodInvokeRewriter rewriteHashCode() {
- return (invoke, factory) ->
- new CfInvoke(
- Opcodes.INVOKESTATIC,
+ public static void rewriteHashCode(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeStatic mathInvoke =
+ new InvokeStatic(
factory.createMethod(
- factory.boxedFloatType, invoke.getMethod().proto, "floatToIntBits"),
+ factory.boxedFloatType, invoke.getInvokedMethod().proto, "floatToIntBits"),
+ invoke.outValue(),
+ invoke.inValues(),
false);
+ iterator.replaceCurrentInstruction(mathInvoke);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethodRewrites.java
index 5c29f81..348194b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethodRewrites.java
@@ -4,16 +4,28 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfCmp;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.ir.code.Cmp;
import com.android.tools.r8.ir.code.Cmp.Bias;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.NumericType;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
+import com.android.tools.r8.ir.code.Value;
+import java.util.List;
+import java.util.Set;
public final class LongMethodRewrites {
private LongMethodRewrites() {}
- public static MethodInvokeRewriter rewriteCompare() {
- return (invoke, factory) -> new CfCmp(Bias.NONE, NumericType.LONG);
+ public static void rewriteCompare(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ List<Value> inValues = invoke.inValues();
+ assert inValues.size() == 2;
+ iterator.replaceCurrentInstruction(
+ new Cmp(NumericType.LONG, Bias.NONE, invoke.outValue(), inValues.get(0), inValues.get(1)));
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericMethodRewrites.java
index 050aefa..4a413bc 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericMethodRewrites.java
@@ -1,44 +1,56 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.cf.code.CfInvoke;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.ir.code.Add;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.code.NumericType;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.FullMethodInvokeRewriter;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
-import java.util.ListIterator;
-import org.objectweb.asm.Opcodes;
+import com.android.tools.r8.ir.code.Value;
+import java.util.List;
+import java.util.Set;
public final class NumericMethodRewrites {
-
- public static MethodInvokeRewriter rewriteToInvokeMath() {
- return (invoke, factory) -> {
- DexMethod method = invoke.getMethod();
- return new CfInvoke(
- Opcodes.INVOKESTATIC,
- factory.createMethod(factory.mathType, method.proto, method.name),
- false);
- };
+ public static void rewriteToInvokeMath(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeStatic mathInvoke =
+ new InvokeStatic(
+ factory.createMethod(
+ factory.mathType, invoke.getInvokedMethod().proto, invoke.getInvokedMethod().name),
+ invoke.outValue(),
+ invoke.inValues(),
+ false);
+ iterator.replaceCurrentInstruction(mathInvoke);
}
- public static MethodInvokeRewriter rewriteToAddInstruction() {
- return (invoke, factory) -> {
- NumericType numericType = NumericType.fromDexType(invoke.getMethod().getReturnType());
- return new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, numericType);
- };
+ public static void rewriteToAddInstruction(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ List<Value> values = invoke.inValues();
+ assert values.size() == 2;
+
+ NumericType numericType = NumericType.fromDexType(invoke.getReturnType());
+ Add add = new Add(numericType, invoke.outValue(), values.get(0), values.get(1));
+ iterator.replaceCurrentInstruction(add);
}
- public static MethodInvokeRewriter rewriteAsIdentity() {
- return new FullMethodInvokeRewriter() {
- @Override
- public void rewrite(
- CfInvoke invoke, ListIterator<CfInstruction> iterator, DexItemFactory factory) {
- // The invoke consumes the stack value and pushes another assumed to be the same.
- iterator.remove();
- }
- };
+ public static void rewriteAsIdentity(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ List<Value> values = invoke.inValues();
+ assert values.size() == 1;
+ if (invoke.hasOutValue()) {
+ invoke.outValue().replaceUsers(values.get(0));
+ }
+ // TODO(b/152853271): Debugging information is lost here (DebugLocalWrite may be required).
+ iterator.removeOrReplaceByDebugLocalRead();
}
private NumericMethodRewrites() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethodRewrites.java
index 69253be..de16e98 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethodRewrites.java
@@ -4,41 +4,43 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.cf.code.CfStackInstruction;
-import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.FullMethodInvokeRewriter;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
-import java.util.ListIterator;
-import org.objectweb.asm.Opcodes;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.InvokeVirtual;
+import com.android.tools.r8.ir.code.Value;
+import java.util.Set;
public final class ObjectsMethodRewrites {
- public static MethodInvokeRewriter rewriteToArraysHashCode() {
- return (invoke, factory) -> {
- DexType arraysType = factory.createType(factory.arraysDescriptor);
- return new CfInvoke(
- Opcodes.INVOKESTATIC,
- factory.createMethod(arraysType, invoke.getMethod().proto, "hashCode"),
- false);
- };
+ public static void rewriteToArraysHashCode(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ DexType arraysType = factory.createType(factory.arraysDescriptor);
+ DexMethod hashCodeMethod =
+ factory.createMethod(arraysType, invoke.getInvokedMethod().proto, "hashCode");
+ InvokeStatic arraysHashCode =
+ new InvokeStatic(hashCodeMethod, invoke.outValue(), invoke.inValues(), false);
+ iterator.replaceCurrentInstruction(arraysHashCode);
}
- public static MethodInvokeRewriter rewriteRequireNonNull() {
- return new FullMethodInvokeRewriter() {
-
- @Override
- public void rewrite(
- CfInvoke invoke, ListIterator<CfInstruction> iterator, DexItemFactory factory) {
- iterator.remove();
- // requireNonNull returns the operand, so dup top-of-stack, do getClass and pop the class.
- iterator.add(new CfStackInstruction(Opcode.Dup));
- iterator.add(new CfInvoke(Opcodes.INVOKEVIRTUAL, factory.objectMembers.getClass, false));
- iterator.add(new CfStackInstruction(Opcode.Pop));
- }
- };
+ public static void rewriteRequireNonNull(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeVirtual getClass =
+ new InvokeVirtual(factory.objectMembers.getClass, null, invoke.inValues());
+ if (invoke.hasOutValue()) {
+ affectedValues.addAll(invoke.outValue().affectedValues());
+ invoke.outValue().replaceUsers(invoke.inValues().get(0));
+ invoke.setOutValue(null);
+ }
+ iterator.replaceCurrentInstruction(getClass);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/OptionalMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/OptionalMethodRewrites.java
index d66d7f5..1334c62 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/OptionalMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/OptionalMethodRewrites.java
@@ -4,40 +4,69 @@
package com.android.tools.r8.ir.desugar.backports;
-import com.android.tools.r8.cf.code.CfInvoke;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
-import java.util.function.Function;
-import org.objectweb.asm.Opcodes;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeVirtual;
+import com.android.tools.r8.ir.code.Value;
+import java.util.Set;
public final class OptionalMethodRewrites {
private OptionalMethodRewrites() {}
- private static MethodInvokeRewriter createRewriter(
- Function<DexItemFactory, DexType> holderTypeSupplier, String methodName) {
- return (invoke, factory) ->
- new CfInvoke(
- Opcodes.INVOKEVIRTUAL,
+ public static void rewriteOrElseGet(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeVirtual getInvoke =
+ new InvokeVirtual(
+ factory.createMethod(factory.optionalType, invoke.getInvokedMethod().proto, "get"),
+ invoke.outValue(),
+ invoke.inValues());
+ iterator.replaceCurrentInstruction(getInvoke);
+ }
+
+ public static void rewriteDoubleOrElseGet(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeVirtual getInvoke =
+ new InvokeVirtual(
factory.createMethod(
- holderTypeSupplier.apply(factory), invoke.getMethod().proto, methodName),
- false);
+ factory.optionalDoubleType, invoke.getInvokedMethod().proto, "getAsDouble"),
+ invoke.outValue(),
+ invoke.inValues());
+ iterator.replaceCurrentInstruction(getInvoke);
}
- public static MethodInvokeRewriter rewriteOrElseGet() {
- return createRewriter(factory -> factory.optionalType, "get");
+ public static void rewriteIntOrElseGet(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeVirtual getInvoke =
+ new InvokeVirtual(
+ factory.createMethod(
+ factory.optionalIntType, invoke.getInvokedMethod().proto, "getAsInt"),
+ invoke.outValue(),
+ invoke.inValues());
+ iterator.replaceCurrentInstruction(getInvoke);
}
- public static MethodInvokeRewriter rewriteDoubleOrElseGet() {
- return createRewriter(factory -> factory.optionalDoubleType, "getAsDouble");
- }
-
- public static MethodInvokeRewriter rewriteIntOrElseGet() {
- return createRewriter(factory -> factory.optionalIntType, "getAsInt");
- }
-
- public static MethodInvokeRewriter rewriteLongOrElseGet() {
- return createRewriter(factory -> factory.optionalLongType, "getAsLong");
+ public static void rewriteLongOrElseGet(
+ InvokeMethod invoke,
+ InstructionListIterator iterator,
+ DexItemFactory factory,
+ Set<Value> affectedValues) {
+ InvokeVirtual getInvoke =
+ new InvokeVirtual(
+ factory.createMethod(
+ factory.optionalLongType, invoke.getInvokedMethod().proto, "getAsLong"),
+ invoke.outValue(),
+ invoke.inValues());
+ iterator.replaceCurrentInstruction(getInvoke);
}
}
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 311e10d..6c28f2e 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -55,6 +55,7 @@
import com.android.tools.r8.utils.PredicateSet;
import com.android.tools.r8.utils.TraversalContinuation;
import com.android.tools.r8.utils.Visibility;
+import com.android.tools.r8.utils.WorkList;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.google.common.collect.Sets;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
@@ -613,21 +614,13 @@
public Collection<DexClass> computeReachableInterfaces() {
Set<DexClass> interfaces = Sets.newIdentityHashSet();
- Set<DexType> seen = Sets.newIdentityHashSet();
- Deque<DexType> worklist = new ArrayDeque<>();
+ WorkList<DexType> worklist = WorkList.newIdentityWorkList();
+ worklist.addIfNotSeen(objectAllocationInfoCollection.getInstantiatedLambdaInterfaces());
for (DexProgramClass clazz : classes()) {
- worklist.add(clazz.type);
+ worklist.addIfNotSeen(clazz.type);
}
- for (DexCallSite callSite : callSites.keySet()) {
- for (DexEncodedMethod method : lookupLambdaImplementedMethods(callSite)) {
- worklist.add(method.holder());
- }
- }
- while (!worklist.isEmpty()) {
- DexType type = worklist.pop();
- if (!seen.add(type)) {
- continue;
- }
+ while (worklist.hasNext()) {
+ DexType type = worklist.next();
DexClass definition = definitionFor(type);
if (definition == null) {
continue;
@@ -636,9 +629,9 @@
interfaces.add(definition);
}
if (definition.superType != null) {
- worklist.add(definition.superType);
+ worklist.addIfNotSeen(definition.superType);
}
- Collections.addAll(worklist, definition.interfaces.values);
+ worklist.addIfNotSeen(definition.interfaces.values);
}
return interfaces;
}
@@ -1247,18 +1240,21 @@
*/
public void forEachTypeInHierarchyOfLiveProgramClasses(Consumer<DexClass> fn) {
forEachTypeInHierarchyOfLiveProgramClasses(
- fn, ListUtils.map(liveTypes, t -> definitionFor(t).asProgramClass()), callSites, this);
+ fn,
+ ListUtils.map(liveTypes, t -> definitionFor(t).asProgramClass()),
+ objectAllocationInfoCollection.getInstantiatedLambdaInterfaces(),
+ this);
}
// Split in a static method so it can be used during construction.
static void forEachTypeInHierarchyOfLiveProgramClasses(
Consumer<DexClass> fn,
Collection<DexProgramClass> liveProgramClasses,
- Map<DexCallSite, ProgramMethodSet> callSites,
+ Set<DexType> lambdaInterfaces,
AppInfoWithClassHierarchy appInfo) {
Set<DexType> seen = Sets.newIdentityHashSet();
- Deque<DexType> worklist = new ArrayDeque<>();
liveProgramClasses.forEach(c -> seen.add(c.type));
+ Deque<DexType> worklist = new ArrayDeque<>(lambdaInterfaces);
for (DexProgramClass liveProgramClass : liveProgramClasses) {
fn.accept(liveProgramClass);
DexType superType = liveProgramClass.superType;
@@ -1271,16 +1267,6 @@
}
}
}
- for (DexCallSite callSite : callSites.keySet()) {
- List<DexType> interfaces = LambdaDescriptor.getInterfaces(callSite, appInfo);
- if (interfaces != null) {
- for (DexType iface : interfaces) {
- if (seen.add(iface)) {
- worklist.add(iface);
- }
- }
- }
- }
while (!worklist.isEmpty()) {
DexType type = worklist.pop();
DexClass clazz = appInfo.definitionFor(type);
diff --git a/src/main/java/com/android/tools/r8/utils/WorkList.java b/src/main/java/com/android/tools/r8/utils/WorkList.java
index 2e74be4..8ee6e30 100644
--- a/src/main/java/com/android/tools/r8/utils/WorkList.java
+++ b/src/main/java/com/android/tools/r8/utils/WorkList.java
@@ -50,7 +50,7 @@
}
}
- public void addAll(Iterable<T> items) {
+ public void addAllIgnoringSeenSet(Iterable<T> items) {
items.forEach(workingList::addLast);
}
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 9fe1539..700b3f0 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -642,6 +642,7 @@
"530-checker-lse2",
TestCondition.match(
TestCondition.tools(DexTool.DX),
+ TestCondition.compilers(CompilerUnderTest.R8, CompilerUnderTest.D8),
TestCondition.runtimesUpTo(DexVm.Version.V6_0_1)))
.put(
"534-checker-bce-deoptimization",