Merge "Inherit useIdentifierNameString from the inlinee."
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 df6cf56..da28ce0 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
@@ -447,6 +447,11 @@
                   method.accessFlags.unsetSynthetic();
                   method.accessFlags.unsetBridge();
                 }
+
+                // Record that the current method uses identifier name string if the inlinee did so.
+                if (target.getOptimizationInfo().useIdentifierNameString()) {
+                  method.markUseIdentifierNameString();
+                }
               }
             }
           }
diff --git a/src/test/examples/adaptclassstrings/keep-rules-1.txt b/src/test/examples/adaptclassstrings/keep-rules-1.txt
index 72562ed..21ab3c8 100644
--- a/src/test/examples/adaptclassstrings/keep-rules-1.txt
+++ b/src/test/examples/adaptclassstrings/keep-rules-1.txt
@@ -9,4 +9,3 @@
 }
 
 -dontshrink
--dontoptimize
diff --git a/src/test/examples/adaptclassstrings/keep-rules-2.txt b/src/test/examples/adaptclassstrings/keep-rules-2.txt
index fc8be9d..b06eebf 100644
--- a/src/test/examples/adaptclassstrings/keep-rules-2.txt
+++ b/src/test/examples/adaptclassstrings/keep-rules-2.txt
@@ -9,6 +9,5 @@
 }
 
 -dontshrink
--dontoptimize
 
 -adaptclassstrings *.*A
diff --git a/src/test/examples/atomicfieldupdater/keep-rules.txt b/src/test/examples/atomicfieldupdater/keep-rules.txt
index 3b2d2ef..44c60f5 100644
--- a/src/test/examples/atomicfieldupdater/keep-rules.txt
+++ b/src/test/examples/atomicfieldupdater/keep-rules.txt
@@ -10,7 +10,6 @@
 -keep,allowobfuscation class atomicfieldupdater.A
 
 -dontshrink
--dontoptimize
 
 # This will be added to CompatProguard by default.
 # We are testing whether R8 shows the same behavior.
diff --git a/src/test/examples/forname/keep-rules.txt b/src/test/examples/forname/keep-rules.txt
index 34a498b..4131646 100644
--- a/src/test/examples/forname/keep-rules.txt
+++ b/src/test/examples/forname/keep-rules.txt
@@ -10,7 +10,6 @@
 -keep,allowobfuscation class forname.A
 
 -dontshrink
--dontoptimize
 
 # This will be added to CompatProguard by default.
 # We are testing whether R8 shows the same behavior.
diff --git a/src/test/examples/getmembers/A.java b/src/test/examples/getmembers/A.java
index 7a231c0..b13a28c 100644
--- a/src/test/examples/getmembers/A.java
+++ b/src/test/examples/getmembers/A.java
@@ -8,4 +8,7 @@
   String bar(String s) {
     return foo + s;
   }
+  public static String baz() {
+    return foo;
+  }
 }
diff --git a/src/test/examples/getmembers/B.java b/src/test/examples/getmembers/B.java
new file mode 100644
index 0000000..d29d0a2
--- /dev/null
+++ b/src/test/examples/getmembers/B.java
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package getmembers;
+
+import java.lang.reflect.Method;
+
+public class B {
+
+  private String toBeInlined() throws Exception {
+    Method baz = A.class.getMethod("baz", (Class[]) null);
+    assert baz != null;
+    String bazResult = (String) baz.invoke(null, null);
+    assert bazResult.startsWith("foo");
+    return bazResult;
+  }
+
+  synchronized static String inliner() throws Exception {
+    B self = new B();
+    return self.toBeInlined();
+  }
+
+}
diff --git a/src/test/examples/getmembers/Main.java b/src/test/examples/getmembers/Main.java
index ee82c05..7d26710 100644
--- a/src/test/examples/getmembers/Main.java
+++ b/src/test/examples/getmembers/Main.java
@@ -12,11 +12,17 @@
     Field foo = a.getDeclaredField("foo");
     assert foo != null;
     assert foo.get(null).equals("foo");
+    System.out.println(foo.get(null));
 
     Method bar = a.getDeclaredMethod("bar", new Class[] { String.class });
     assert bar != null;
     A instanceA = new A();
-    String barResult = (String) bar.invoke(instanceA);
+    String barResult = (String) bar.invoke(instanceA, "bar");
     assert barResult.startsWith("foo");
+    System.out.println(barResult);
+
+    String bazResult = B.inliner();
+    assert bazResult.startsWith("foo");
+    System.out.println(bazResult);
   }
 }
diff --git a/src/test/examples/getmembers/keep-rules.txt b/src/test/examples/getmembers/keep-rules.txt
index 23f8d6c..68c4a5d 100644
--- a/src/test/examples/getmembers/keep-rules.txt
+++ b/src/test/examples/getmembers/keep-rules.txt
@@ -7,10 +7,13 @@
   public static void main(...);
 }
 
--keep,allowobfuscation class getmembers.A
+-keep,allowobfuscation class getmembers.A {
+  <methods>;
+}
 
--dontshrink
--dontoptimize
+-alwaysinline class getmembers.B {
+  private String toBeInlined();
+}
 
 # This will be added to CompatProguard by default.
 # We are testing whether R8 shows the same behavior.
diff --git a/src/test/examples/identifiernamestring/keep-rules-1.txt b/src/test/examples/identifiernamestring/keep-rules-1.txt
index bc18a3f..682999f 100644
--- a/src/test/examples/identifiernamestring/keep-rules-1.txt
+++ b/src/test/examples/identifiernamestring/keep-rules-1.txt
@@ -10,4 +10,3 @@
 -keepnames class identifiernamestring.A
 
 -dontshrink
--dontoptimize
diff --git a/src/test/examples/identifiernamestring/keep-rules-2.txt b/src/test/examples/identifiernamestring/keep-rules-2.txt
index 87584e1..74af143 100644
--- a/src/test/examples/identifiernamestring/keep-rules-2.txt
+++ b/src/test/examples/identifiernamestring/keep-rules-2.txt
@@ -10,7 +10,6 @@
 -keepnames class identifiernamestring.A
 
 -dontshrink
--dontoptimize
 
 -identifiernamestring class * {
   @identifiernamestring.IdentifierNameString *;
diff --git a/src/test/examples/identifiernamestring/keep-rules-3.txt b/src/test/examples/identifiernamestring/keep-rules-3.txt
index 5ac8b93..aa23772 100644
--- a/src/test/examples/identifiernamestring/keep-rules-3.txt
+++ b/src/test/examples/identifiernamestring/keep-rules-3.txt
@@ -10,7 +10,6 @@
 -keepnames class identifiernamestring.A
 
 -dontshrink
--dontoptimize
 
 -identifiernamestring class * {
   static java.lang.reflect.Field *(java.lang.Class, java.lang.String);
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 0d1ca64..fa39257 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -11,6 +11,7 @@
 
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.code.ConstString;
 import com.android.tools.r8.code.ConstStringJumbo;
@@ -18,6 +19,7 @@
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue.DexValueString;
+import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.DexInspector.MethodSubject;
@@ -43,15 +45,12 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class IdentifierMinifierTest {
+public class IdentifierMinifierTest extends TestBase {
 
   private final String appFileName;
   private final List<String> keepRulesFiles;
   private final Consumer<DexInspector> inspection;
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   public IdentifierMinifierTest(
       String test,
       List<String> keepRulesFiles,
@@ -61,30 +60,28 @@
     this.inspection = inspection;
   }
 
+  private AndroidApp processedApp;
+
   @Before
   public void generateR8ProcessedApp() throws Exception {
     Path out = temp.getRoot().toPath();
     R8Command.Builder builder =
         ToolHelper.addProguardConfigurationConsumer(
-                R8Command.builder(),
-                pgConfig -> {
-                  pgConfig.setPrintMapping(true);
-                  pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
-                })
+            R8Command.builder(),
+            pgConfig -> {
+              pgConfig.setPrintMapping(true);
+              pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
+            })
             .setOutput(out, OutputMode.DexIndexed)
             .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
             .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
     ToolHelper.getAppBuilder(builder).addProgramFiles(Paths.get(appFileName));
-    ToolHelper.runR8(builder.build());
+    processedApp = ToolHelper.runR8(builder.build(), o -> o.debug = false);
   }
 
   @Test
   public void identiferMinifierTest() throws Exception {
-    Path out = temp.getRoot().toPath();
-    DexInspector dexInspector =
-        new DexInspector(
-            out.resolve("classes.dex"),
-            out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE).toString());
+    DexInspector dexInspector = new DexInspector(processedApp);
     inspection.accept(dexInspector);
   }
 
@@ -189,6 +186,13 @@
     Set<Instruction> constStringInstructions =
         getRenamedMemberIdentifierConstStrings(a, mainCode.asDexCode().instructions);
     assertEquals(2, constStringInstructions.size());
+
+    ClassSubject b = inspector.clazz("getmembers.B");
+    MethodSubject inliner = b.method("java.lang.String", "inliner", ImmutableList.of());
+    Code inlinerCode = inliner.getMethod().getCode();
+    constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(a, inlinerCode.asDexCode().instructions);
+    assertEquals(1, constStringInstructions.size());
   }
 
   // Without -identifiernamestring
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 62c1bec..b0e1131 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -60,12 +60,13 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        ConstString.class,
+        IputObject.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[1];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof IputObject);
-    assertTrue(code.instructions[3] instanceof ReturnVoid);
   }
 
   @Test
@@ -92,17 +93,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof SgetObject);
-    assertTrue(code.instructions[2] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        SgetObject.class,
+        ConstString.class,
+        InvokeVirtual.class,
+        ConstString.class,
+        IputObject.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeVirtual);
-    assertTrue(code.instructions[4] instanceof ConstString);
     constString = (ConstString) code.instructions[4];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[5] instanceof IputObject);
-    assertTrue(code.instructions[6] instanceof ReturnVoid);
   }
 
   @Test
@@ -131,17 +133,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof SgetObject);
-    assertTrue(code.instructions[2] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        SgetObject.class,
+        ConstString.class,
+        InvokeVirtual.class,
+        ConstString.class,
+        IputObject.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeVirtual);
-    assertTrue(code.instructions[4] instanceof ConstString);
     constString = (ConstString) code.instructions[4];
     assertNotEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[5] instanceof IputObject);
-    assertTrue(code.instructions[6] instanceof ReturnVoid);
   }
 
   @Test
@@ -165,11 +168,12 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        ConstString.class,
+        SputObject.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[0];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[1] instanceof SputObject);
-    assertTrue(code.instructions[2] instanceof ReturnVoid);
   }
 
   @Test
@@ -195,16 +199,17 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof SgetObject);
-    assertTrue(code.instructions[1] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        SgetObject.class,
+        ConstString.class,
+        InvokeVirtual.class,
+        ConstString.class,
+        SputObject.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[1];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof InvokeVirtual);
-    assertTrue(code.instructions[3] instanceof ConstString);
     constString = (ConstString) code.instructions[3];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[4] instanceof SputObject);
-    assertTrue(code.instructions[5] instanceof ReturnVoid);
   }
 
   @Test
@@ -232,16 +237,17 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof SgetObject);
-    assertTrue(code.instructions[1] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        SgetObject.class,
+        ConstString.class,
+        InvokeVirtual.class,
+        ConstString.class,
+        SputObject.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[1];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof InvokeVirtual);
-    assertTrue(code.instructions[3] instanceof ConstString);
     constString = (ConstString) code.instructions[3];
     assertNotEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[4] instanceof SputObject);
-    assertTrue(code.instructions[5] instanceof ReturnVoid);
   }
 
   @Test
@@ -252,8 +258,7 @@
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
-        "-dontshrink",
-        "-dontoptimize");
+        "-dontshrink");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -275,8 +280,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep,allowobfuscation class " + BOO,
-        "-dontshrink",
-        "-dontoptimize");
+        "-dontshrink");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -300,8 +304,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sFieldName; }",
         "-keep class " + CLASS_NAME + " { static java.lang.String sFieldName; }",
         "-keep,allowobfuscation class " + BOO + " { <fields>; }",
-        "-dontshrink",
-        "-dontoptimize");
+        "-dontshrink");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -325,8 +328,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sMethodName; }",
         "-keep class " + CLASS_NAME + " { static java.lang.String sMethodName; }",
         "-keep,allowobfuscation class " + BOO + " { <methods>; }",
-        "-dontshrink",
-        "-dontoptimize");
+        "-dontshrink");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -356,8 +358,7 @@
 
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
-        "-keep class " + CLASS_NAME,
-        "-dontoptimize");
+        "-keep class " + CLASS_NAME);
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -366,15 +367,16 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        ConstString.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[1];
     assertEquals("Mixed/form.Boo", constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof ConstString);
     constString = (ConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeStatic);
-    assertTrue(code.instructions[4] instanceof ReturnVoid);
   }
 
   @Test
@@ -396,8 +398,7 @@
 
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
-        "-keep class " + CLASS_NAME,
-        "-dontoptimize");
+        "-keep class " + CLASS_NAME);
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -406,17 +407,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof SgetObject);
-    assertTrue(code.instructions[2] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        SgetObject.class,
+        ConstString.class,
+        InvokeVirtual.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeVirtual);
-    assertTrue(code.instructions[4] instanceof ConstString);
     constString = (ConstString) code.instructions[4];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[5] instanceof InvokeStatic);
-    assertTrue(code.instructions[6] instanceof ReturnVoid);
   }
 
   @Test
@@ -440,8 +442,7 @@
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME,
-        "-keep,allowobfuscation class " + BOO,
-        "-dontoptimize");
+        "-keep,allowobfuscation class " + BOO);
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -450,17 +451,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof SgetObject);
-    assertTrue(code.instructions[2] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        SgetObject.class,
+        ConstString.class,
+        InvokeVirtual.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeVirtual);
-    assertTrue(code.instructions[4] instanceof ConstString);
     constString = (ConstString) code.instructions[4];
     assertNotEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[5] instanceof InvokeStatic);
-    assertTrue(code.instructions[6] instanceof ReturnVoid);
   }
 
   @Test
@@ -492,8 +494,7 @@
             + "  static java.lang.reflect.Field *(java.lang.Class,java.lang.String);\n"
             + "}",
         "-keep class " + CLASS_NAME,
-        "-keep class R { *; }",
-        "-dontoptimize");
+        "-keep class R { *; }");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -502,13 +503,14 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof ConstClass);
-    assertTrue(code.instructions[2] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        ConstClass.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[2];
     assertEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeStatic);
-    assertTrue(code.instructions[4] instanceof ReturnVoid);
   }
 
   @Test
@@ -540,8 +542,7 @@
             + "  static java.lang.reflect.Field *(java.lang.Class,java.lang.String);\n"
             + "}",
         "-keep class " + CLASS_NAME,
-        "-keep,allowobfuscation class R { *; }",
-        "-dontoptimize");
+        "-keep,allowobfuscation class R { *; }");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -550,13 +551,14 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof ConstClass);
-    assertTrue(code.instructions[2] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        ConstClass.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[2];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeStatic);
-    assertTrue(code.instructions[4] instanceof ReturnVoid);
   }
 
   @Test
@@ -595,8 +597,7 @@
             + "    *(java.lang.Class,java.lang.String,java.lang.Class[]);\n"
             + "}",
         "-keep class " + CLASS_NAME,
-        "-keep class R { *; }",
-        "-dontoptimize");
+        "-keep class R { *; }");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -605,17 +606,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof ConstClass);
-    assertTrue(code.instructions[2] instanceof Const4);
-    assertTrue(code.instructions[3] instanceof NewArray);
-    assertTrue(code.instructions[4] instanceof Const4);
-    assertTrue(code.instructions[5] instanceof AputObject);
-    assertTrue(code.instructions[6] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        ConstClass.class,
+        Const4.class,
+        NewArray.class,
+        Const4.class,
+        AputObject.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[6];
     assertEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[7] instanceof InvokeStatic);
-    assertTrue(code.instructions[8] instanceof ReturnVoid);
   }
 
   @Test
@@ -654,8 +656,7 @@
             + "    *(java.lang.Class,java.lang.String,java.lang.Class[]);\n"
             + "}",
         "-keep class " + CLASS_NAME,
-        "-keep,allowobfuscation class R { *; }",
-        "-dontoptimize");
+        "-keep,allowobfuscation class R { *; }");
     DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -664,17 +665,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof InvokeDirect);
-    assertTrue(code.instructions[1] instanceof ConstClass);
-    assertTrue(code.instructions[2] instanceof Const4);
-    assertTrue(code.instructions[3] instanceof NewArray);
-    assertTrue(code.instructions[4] instanceof Const4);
-    assertTrue(code.instructions[5] instanceof AputObject);
-    assertTrue(code.instructions[6] instanceof ConstString);
+    checkInstructions(code, ImmutableList.of(
+        InvokeDirect.class,
+        ConstClass.class,
+        Const4.class,
+        NewArray.class,
+        Const4.class,
+        AputObject.class,
+        ConstString.class,
+        InvokeStatic.class,
+        ReturnVoid.class));
     ConstString constString = (ConstString) code.instructions[6];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[7] instanceof InvokeStatic);
-    assertTrue(code.instructions[8] instanceof ReturnVoid);
   }
 
   private DexInspector getInspectorAfterRunR8(