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'))]