Merge "Make R8 processing deterministic"
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index c2cd2ea..e787e59 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -12,7 +12,10 @@
import com.android.tools.r8.code.AgetWide;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import java.util.Arrays;
@@ -114,4 +117,9 @@
public ArrayGet asArrayGet() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.ALWAYS;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
index 40bd443..88325a4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
@@ -5,7 +5,10 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
public class ArrayLength extends Instruction {
@@ -79,4 +82,9 @@
assert other.isArrayLength();
return 0;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.ALWAYS;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index 20ce7e8..11694a3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -12,7 +12,10 @@
import com.android.tools.r8.code.AputWide;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import com.android.tools.r8.utils.InternalOptions;
import java.util.List;
@@ -135,4 +138,9 @@
public ArrayPut asArrayPut() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.ALWAYS;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index 573db67..0c0797f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -7,8 +7,10 @@
import com.android.tools.r8.code.MoveObject;
import com.android.tools.r8.code.MoveObjectFrom16;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
public class CheckCast extends Instruction {
@@ -94,4 +96,9 @@
public String toString() {
return super.toString() + "; " + type;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.classIsVisible(holder, type, info);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index 3a3626e..efde56a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -5,8 +5,10 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.utils.InternalOptions;
public class ConstClass extends ConstInstruction {
@@ -76,4 +78,9 @@
public ConstClass asConstClass() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.classIsVisible(holder, clazz, info);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
index 0a1cc1b..55bb03d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
@@ -4,8 +4,11 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DebugLocalInfo;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
@@ -82,4 +85,9 @@
StringUtils.append(builder, starting.int2ReferenceEntrySet());
return builder.toString();
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.ALWAYS;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java b/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java
index 7a5acc5..9a8f8a5 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java
@@ -4,8 +4,11 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.utils.InternalOptions;
public class DebugPosition extends Instruction {
@@ -74,4 +77,9 @@
}
builder.append(line);
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.ALWAYS;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
index 955a6cc..afa18e5 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -6,7 +6,6 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
-import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
import com.android.tools.r8.ir.optimize.Inliner.Constraint;
@@ -76,10 +75,6 @@
@Override
public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
- DexClass targetClass = info.definitionFor(type());
- if (targetClass == null) {
- return Constraint.NEVER;
- }
- return Constraint.deriveConstraint(holder, type(), targetClass.accessFlags, info);
+ return Constraint.classIsVisible(holder, type, info);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index b7a18f0..e33c796 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -839,7 +839,5 @@
}
// Returns the inlining constraint for this instruction.
- public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
- return Constraint.NEVER;
- }
+ public abstract Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index d0d0739..f597b2c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -7,7 +7,9 @@
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexCallSite;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import java.util.List;
public final class InvokeCustom extends Invoke {
@@ -88,4 +90,9 @@
public InvokeCustom asInvokeCustom() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.NEVER;
+ }
}
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 2912c1a..0049baa 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
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import java.util.List;
public class InvokeNewArray extends Invoke {
@@ -93,4 +94,9 @@
public InvokeNewArray asInvokeNewArray() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.classIsVisible(holder, type, info);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Monitor.java b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
index b3e155b..a3b71e1 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Monitor.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
@@ -8,7 +8,10 @@
import com.android.tools.r8.code.MonitorEnter;
import com.android.tools.r8.code.MonitorExit;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
public class Monitor extends Instruction {
@@ -80,4 +83,10 @@
public Monitor asMonitor() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ // Conservative choice.
+ return Constraint.NEVER;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
index 023e6f0..3dff4f3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java
+++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -4,7 +4,10 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.utils.InternalOptions;
public class MoveException extends Instruction {
@@ -82,4 +85,10 @@
}
return super.toString();
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ // TODO(64432527): Revisit this constraint.
+ return Constraint.NEVER;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
index f7b0367..17a08da 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
@@ -5,8 +5,10 @@
import com.android.tools.r8.code.NewArray;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
public class NewArrayEmpty extends Instruction {
@@ -68,4 +70,9 @@
public NewArrayEmpty asNewArrayEmpty() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.classIsVisible(holder, type, info);
+ }
}
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 63a1a0e..aed765e 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
@@ -6,7 +6,10 @@
import com.android.tools.r8.code.FillArrayData;
import com.android.tools.r8.code.FillArrayDataPayload;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
import com.android.tools.r8.utils.InternalOptions;
import java.util.Arrays;
@@ -94,4 +97,9 @@
public NewArrayFilledData asNewArrayFilledData() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.ALWAYS;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index 1aa2cbb..8d1671d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -4,8 +4,10 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.DexBuilder;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
public class NewInstance extends Instruction {
@@ -69,4 +71,9 @@
public NewInstance asNewInstance() {
return this;
}
+
+ @Override
+ public Constraint inliningConstraint(AppInfoWithSubtyping info, DexType holder) {
+ return Constraint.classIsVisible(holder, clazz, info);
+ }
}
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 6a4777d..d43dc36 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
@@ -454,6 +454,7 @@
assert !options.debug;
inliner.performInlining(method, code, callGraph);
}
+ codeRewriter.removeCastChains(code);
codeRewriter.rewriteLongCompareAndRequireNonNull(code, options);
codeRewriter.commonSubexpressionElimination(code);
codeRewriter.simplifyArrayConstruction(code);
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 ddc83f8..981f673 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
@@ -17,6 +17,7 @@
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.Binop;
import com.android.tools.r8.ir.code.CatchHandlers;
+import com.android.tools.r8.ir.code.CheckCast;
import com.android.tools.r8.ir.code.Cmp;
import com.android.tools.r8.ir.code.Cmp.Bias;
import com.android.tools.r8.ir.code.ConstNumber;
@@ -541,42 +542,45 @@
assert code.isConsistentGraph();
}
- // For supporting assert javac adds the static field $assertionsDisabled to all classes which
- // have methods with assertions. This is used to support the Java VM -ea flag.
- //
- // The class:
- //
- // class A {
- // void m() {
- // assert xxx;
- // }
- // }
- //
- // Is compiled into:
- //
- // class A {
- // static boolean $assertionsDisabled;
- // static {
- // $assertionsDisabled = A.class.desiredAssertionStatus();
- // }
- //
- // // method with "assert xxx";
- // void m() {
- // if (!$assertionsDisabled) {
- // if (xxx) {
- // throw new AssertionError(...);
- // }
- // }
- // }
- // }
- //
- // With the rewriting below (and other rewritings) the resulting code is:
- //
- // class A {
- // void m() {
- // }
- // }
- //
+
+ /**
+ * For supporting assert javac adds the static field $assertionsDisabled to all classes which
+ * have methods with assertions. This is used to support the Java VM -ea flag.
+ *
+ * The class:
+ * <pre>
+ * class A {
+ * void m() {
+ * assert xxx;
+ * }
+ * }
+ * </pre>
+ * Is compiled into:
+ * <pre>
+ * class A {
+ * static boolean $assertionsDisabled;
+ * static {
+ * $assertionsDisabled = A.class.desiredAssertionStatus();
+ * }
+ *
+ * // method with "assert xxx";
+ * void m() {
+ * if (!$assertionsDisabled) {
+ * if (xxx) {
+ * throw new AssertionError(...);
+ * }
+ * }
+ * }
+ * }
+ * </pre>
+ * With the rewriting below (and other rewritings) the resulting code is:
+ * <pre>
+ * class A {
+ * void m() {
+ * }
+ * }
+ * </pre>
+ */
public void disableAssertions(IRCode code) {
InstructionIterator iterator = code.instructionIterator();
while (iterator.hasNext()) {
@@ -600,6 +604,28 @@
}
}
+ /**
+ * Due to inlining, we might see chains of casts on subtypes. It suffices to cast to the lowest
+ * subtype, as that will fail if a cast on a supertype would have failed.
+ */
+ public void removeCastChains(IRCode code) {
+ InstructionIterator it = code.instructionIterator();
+ while (it.hasNext()) {
+ Instruction current = it.next();
+ if (current.isCheckCast()
+ && current.outValue() != null && current.outValue().isUsed()
+ && current.outValue().numberOfPhiUsers() == 0) {
+ CheckCast checkCast = current.asCheckCast();
+ if (checkCast.outValue().uniqueUsers().stream().allMatch(
+ user -> user.isCheckCast()
+ && user.asCheckCast().getType().isSubtypeOf(checkCast.getType(), appInfo))) {
+ checkCast.outValue().replaceUsers(checkCast.inValues().get(0));
+ it.remove();
+ }
+ }
+ }
+ }
+
private boolean canBeFolded(Instruction instruction) {
return (instruction.isBinop() && instruction.asBinop().canBeFolded()) ||
(instruction.isUnop() && instruction.asUnop().canBeFolded());
@@ -1240,7 +1266,7 @@
}
private Value addConstString(IRCode code, InstructionListIterator iterator, String s) {
- Value value = code.createValue(MoveType.OBJECT);;
+ Value value = code.createValue(MoveType.OBJECT);
iterator.add(new ConstString(value, dexItemFactory.createString(s)));
return value;
}
@@ -1279,7 +1305,7 @@
iterator.add(new ConstString(value, dexItemFactory.createString("INVOKE ")));
iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
- value = code.createValue(MoveType.OBJECT);;
+ value = code.createValue(MoveType.OBJECT);
iterator.add(
new ConstString(value, dexItemFactory.createString(method.method.qualifiedName())));
iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 942e8f0..f547209 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -183,6 +183,13 @@
}
}
+ public static Constraint classIsVisible(DexType context, DexType clazz,
+ AppInfoWithSubtyping appInfo) {
+ DexClass definition = appInfo.definitionFor(clazz);
+ return definition == null ? NEVER
+ : deriveConstraint(context, clazz, definition.accessFlags, appInfo);
+ }
+
public static Constraint min(Constraint one, Constraint other) {
return one.ordinal() < other.ordinal() ? one : other;
}
@@ -351,7 +358,7 @@
IRCode inlinee = result
.buildIR(code.valueNumberGenerator, appInfo, graphLense, options);
if (inlinee != null) {
- // TODO(sgjesse): Get rid of this additional check by improved inlining.
+ // TODO(64432527): Get rid of this additional check by improved inlining.
if (block.hasCatchHandlers() && inlinee.getNormalExitBlock() == null) {
continue;
}
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index fabf8e7..da561f8 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -752,12 +752,19 @@
"488-checker-inline-recursive-calls",
"487-checker-inline-calls",
"122-npe",
+ "141-class-unload",
// Calls some internal art methods that cannot tolerate inlining.
"466-get-live-vreg",
// Requires a certain call pattern to surface an Art bug.
- "534-checker-bce-deoptimization"
+ "534-checker-bce-deoptimization",
+
+ // Requires something to be allocated in a method so that it goes out of scope.
+ "059-finalizer-throw",
+
+ // Has tests in submethods, which we should not inline.
+ "625-checker-licm-regressions"
);
private static List<String> failuresToTriage = ImmutableList.of(
@@ -1087,49 +1094,47 @@
throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
assert mode != null;
switch (compilerUnderTest) {
- case D8:
- {
- assert keepRulesFile == null : "Keep-rules file specified for D8.";
- D8Command.Builder builder =
- D8Command.builder()
- .setMode(mode)
- .addProgramFiles(ListUtils.map(fileNames, Paths::get));
- Integer minSdkVersion = needMinSdkVersion.get(name);
- if (minSdkVersion != null) {
- builder.setMinApiLevel(minSdkVersion);
- }
- D8Output output = D8.run(builder.build());
- output.write(Paths.get(resultPath));
- break;
+ case D8: {
+ assert keepRulesFile == null : "Keep-rules file specified for D8.";
+ D8Command.Builder builder =
+ D8Command.builder()
+ .setMode(mode)
+ .addProgramFiles(ListUtils.map(fileNames, Paths::get));
+ Integer minSdkVersion = needMinSdkVersion.get(name);
+ if (minSdkVersion != null) {
+ builder.setMinApiLevel(minSdkVersion);
}
- case R8:
- {
- R8Command.Builder builder =
- R8Command.builder()
- .setMode(mode)
- .setOutputPath(Paths.get(resultPath))
- .addProgramFiles(ListUtils.map(fileNames, Paths::get))
- .setIgnoreMissingClasses(true);
- Integer minSdkVersion = needMinSdkVersion.get(name);
- if (minSdkVersion != null) {
- builder.setMinApiLevel(minSdkVersion);
- }
- if (keepRulesFile != null) {
- builder.addProguardConfigurationFiles(Paths.get(keepRulesFile));
- }
- // Add internal flags for testing purposes.
- ToolHelper.runR8(
- builder.build(),
- options -> {
- if (enableInterfaceMethodDesugaring.contains(name)) {
- options.interfaceMethodDesugaring = OffOrAuto.Auto;
- }
- if (disableInlining) {
- options.inlineAccessors = false;
- }
- });
- break;
+ D8Output output = D8.run(builder.build());
+ output.write(Paths.get(resultPath));
+ break;
+ }
+ case R8: {
+ R8Command.Builder builder =
+ R8Command.builder()
+ .setMode(mode)
+ .setOutputPath(Paths.get(resultPath))
+ .addProgramFiles(ListUtils.map(fileNames, Paths::get))
+ .setIgnoreMissingClasses(true);
+ Integer minSdkVersion = needMinSdkVersion.get(name);
+ if (minSdkVersion != null) {
+ builder.setMinApiLevel(minSdkVersion);
}
+ if (keepRulesFile != null) {
+ builder.addProguardConfigurationFiles(Paths.get(keepRulesFile));
+ }
+ // Add internal flags for testing purposes.
+ ToolHelper.runR8(
+ builder.build(),
+ options -> {
+ if (enableInterfaceMethodDesugaring.contains(name)) {
+ options.interfaceMethodDesugaring = OffOrAuto.Auto;
+ }
+ if (disableInlining) {
+ options.inlineAccessors = false;
+ }
+ });
+ break;
+ }
default:
assert false : compilerUnderTest;
}
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index f7a9caa..10947a4 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -157,8 +157,8 @@
throws IOException {
try (Closer closer = Closer.create()) {
if (write) {
- app1.writeToDirectory(Paths.get("app1"), OutputMode.Indexed);
- app2.writeToDirectory(Paths.get("app2"), OutputMode.Indexed);
+ app1.writeToDirectory(temp.newFolder("app1").toPath(), OutputMode.Indexed);
+ app2.writeToDirectory(temp.newFolder("app2").toPath(), OutputMode.Indexed);
}
List<Resource> files1 = app1.getDexProgramResources();
List<Resource> files2 = app2.getDexProgramResources();
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
index 8f46572..795c020 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
@@ -92,7 +92,11 @@
.addProgramFiles(originalDex)
.setOutputPath(out)
.addProguardConfigurationFiles(keepRules, printMapping)
- .build());
+ .build(),
+ options -> {
+ // Turn off inlining, as we want the mapping that is printed to be stable.
+ options.inlineAccessors = false;
+ });
Path outputmapping = out.resolve("mapping.txt");
String actualMapping;
actualMapping = new String(Files.readAllBytes(outputmapping), StandardCharsets.UTF_8);
diff --git a/third_party/goyt.tar.gz.sha1 b/third_party/goyt.tar.gz.sha1
index 873f829..0630836 100644
--- a/third_party/goyt.tar.gz.sha1
+++ b/third_party/goyt.tar.gz.sha1
@@ -1 +1 @@
-9ce39f3b3b0db4661946863cbb8fb073df174410
\ No newline at end of file
+9237df6f97a6ef87cab77de8e53abf457793df9a
\ No newline at end of file
diff --git a/tools/test_framework.py b/tools/test_framework.py
index b328375..1ade73d 100755
--- a/tools/test_framework.py
+++ b/tools/test_framework.py
@@ -32,7 +32,7 @@
'dx.jar')
D8_JAR = os.path.join(utils.REPO_ROOT, 'build', 'libs', 'd8.jar')
GOYT_EXE = os.path.join('third_party', 'goyt',
- 'goyt_160525751')
+ 'goyt_164843480')
FRAMEWORK_JAR = os.path.join('third_party', 'framework',
'framework_160115954.jar')
MIN_SDK_VERSION = '24'
@@ -49,9 +49,10 @@
parser.add_argument('--name',
required = True,
help = 'Results will be printed using the specified benchmark name (e.g.'
- ' <NAME>-<segment>(CodeSize): <bytes>)')
+ ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported'
+ ' with <NAME>-Total(CodeSize)')
parser.add_argument('--print-memoryuse',
- help = 'Prints the line \'<NAME>(MemoryUse):' +
+ help = 'Prints the line \'<NAME>-Total(MemoryUse):' +
' <mem>\' at the end where <mem> is the peak' +
' peak resident set size (VmHWM) in bytes.',
default = False,
@@ -99,7 +100,7 @@
dt = time.time() - t0
if args.print_memoryuse:
- print('{}(MemoryUse): {}'
+ print('{}-Total(MemoryUse): {}'
.format(args.name, utils.grep_memoryuse(track_memory_file)))
dex_files = [f for f in glob(os.path.join(temp_dir, '*.dex'))]