Version 0.1.16 Merge: edcf578bc9657aac190739aac482305b6530bc2a CL: https://r8-review.googlesource.com/c/r8/+/8460 Change-Id: I804a8e74c451831a428b8c42098fdb682d6c2b27
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java index 53f88d1..f4b3c8d 100644 --- a/src/main/java/com/android/tools/r8/D8.java +++ b/src/main/java/com/android/tools/r8/D8.java
@@ -55,7 +55,7 @@ */ public final class D8 { - private static final String VERSION = "v0.1.15"; + private static final String VERSION = "v0.1.16"; private static final int STATUS_ERROR = 1; private D8() {}
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java index f08e688..1fb04a6 100644 --- a/src/main/java/com/android/tools/r8/R8.java +++ b/src/main/java/com/android/tools/r8/R8.java
@@ -71,7 +71,7 @@ public class R8 { - private static final String VERSION = "v0.1.15"; + private static final String VERSION = "v0.1.16"; private final Timing timing = new Timing("R8"); private final InternalOptions options;
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 3f492b5..9c79d90 100644 --- a/src/main/java/com/android/tools/r8/graph/DexClass.java +++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -81,7 +81,6 @@ virtualMethods = MoreObjects.firstNonNull(values, NO_METHODS); } - public void forEachMethod(Consumer<DexEncodedMethod> consumer) { for (DexEncodedMethod method : directMethods()) { consumer.accept(method); @@ -119,6 +118,15 @@ staticFields = MoreObjects.firstNonNull(values, NO_FIELDS); } + public boolean definesStaticField(DexField field) { + for (DexEncodedField encodedField : staticFields()) { + if (encodedField.field == field) { + return true; + } + } + return false; + } + public DexEncodedField[] instanceFields() { return instanceFields; }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java index cf89455..5ca8fd1 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -663,6 +663,13 @@ if (exit == null) { return; } + DexClass clazz = appInfo.definitionFor(method.method.getHolder()); + if (clazz == null) { + // TODO(67672280): Synthesized lambda classes are also optimized. However, they are not + // added to the AppInfo. + assert method.accessFlags.isSynthetic(); + return; + } Set<StaticPut> puts = Sets.newIdentityHashSet(); Map<DexField, StaticPut> dominatingPuts = Maps.newIdentityHashMap(); for (BasicBlock block : dominatorTree.dominatorBlocks(exit)) { @@ -672,7 +679,7 @@ if (current.isStaticPut()) { StaticPut put = current.asStaticPut(); DexField field = put.getField(); - if (field.getHolder() == method.method.getHolder()) { + if (clazz.definesStaticField(field)) { if (put.inValue().isConstant()) { if ((field.type.isClassType() || field.type.isArrayType()) && put.inValue().getConstInstruction().isConstNumber() && @@ -709,10 +716,6 @@ for (StaticPut put : dominatingPuts.values()) { DexField field = put.getField(); DexEncodedField encodedField = appInfo.definitionFor(field); - if (encodedField == null) { - // See b/67468748. - continue; - } if (field.type == dexItemFactory.stringType) { if (put.inValue().isConstant()) { if (put.inValue().getConstInstruction().isConstNumber()) {