Remove -forceinline support

Change-Id: I7a330458df785091363c81f1b312424296c6ee68
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 7bf0e38..d36206d 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
@@ -1095,8 +1095,7 @@
 
           if (inlineeMayHaveInvokeMethod && options.applyInliningToInlinee) {
             if (inlineeStack.size() + 1 > options.applyInliningToInlineeMaxDepth
-                && appView.appInfo().hasNoAlwaysInlineMethods()
-                && appView.appInfo().hasNoForceInlineMethods()) {
+                && appView.appInfo().hasNoAlwaysInlineMethods()) {
               continue;
             }
             // Record that we will be inside the inlinee until the next block.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java
index e6b5afe..c6b0aa4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java
@@ -34,9 +34,7 @@
       InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
     DexEncodedMethod targetMethod = target.getDefinition();
     DexMethod targetReference = target.getReference();
-    if (targetMethod.getOptimizationInfo().forceInline()
-        || (appView.appInfo().hasLiveness()
-            && appView.withLiveness().appInfo().isForceInlineMethod(targetReference))) {
+    if (targetMethod.getOptimizationInfo().forceInline()) {
       assert !appView.appInfo().isNeverInlineMethod(targetReference);
       return Reason.FORCE;
     }
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 5ef1b35..4887a27 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -138,8 +138,6 @@
   public final Map<DexMember<?, ?>, ProguardMemberRule> assumedValues;
   /** All methods that should be inlined if possible due to a configuration directive. */
   private final Set<DexMethod> alwaysInline;
-  /** All methods that *must* be inlined due to a configuration directive (testing only). */
-  private final Set<DexMethod> forceInline;
   /** All methods that *must* never be inlined due to a configuration directive (testing only). */
   private final Set<DexMethod> neverInline;
   /**
@@ -218,7 +216,6 @@
       Map<DexMember<?, ?>, ProguardMemberRule> noSideEffects,
       Map<DexMember<?, ?>, ProguardMemberRule> assumedValues,
       Set<DexMethod> alwaysInline,
-      Set<DexMethod> forceInline,
       Set<DexMethod> neverInline,
       Set<DexMethod> neverInlineDueToSingleCaller,
       Set<DexMethod> whyAreYouNotInlining,
@@ -256,7 +253,6 @@
     this.assumedValues = assumedValues;
     this.callSites = callSites;
     this.alwaysInline = alwaysInline;
-    this.forceInline = forceInline;
     this.neverInline = neverInline;
     this.neverInlineDueToSingleCaller = neverInlineDueToSingleCaller;
     this.whyAreYouNotInlining = whyAreYouNotInlining;
@@ -302,7 +298,6 @@
         previous.noSideEffects,
         previous.assumedValues,
         previous.alwaysInline,
-        previous.forceInline,
         previous.neverInline,
         previous.neverInlineDueToSingleCaller,
         previous.whyAreYouNotInlining,
@@ -349,7 +344,6 @@
         previous.noSideEffects,
         previous.assumedValues,
         previous.alwaysInline,
-        previous.forceInline,
         previous.neverInline,
         previous.neverInlineDueToSingleCaller,
         previous.whyAreYouNotInlining,
@@ -404,7 +398,6 @@
         noSideEffects,
         assumedValues,
         alwaysInline,
-        forceInline,
         neverInline,
         neverInlineDueToSingleCaller,
         whyAreYouNotInlining,
@@ -487,7 +480,6 @@
     this.assumedValues = previous.assumedValues;
     this.callSites = previous.callSites;
     this.alwaysInline = previous.alwaysInline;
-    this.forceInline = previous.forceInline;
     this.neverInline = previous.neverInline;
     this.neverInlineDueToSingleCaller = previous.neverInlineDueToSingleCaller;
     this.whyAreYouNotInlining = previous.whyAreYouNotInlining;
@@ -619,14 +611,6 @@
     return alwaysInline.isEmpty();
   }
 
-  public boolean isForceInlineMethod(DexMethod method) {
-    return forceInline.contains(method);
-  }
-
-  public boolean hasNoForceInlineMethods() {
-    return forceInline.isEmpty();
-  }
-
   public boolean isNeverInlineMethod(DexMethod method) {
     return neverInline.contains(method);
   }
@@ -1108,7 +1092,6 @@
         lens.rewriteReferenceKeys(noSideEffects, rules -> null),
         lens.rewriteReferenceKeys(assumedValues, rules -> null),
         lens.rewriteMethods(alwaysInline),
-        lens.rewriteMethods(forceInline),
         lens.rewriteMethods(neverInline),
         lens.rewriteMethods(neverInlineDueToSingleCaller),
         lens.rewriteMethods(whyAreYouNotInlining),
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 52d59bb..28c2602 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3727,7 +3727,6 @@
             rootSet.noSideEffects,
             rootSet.assumedValues,
             amendWithCompanionMethods(rootSet.alwaysInline),
-            amendWithCompanionMethods(rootSet.forceInline),
             amendWithCompanionMethods(rootSet.neverInline),
             amendWithCompanionMethods(rootSet.neverInlineDueToSingleCaller),
             amendWithCompanionMethods(rootSet.whyAreYouNotInlining),
diff --git a/src/main/java/com/android/tools/r8/shaking/InlineRule.java b/src/main/java/com/android/tools/r8/shaking/InlineRule.java
index 32412d7..7f77fab 100644
--- a/src/main/java/com/android/tools/r8/shaking/InlineRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/InlineRule.java
@@ -10,16 +10,8 @@
 
 public class InlineRule extends ProguardConfigurationRule {
 
-  public static final Origin checkDiscardOrigin = new Origin(Origin.root()) {
-    @Override
-    public String part() {
-      return "<SYNTHETIC_CHECK_DISCARD_RULE>";
-    }
-  };
-
   public enum Type {
     ALWAYS,
-    FORCE,
     NEVER,
     NEVER_SINGLE_CALLER
   }
@@ -104,30 +96,11 @@
     return type;
   }
 
-  public ProguardCheckDiscardRule asProguardCheckDiscardRule() {
-    assert type == Type.FORCE;
-    ProguardCheckDiscardRule.Builder builder = ProguardCheckDiscardRule.builder();
-    builder.setOrigin(checkDiscardOrigin);
-    builder.setSource(null);
-    builder.addClassAnnotations(getClassAnnotations());
-    builder.setClassAccessFlags(getClassAccessFlags());
-    builder.setNegatedClassAccessFlags(getNegatedClassAccessFlags());
-    builder.setClassTypeNegated(getClassTypeNegated());
-    builder.setClassType(getClassType());
-    builder.setClassNames(getClassNames());
-    builder.addInheritanceAnnotations(getInheritanceAnnotations());
-    builder.setInheritanceIsExtends(getInheritanceIsExtends());
-    builder.setMemberRules(getMemberRules());
-    return builder.build();
-  }
-
   @Override
   String typeString() {
     switch (type) {
       case ALWAYS:
         return "alwaysinline";
-      case FORCE:
-        return "forceinline";
       case NEVER:
         return "neverinline";
       case NEVER_SINGLE_CALLER:
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 3072667..99da4fb 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -432,7 +432,7 @@
         String devMessage = "";
         if (Version.isDevelopmentVersion()
             && unknownOption != null
-            && (unknownOption.equals("forceinline") || unknownOption.equals("neverinline"))) {
+            && unknownOption.equals("neverinline")) {
           devMessage = ", this option needs to be turned on explicitly if used for tests.";
         }
         throw unknownOption(unknownOption, optionStart, devMessage);
@@ -449,14 +449,6 @@
           configurationBuilder.addRule(rule);
           return true;
         }
-        if (acceptString("forceinline")) {
-          InlineRule rule = parseInlineRule(InlineRule.Type.FORCE, optionStart);
-          configurationBuilder.addRule(rule);
-          // Insert a matching -checkdiscard rule to ensure force inlining happens.
-          ProguardCheckDiscardRule ruled = rule.asProguardCheckDiscardRule();
-          configurationBuilder.addRule(ruled);
-          return true;
-        }
         if (acceptString("keepconstantarguments")) {
           ConstantArgumentRule rule = parseConstantArgumentRule(optionStart);
           configurationBuilder.addRule(rule);
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index bbe1773..c4ddd9f 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -106,7 +106,6 @@
     private final LinkedHashMap<DexReference, DexReference> reasonAsked = new LinkedHashMap<>();
     private final LinkedHashMap<DexReference, DexReference> checkDiscarded = new LinkedHashMap<>();
     private final Set<DexMethod> alwaysInline = Sets.newIdentityHashSet();
-    private final Set<DexMethod> forceInline = Sets.newIdentityHashSet();
     private final Set<DexMethod> neverInline = Sets.newIdentityHashSet();
     private final Set<DexMethod> neverInlineDueToSingleCaller = Sets.newIdentityHashSet();
     private final Set<DexMethod> bypassClinitforInlining = Sets.newIdentityHashSet();
@@ -368,14 +367,12 @@
             bypassClinitforInlining);
       }
       assert Sets.intersection(neverInline, alwaysInline).isEmpty()
-              && Sets.intersection(neverInline, forceInline).isEmpty()
-          : "A method cannot be marked as both -neverinline and -forceinline/-alwaysinline.";
+          : "A method cannot be marked as both -neverinline and -alwaysinline.";
       return new RootSet(
           dependentMinimumKeepInfo,
           ImmutableList.copyOf(reasonAsked.values()),
           ImmutableList.copyOf(checkDiscarded.values()),
           alwaysInline,
-          forceInline,
           neverInline,
           neverInlineDueToSingleCaller,
           bypassClinitforInlining,
@@ -1193,9 +1190,6 @@
             case ALWAYS:
               alwaysInline.add(reference);
               break;
-            case FORCE:
-              forceInline.add(reference);
-              break;
             case NEVER:
               neverInline.add(reference);
               break;
@@ -1561,7 +1555,6 @@
     public final ImmutableList<DexReference> reasonAsked;
     public final ImmutableList<DexReference> checkDiscarded;
     public final Set<DexMethod> alwaysInline;
-    public final Set<DexMethod> forceInline;
     public final Set<DexMethod> bypassClinitForInlining;
     public final Set<DexMethod> whyAreYouNotInlining;
     public final Set<DexMethod> keepConstantArguments;
@@ -1584,7 +1577,6 @@
         ImmutableList<DexReference> reasonAsked,
         ImmutableList<DexReference> checkDiscarded,
         Set<DexMethod> alwaysInline,
-        Set<DexMethod> forceInline,
         Set<DexMethod> neverInline,
         Set<DexMethod> neverInlineDueToSingleCaller,
         Set<DexMethod> bypassClinitForInlining,
@@ -1618,7 +1610,6 @@
       this.reasonAsked = reasonAsked;
       this.checkDiscarded = checkDiscarded;
       this.alwaysInline = alwaysInline;
-      this.forceInline = forceInline;
       this.bypassClinitForInlining = bypassClinitForInlining;
       this.whyAreYouNotInlining = whyAreYouNotInlining;
       this.keepConstantArguments = keepConstantArguments;
@@ -1995,7 +1986,6 @@
           Collections.emptySet(),
           Collections.emptySet(),
           Collections.emptySet(),
-          Collections.emptySet(),
           PredicateSet.empty(),
           Collections.emptySet(),
           Collections.emptySet(),
diff --git a/src/test/java/com/android/tools/r8/ForceInline.java b/src/test/java/com/android/tools/r8/ForceInline.java
deleted file mode 100644
index dfeace7..0000000
--- a/src/test/java/com/android/tools/r8/ForceInline.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 com.android.tools.r8;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD})
-public @interface ForceInline {}
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index d245c58..2233484 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -405,16 +405,6 @@
         "-neverinline class * { @" + annotationPackageName + ".NeverInline *; }");
   }
 
-  public T enableForceInliningAnnotations() {
-    return addForceInliningAnnotations()
-        .enableForceInliningAnnotations(ForceInline.class.getPackage().getName());
-  }
-
-  public T enableForceInliningAnnotations(String annotationPackageName) {
-    return addInternalKeepRules(
-        "-forceinline class * { @" + annotationPackageName + ".ForceInline *; }");
-  }
-
   public T enableNeverSingleCallerInlineAnnotations() {
     return addNeverSingleCallerInlineAnnotations()
         .addInternalKeepRules(
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 1fda6a4..9e5005a 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -1153,9 +1153,7 @@
    * specified class and add rules to inline methods with the inlining annotation.
    */
   public static String keepMainProguardConfigurationWithInliningAnnotation(Class<?> clazz) {
-    return "-forceinline class * { @com.android.tools.r8.ForceInline *; }"
-        + System.lineSeparator()
-        + "-neverinline class * { @com.android.tools.r8.NeverInline *; }"
+    return "-neverinline class * { @com.android.tools.r8.NeverInline *; }"
         + System.lineSeparator()
         + keepMainProguardConfiguration(clazz);
   }
diff --git a/src/test/java/com/android/tools/r8/TestBuilder.java b/src/test/java/com/android/tools/r8/TestBuilder.java
index 656955e..aec53db 100644
--- a/src/test/java/com/android/tools/r8/TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestBuilder.java
@@ -190,7 +190,6 @@
     return ImmutableList.of(
         AlwaysInline.class,
         AssumeMayHaveSideEffects.class,
-        ForceInline.class,
         KeepConstantArguments.class,
         KeepUnusedArguments.class,
         NeverClassInline.class,
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
index fe6cc31..4004a47 100644
--- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -395,10 +395,6 @@
     return addTestingAnnotation(KeepConstantArguments.class);
   }
 
-  public final T addForceInliningAnnotations() {
-    return addTestingAnnotation(ForceInline.class);
-  }
-
   public final T addInliningAnnotations() {
     return addTestingAnnotation(NeverInline.class);
   }
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index 3b35a12..8f4273f 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -635,13 +635,14 @@
                 .addKeepRules(
                     getProguardConfig(
                         EXAMPLE_KEEP,
-                        "-forceinline class classmerging.ProguardMethodMapTest$A { public void"
+                        "-alwaysinline class classmerging.ProguardMethodMapTest$A { public void"
                             + " method(); }"))
                 .addOptionsModification(this::configure)
                 .addOptionsModification(
                     options -> {
                       options.enableVerticalClassMerging = false;
-                      options.testing.validInliningReasons = ImmutableSet.of(Reason.FORCE);
+                      options.testing.validInliningReasons =
+                          ImmutableSet.of(Reason.ALWAYS, Reason.FORCE);
                     })
                 .allowUnusedProguardConfigurationRules(),
             main,
@@ -675,12 +676,13 @@
                 .addKeepRules(
                     getProguardConfig(
                         EXAMPLE_KEEP,
-                        "-forceinline class classmerging.ProguardMethodMapTest$A { public void"
+                        "-alwaysinline class classmerging.ProguardMethodMapTest$A { public void"
                             + " method(); }"))
                 .addOptionsModification(this::configure)
                 .addOptionsModification(
                     options -> {
-                      options.testing.validInliningReasons = ImmutableSet.of(Reason.FORCE);
+                      options.testing.validInliningReasons =
+                          ImmutableSet.of(Reason.ALWAYS, Reason.FORCE);
                     })
                 .allowUnusedProguardConfigurationRules(),
             main,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java
index 19d7226..3d3db4a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
@@ -42,7 +42,6 @@
       System.out.print(" -> " + exitCode);
     }
 
-    @ForceInline
     private static int foo() {
       try {
         bar();
@@ -86,7 +85,6 @@
         testForR8(backend)
             .addInnerClasses(SubsumedCatchHandlerTest.class)
             .addKeepMainRule(TestClass.class)
-            .enableForceInliningAnnotations()
             .enableInliningAnnotations()
             .run(TestClass.class)
             .assertSuccessWithOutput(expected)
@@ -118,5 +116,7 @@
       DexType guard = handler.guards.get(0);
       assertEquals("java.lang.Exception", guard.toSourceString());
     }
+
+    assertThat(classSubject.uniqueMethodWithName("foo"), isAbsent());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
index 74b2a56..db81629 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
@@ -4,11 +4,13 @@
 
 package com.android.tools.r8.ir.optimize.inliner;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
 
-import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
@@ -20,16 +22,12 @@
 import com.android.tools.r8.ir.optimize.inliner.interfaces.InterfaceTargetsTestClass.IfaceD;
 import com.android.tools.r8.ir.optimize.inliner.interfaces.InterfaceTargetsTestClass.IfaceNoImpl;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
-import java.util.Collections;
-import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.junit.Test;
@@ -52,31 +50,33 @@
 
   @Test
   public void testExceptionHandling() throws Exception {
-    String className = ExceptionHandlingTestClass.class.getName();
-    AndroidApp inputApp = readClasses(ExceptionHandlingTestClass.class);
-    List<String> proguardConfig =
-        ImmutableList.of(
-            "-keep public class " + className + "{",
-            "  public static void main(...);",
-            "}",
-            "-forceinline public class " + className + "{",
-            "  private static void inlinee*(...);",
-            "}",
-            "-neverinline public class " + className + "{",
-            "  private static void *Test(...);",
-            "}");
-    R8Command.Builder commandBuilder =
-        ToolHelper.prepareR8CommandBuilder(inputApp, emptyConsumer(backend))
-            .addProguardConfiguration(proguardConfig, Origin.unknown())
-            .addLibraryFiles(runtimeJar(backend));
-    ToolHelper.allowTestProguardOptions(commandBuilder);
-    AndroidApp outputApp = ToolHelper.runR8(commandBuilder.build(), this::configure);
-    assert backend == Backend.DEX || backend == Backend.CF;
-    assertEquals(
-        runOnJava(ExceptionHandlingTestClass.class),
-        backend == Backend.DEX
-            ? runOnArt(outputApp, className)
-            : runOnJava(outputApp, className, Collections.emptyList()));
+    testForR8(backend)
+        .addProgramClasses(ExceptionHandlingTestClass.class)
+        .addKeepMainRule(ExceptionHandlingTestClass.class)
+        .addOptionsModification(this::configure)
+        .enableInliningAnnotations()
+        .compile()
+        .inspect(
+            inspector -> {
+              ClassSubject mainClassSubject = inspector.clazz(ExceptionHandlingTestClass.class);
+              assertThat(mainClassSubject, isPresent());
+              assertThat(
+                  mainClassSubject.uniqueMethodWithName("inlineeWithNormalExitThatDoesNotThrow"),
+                  isAbsent());
+              assertThat(
+                  mainClassSubject.uniqueMethodWithName("inlineeWithNormalExitThatThrows"),
+                  isAbsent());
+              assertThat(
+                  mainClassSubject.uniqueMethodWithName("inlineeWithoutNormalExit"), isAbsent());
+            })
+        .run(ExceptionHandlingTestClass.class)
+        .assertSuccessWithOutputLines(
+            "Test succeeded: methodWithoutCatchHandlersTest(1)",
+            "Test succeeded: methodWithoutCatchHandlersTest(2)",
+            "Test succeeded: methodWithoutCatchHandlersTest(3)",
+            "Test succeeded: methodWithCatchHandlersTest(1)",
+            "Test succeeded: methodWithCatchHandlersTest(2)",
+            "Test succeeded: methodWithCatchHandlersTest(3)");
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
index 75679e5..dc74e0f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
@@ -54,10 +54,8 @@
             .addInnerClasses(InliningIntoVisibilityBridgeTest.class)
             .addInnerClasses(InliningIntoVisibilityBridgeTestClasses.class)
             .addKeepMainRule(TestClass.class)
-            .addForceInliningAnnotations()
             .addInliningAnnotations()
             .applyIf(neverInline, R8TestBuilder::enableInliningAnnotations)
-            .applyIf(!neverInline, R8TestBuilder::enableForceInliningAnnotations)
             .enableNoVerticalClassMergingAnnotations()
             .enableProguardTestOptions()
             .setMinApi(parameters.getApiLevel())
@@ -93,13 +91,11 @@
   static class TestClass {
 
     public static void main(String[] args) {
-      InliningIntoVisibilityBridgeTestClassC obj = new InliningIntoVisibilityBridgeTestClassC();
-
       // Invoke method three times to prevent the synthetic bridge on InliningIntoVisibilityBridge-
       // TestClassB from being inlined.
-      obj.method();
-      obj.method();
-      obj.method();
+      InliningIntoVisibilityBridgeTestClassC.method();
+      InliningIntoVisibilityBridgeTestClassC.method();
+      InliningIntoVisibilityBridgeTestClassC.method();
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/exceptionhandling/ExceptionHandlingTestClass.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/exceptionhandling/ExceptionHandlingTestClass.java
index cda0856..a23b775 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/exceptionhandling/ExceptionHandlingTestClass.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/exceptionhandling/ExceptionHandlingTestClass.java
@@ -4,11 +4,12 @@
 
 package com.android.tools.r8.ir.optimize.inliner.exceptionhandling;
 
+import com.android.tools.r8.NeverInline;
+
 public class ExceptionHandlingTestClass {
 
   private static boolean FALSE;
 
-  // -keep
   public static void main(String[] args) {
     FALSE = args == null;
     try {
@@ -33,7 +34,7 @@
     methodWithCatchHandlersTest();
   }
 
-  // -neverinline
+  @NeverInline
   private static void methodWithoutCatchHandlersTest(int i) {
     switch (i) {
       case 1:
@@ -50,7 +51,7 @@
     }
   }
 
-  // -neverinline
+  @NeverInline
   private static void methodWithCatchHandlersTest() {
     try {
       inlineeWithNormalExitThatDoesNotThrow();
@@ -70,21 +71,18 @@
     }
   }
 
-  // -forceinline
   private static void inlineeWithNormalExitThatDoesNotThrow() {
     if (FALSE) {
       throw new RuntimeException();
     }
   }
 
-  // -forceinline
   private static void inlineeWithNormalExitThatThrows() {
     if (!FALSE) {
       throw new RuntimeException();
     }
   }
 
-  // -forceinline
   private static void inlineeWithoutNormalExit() {
     throw new RuntimeException();
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java
index 54018ee..e856133 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.ir.optimize.inliner.testclasses;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoVerticalClassMerging;
 
@@ -17,7 +16,6 @@
   @NoVerticalClassMerging
   static class InliningIntoVisibilityBridgeTestClassA {
 
-    @ForceInline
     @NeverInline
     public static void method() {
       System.out.println("Hello world");
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java
index 000f5d4..3f0c8d6 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java
@@ -4,16 +4,15 @@
 package com.android.tools.r8.ir.optimize.reflection;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.onlyIf;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoHorizontalClassMerging;
-import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
@@ -23,7 +22,6 @@
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
-import java.util.concurrent.Callable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -39,17 +37,15 @@
   static class EffectivelyFinal {}
 
   @NoHorizontalClassMerging
-  static class Reflection implements Callable<Class<?>> {
+  static class Reflection {
 
-    @ForceInline
-    @Override
     public Class<?> call() {
       return getClass();
     }
   }
 
   @NoHorizontalClassMerging
-  static class GetClassTestMain implements Callable<Class<?>> {
+  static class GetClassTestMain {
 
     @NeverInline
     static Class<?> getMainClass(GetClassTestMain instance) {
@@ -58,7 +54,6 @@
     }
 
     @NeverInline
-    @Override
     public Class<?> call() {
       // Non-null `this` pointer.
       return getClass();
@@ -180,6 +175,11 @@
     assertEquals(expectedGetClassCount, countGetClass(mainMethod));
     assertEquals(expectedConstClassCount, countConstClass(mainMethod));
 
+    ClassSubject reflectionClass = codeInspector.clazz(Reflection.class);
+    assertThat(reflectionClass, isPresent());
+    assertThat(
+        reflectionClass.uniqueMethodWithName("call"), onlyIf(expectCallPresent, isPresent()));
+
     ClassSubject getterClass = codeInspector.clazz(GetClassTestMain.class);
     MethodSubject getMainClass = getterClass.uniqueMethodWithName("getMainClass");
     assertThat(getMainClass, isPresent());
@@ -219,8 +219,6 @@
     testForR8(parameters.getBackend())
         .setMode(mode)
         .addInnerClasses(GetClassTest.class)
-        .addForceInliningAnnotations()
-        .applyIf(mode == CompilationMode.RELEASE, R8TestBuilder::enableForceInliningAnnotations)
         .enableInliningAnnotations()
         .enableNoHorizontalClassMergingAnnotations()
         .addKeepMainRule(MAIN)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetNameTest.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetNameTest.java
index f5d0eb9..9b3b394 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetNameTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetNameTest.java
@@ -4,12 +4,14 @@
 package com.android.tools.r8.ir.optimize.reflection;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.D8TestRunResult;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
@@ -17,11 +19,11 @@
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collection;
-import org.junit.Ignore;
 import org.junit.Test;
 
 class GetName0Class {
@@ -32,7 +34,6 @@
     void foo();
   }
 
-  @ForceInline
   static Itf createRunnable() {
     return new Itf() {
       @Override
@@ -42,7 +43,6 @@
     };
   }
 
-  @ForceInline
   static GetName0Class factory() {
     return new GetName0Class() {
       @Override
@@ -212,7 +212,6 @@
     builder.addAll(ToolHelper.getClassFilesForTestDirectory(
         ToolHelper.getPackageDirectoryForTestPackage(MAIN.getPackage()),
         path -> path.getFileName().toString().startsWith("GetName0")));
-    builder.add(ToolHelper.getClassFileForTestClass(ForceInline.class));
     classPaths = builder.build();
   }
 
@@ -263,7 +262,6 @@
   }
 
   @Test
-  @Ignore("b/154813140: Invalidly assumes that getClass on kept classes can be optimized")
   public void testR8_pinning() throws Exception {
     // Pinning the test class.
     R8TestRunResult result =
@@ -276,13 +274,21 @@
             .minification(enableMinification)
             .setMinApi(parameters.getApiLevel())
             .addOptionsModification(this::configure)
+            .compile()
+            .inspect(
+                inspector -> {
+                  ClassSubject getName0ClassSubject = inspector.clazz(GetName0Class.class);
+                  assertThat(getName0ClassSubject, isPresent());
+                  assertTrue(
+                      getName0ClassSubject.allMethods(FoundMethodSubject::isStatic).isEmpty());
+                })
             .run(parameters.getRuntime(), MAIN)
-            .assertSuccessWithOutput(JAVA_OUTPUT);
-    test(result, 2);
+            // TODO(b/154813140): Invalidly assumes that getClass on kept classes can be optimized.
+            .assertSuccessWithOutputThatMatches(not(equalTo(JAVA_OUTPUT)));
+    test(result, 8);
   }
 
   @Test
-  @Ignore("b/154813140: Invalidly assumes that getClass on kept classes can be optimized")
   public void testR8_shallow_pinning() throws Exception {
     // Shallow pinning the test class.
     R8TestRunResult result =
@@ -295,13 +301,21 @@
             .minification(enableMinification)
             .setMinApi(parameters.getApiLevel())
             .addOptionsModification(this::configure)
+            .compile()
+            .inspect(
+                inspector -> {
+                  ClassSubject getName0ClassSubject = inspector.clazz(GetName0Class.class);
+                  assertThat(getName0ClassSubject, isPresent());
+                  assertTrue(
+                      getName0ClassSubject.allMethods(FoundMethodSubject::isStatic).isEmpty());
+                })
             .run(parameters.getRuntime(), MAIN);
+    // TODO(b/154813140): Invalidly assumes that getClass on kept classes can be optimized.
     if (enableMinification) {
-      result.assertSuccessWithOutput(RENAMED_OUTPUT);
+      result.assertSuccessWithOutputThatMatches(not(equalTo(RENAMED_OUTPUT)));
     } else {
-      result.assertSuccessWithOutput(JAVA_OUTPUT);
+      result.assertSuccessWithOutputThatMatches(not(equalTo(JAVA_OUTPUT)));
     }
-    test(result, 2);
+    test(result, 8);
   }
-
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java
index 102d5c7..a6d3931 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java
@@ -3,17 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize.reflection;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.D8TestRunResult;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ir.optimize.reflection.Outer.TestHelper;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -100,7 +101,6 @@
       this.inner = inner;
     }
 
-    @ForceInline
     String getClassName() {
       return inner.getClass().getSimpleName();
     }
@@ -159,12 +159,18 @@
         .assertSuccessWithOutput(JVM_OUTPUT);
   }
 
-  private void test(SingleTestRunResult<?> result) throws Exception {
+  private void test(SingleTestRunResult<?> result, boolean isOptimizing) throws Exception {
     CodeInspector codeInspector = result.inspector();
     ClassSubject mainClass = codeInspector.clazz(MAIN);
     MethodSubject mainMethod = mainClass.mainMethod();
     assertThat(mainMethod, isPresent());
     assertEquals(0, countGetName(mainMethod));
+
+    if (isOptimizing) {
+      ClassSubject testHelperClassSubject = codeInspector.clazz(TestHelper.class);
+      assertThat(testHelperClassSubject, isPresent());
+      assertThat(testHelperClassSubject.uniqueMethodWithName("getClassName"), isAbsent());
+    }
   }
 
   @Test
@@ -179,7 +185,7 @@
             .addOptionsModification(this::configure)
             .run(parameters.getRuntime(), MAIN)
             .assertSuccessWithOutput(JVM_OUTPUT);
-    test(result);
+    test(result, false);
 
     result =
         testForD8()
@@ -189,7 +195,7 @@
             .addOptionsModification(this::configure)
             .run(parameters.getRuntime(), MAIN)
             .assertSuccessWithOutput(JVM_OUTPUT);
-    test(result);
+    test(result, false);
   }
 
   @Test
@@ -197,7 +203,6 @@
     // Pinning the test class.
     testForR8(parameters.getBackend())
         .addProgramFiles(classPaths)
-        .addForceInliningAnnotations()
         .enableInliningAnnotations()
         .addKeepAllClassesRule()
         .addKeepAttributeInnerClassesAndEnclosingMethod()
@@ -206,7 +211,7 @@
         .addOptionsModification(this::configure)
         .run(parameters.getRuntime(), MAIN)
         .assertSuccessWithOutput(JVM_OUTPUT)
-        .apply(this::test);
+        .apply(result -> test(result, false));
   }
 
   @Test
@@ -214,7 +219,6 @@
     // Pinning the test class.
     testForR8(parameters.getBackend())
         .addProgramFiles(classPaths)
-        .enableForceInliningAnnotations()
         .enableInliningAnnotations()
         .addKeepMainRule(MAIN)
         .addKeepRules("-keep class **.ClassGetSimpleName*")
@@ -225,7 +229,7 @@
         .addOptionsModification(this::configure)
         .run(parameters.getRuntime(), MAIN)
         .assertSuccessWithOutput(OUTPUT_NO_ATTRIBUTES)
-        .apply(this::test);
+        .apply(result -> test(result, true));
   }
 
   @Test
@@ -233,7 +237,6 @@
     // Shallow pinning the test class.
     testForR8(parameters.getBackend())
         .addProgramFiles(classPaths)
-        .enableForceInliningAnnotations()
         .enableInliningAnnotations()
         .addKeepMainRule(MAIN)
         .addKeepRules("-keep,allowobfuscation class **.ClassGetSimpleName*")
@@ -249,6 +252,6 @@
         .applyIf(enableMinification, result -> result.assertSuccessWithOutput(RENAMED_OUTPUT))
         .applyIf(
             !enableMinification, result -> result.assertSuccessWithOutput(OUTPUT_NO_ATTRIBUTES))
-        .apply(this::test);
+        .apply(result -> test(result, true));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/NestedStringBuilderTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/NestedStringBuilderTest.java
index 38ddc76..65d51c3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/NestedStringBuilderTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/NestedStringBuilderTest.java
@@ -6,7 +6,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -39,20 +38,21 @@
 
     testForR8(parameters.getBackend())
         .addProgramClasses(MAIN)
-        .enableForceInliningAnnotations()
         .addKeepMainRule(MAIN)
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), MAIN.getTypeName(), "$")
         .assertSuccessWithOutput(EXPECTED)
-        .inspect(codeInspector -> {
-          ClassSubject mainClass = codeInspector.clazz(MAIN);
-          MethodSubject main = mainClass.mainMethod();
-          assertEquals(
-              // TODO(b/113859361): should be 1 after merging StringBuilder's
-              2,
-              main.streamInstructions().filter(
-                  i -> i.isNewInstance(StringBuilder.class.getTypeName())).count());
-          });
+        .inspect(
+            codeInspector -> {
+              ClassSubject mainClass = codeInspector.clazz(MAIN);
+              MethodSubject main = mainClass.uniqueMethod();
+              assertEquals(
+                  // TODO(b/113859361): should be 1 after merging StringBuilder's
+                  2,
+                  main.streamInstructions()
+                      .filter(i -> i.isNewInstance(StringBuilder.class.getTypeName()))
+                      .count());
+            });
   }
 
   static class NestedStringBuilders {
@@ -61,7 +61,6 @@
       System.out.println(concat("one", args[0]) + "two");
     }
 
-    @ForceInline
     public static String concat(String one, String two) {
       return one + two;
     }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthTest.java
index 7924a77..b2927fb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthTest.java
@@ -9,7 +9,6 @@
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.D8TestRunResult;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.SingleTestRunResult;
@@ -96,7 +95,6 @@
     R8TestRunResult result =
         testForR8(parameters.getBackend())
             .addProgramClasses(MAIN)
-            .enableForceInliningAnnotations()
             .enableInliningAnnotations()
             .addKeepMainRule(MAIN)
             .setMinApi(parameters.getApiLevel())
@@ -107,7 +105,6 @@
 
   public static class TestClass {
 
-    @ForceInline
     static String simpleInlineable() {
       return "Shared";
     }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java
index 01ac9dc..3861a06 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize.string;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NeverPropagateValue;
 import com.android.tools.r8.SingleTestRunResult;
@@ -45,7 +45,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withAllRuntimes().build();
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
   }
 
   private final TestParameters parameters;
@@ -111,13 +111,19 @@
     SingleTestRunResult<?> result =
         testForR8(parameters.getBackend())
             .addProgramClassesAndInnerClasses(MAIN)
-            .enableForceInliningAnnotations()
             .enableInliningAnnotations()
             .enableMemberValuePropagationAnnotations()
             .addKeepMainRule(MAIN)
-            .setMinApi(parameters.getRuntime())
+            .setMinApi(parameters.getApiLevel())
             .noMinification()
             .addOptionsModification(this::configure)
+            .compile()
+            .inspect(
+                inspector -> {
+                  ClassSubject fooClassSubject = inspector.clazz(Foo.class);
+                  assertThat(fooClassSubject, isPresent());
+                  assertThat(fooClassSubject.uniqueMethodWithName("getter"), isAbsent());
+                })
             .run(parameters.getRuntime(), MAIN)
             .assertSuccessWithOutput(JAVA_OUTPUT);
     test(result, true, true);
@@ -155,7 +161,6 @@
     }
 
     static class Foo implements Itf {
-      @ForceInline
       @Override
       public String getter() {
         return String.valueOf(getClass().getName());
diff --git a/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java b/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
index 19e75b3..76e19f6 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
@@ -4,11 +4,10 @@
 
 package com.android.tools.r8.maindexlist.warnings;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -16,7 +15,6 @@
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
-import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -45,8 +43,8 @@
   }
 
   private void classStaticGone(CodeInspector inspector) {
-    assertThat(inspector.clazz(Static.class), CoreMatchers.not(isPresent()));
-    assertThat(inspector.clazz(Static2.class), CoreMatchers.not(isPresent()));
+    assertThat(inspector.clazz(Static.class), isAbsent());
+    assertThat(inspector.clazz(Static2.class), isAbsent());
   }
 
   @Test
@@ -57,7 +55,6 @@
         .addKeepMainRule(mainClass)
         // Include main dex rule for class Static.
         .addMainDexKeepClassRules(Main.class, Static.class)
-        .enableForceInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::classStaticGone)
@@ -74,7 +71,6 @@
         // Include explicit main dex entry for class Static.
         .addMainDexListClasses(Static.class)
         .allowDiagnosticWarningMessages()
-        .enableForceInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::classStaticGone)
@@ -96,7 +92,6 @@
         .addMainDexKeepClassRules(Static2.class)
         .addDontWarn(Static.class)
         .allowDiagnosticWarningMessages()
-        .enableForceInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::classStaticGone)
@@ -116,14 +111,12 @@
 }
 
 class Static {
-  @ForceInline
   public static int m() {
     return 1;
   }
 }
 
 class Static2 {
-  @ForceInline
   public static int m() {
     return 1;
   }
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
index 61387ea..eaac9ca 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -4,11 +4,14 @@
 
 package com.android.tools.r8.movestringconstants;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static junit.framework.TestCase.assertEquals;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.AlwaysInline;
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
@@ -41,21 +44,20 @@
 
   private void runTest(Consumer<CodeInspector> inspection) throws Exception {
     R8Command.Builder builder = R8Command.builder();
-    builder.addProgramFiles(ToolHelper.getClassFileForTestClass(ForceInline.class));
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(NeverInline.class));
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(Utils.class));
+    builder.addProgramFiles(ToolHelper.getClassFileForTestClass(AlwaysInline.class));
     builder.addLibraryFiles(runtimeJar(backend));
     builder.setProgramConsumer(emptyConsumer(backend));
     builder.setMode(CompilationMode.RELEASE);
     builder.addProguardConfiguration(
         ImmutableList.of(
-            "-forceinline class * { @com.android.tools.r8.ForceInline *; }",
+            "-alwaysinline class * { @com.android.tools.r8.AlwaysInline *; }",
             "-neverinline class * { @com.android.tools.r8.NeverInline *; }",
             "-keep class " + TestClass.class.getCanonicalName() + "{ *; }",
             "-dontobfuscate",
-            "-allowaccessmodification"
-        ),
+            "-allowaccessmodification"),
         Origin.unknown());
     ToolHelper.allowTestProguardOptions(builder);
     AndroidApp app = ToolHelper.runR8(builder.build());
@@ -125,6 +127,11 @@
         insn -> insn.isConstString("StringConstants::foo#1", JumboStringMode.DISALLOW),
         InstructionSubject::isInvokeStatic,
         InstructionSubject::isThrow);
+
+    ClassSubject utilsClassSubject = inspector.clazz(Utils.class);
+    assertThat(utilsClassSubject, isPresent());
+    assertThat(utilsClassSubject.uniqueMethodWithName("throwException"), isPresent());
+    assertEquals(1, utilsClassSubject.allMethods().size());
   }
 
   @SafeVarargs
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java b/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
index 2af704d..7df59d9 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.movestringconstants;
 
-import com.android.tools.r8.ForceInline;
+import com.android.tools.r8.AlwaysInline;
 import com.android.tools.r8.NeverInline;
 
 public class TestClass {
@@ -30,7 +30,7 @@
 }
 
 class Utils {
-  @ForceInline
+  @AlwaysInline
   static void check(Object value, String message) {
     if (value == null) {
       throwException(message);
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
index 344a716..be514ec 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
@@ -12,8 +12,6 @@
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ForceInline;
-import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -83,13 +81,6 @@
   }
 
   @Override
-  public void configure(R8TestBuilder<?> builder) {
-    builder
-        .addForceInliningAnnotations()
-        .applyIf(mode == CompilationMode.RELEASE, R8TestBuilder::enableForceInliningAnnotations);
-  }
-
-  @Override
   public void inspect(CodeInspector inspector) {
     if (mode == CompilationMode.RELEASE) {
       assertEquals(compat ? 2 : 1, inspector.clazz(Main.class).allMethods().size());
@@ -99,13 +90,11 @@
 
 class Main {
 
-  @ForceInline
   public static void method3(long j) {
     System.out.println("In method3");
     throw null;
   }
 
-  @ForceInline
   public static void method2(int j) {
     System.out.println("In method2");
     for (int i = 0; i < 10; i++) {
@@ -113,7 +102,6 @@
     }
   }
 
-  @ForceInline
   public static void method1(String s) {
     System.out.println("In method1");
     for (int i = 0; i < 10; i++) {
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/LineDeltaTest.java b/src/test/java/com/android/tools/r8/naming/retrace/LineDeltaTest.java
index 2583b6e..d91a506 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/LineDeltaTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/LineDeltaTest.java
@@ -6,49 +6,60 @@
 
 import static org.junit.Assert.assertEquals;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class LineDeltaTest extends TestBase {
-  public String runTest(Backend backend) throws Exception {
-    return testForR8(backend)
-        .enableForceInliningAnnotations()
-        .addProgramClasses(LineDeltaTestClass.class)
-        .addKeepMainRule(LineDeltaTestClass.class)
-        .addKeepRules("-keepattributes LineNumberTable")
-        .run(LineDeltaTestClass.class)
-        .assertSuccessWithOutput(
-            StringUtils.lines(
-                "In test1() - 1",
-                "In test1() - 2",
-                "In test1() - 3",
-                "In test1() - 4",
-                "In test2() - 1",
-                "In test2() - 2",
-                "In test2() - 3",
-                "In test2() - 4"))
-        .proguardMap();
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection parameters() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    String proguardMap =
+        testForR8(parameters.getBackend())
+            .addProgramClasses(LineDeltaTestClass.class)
+            .addKeepMainRule(LineDeltaTestClass.class)
+            .addKeepRules("-keepattributes LineNumberTable")
+            .setMinApi(parameters.getApiLevel())
+            .compile()
+            .inspect(
+                inspector ->
+                    assertEquals(1, inspector.clazz(LineDeltaTestClass.class).allMethods().size()))
+            .run(parameters.getRuntime(), LineDeltaTestClass.class)
+            .assertSuccessWithOutput(
+                StringUtils.lines(
+                    "In test1() - 1",
+                    "In test1() - 2",
+                    "In test1() - 3",
+                    "In test1() - 4",
+                    "In test2() - 1",
+                    "In test2() - 2",
+                    "In test2() - 3",
+                    "In test2() - 4"))
+            .proguardMap();
+    assertEquals(parameters.isCfRuntime() ? 5 : 17, mapLines(proguardMap));
   }
 
   private long mapLines(String map) {
     return StringUtils.splitLines(map).stream().filter(line -> !line.startsWith("#")).count();
   }
-
-  @Test
-  public void testDex() throws Exception {
-    assertEquals(17, mapLines(runTest(Backend.DEX)));
-  }
-
-  @Test
-  public void testCf() throws Exception {
-    assertEquals(5, mapLines(runTest(Backend.CF)));
-  }
 }
 
 class LineDeltaTestClass {
-  @ForceInline
   static void test1() {
     System.out.println("In test1() - 1");
     // One line comment.
@@ -63,7 +74,6 @@
     System.out.println("In test1() - 4");
   }
 
-  @ForceInline
   static void test2() {
     System.out.println("In test2() - 1");
     // Seven line comments.
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
index 8d94fc8..ae6a985 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
@@ -11,7 +11,6 @@
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -85,13 +84,11 @@
 
 class Main {
 
-  @ForceInline
   public static void method3(long j) {
     System.out.println("In method3");
     throw null;
   }
 
-  @ForceInline
   public static void method2(int j) {
     System.out.println("In method2");
     for (int i = 0; i < 10; i++) {
@@ -99,7 +96,6 @@
     }
   }
 
-  @ForceInline
   public static void method1(String s) {
     System.out.println("In method1");
     for (int i = 0; i < 10; i++) {
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/LineDeltaTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/LineDeltaTest.java
index a96ad88..273adb0 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/LineDeltaTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/LineDeltaTest.java
@@ -6,49 +6,60 @@
 
 import static org.junit.Assert.assertEquals;
 
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class LineDeltaTest extends TestBase {
-  public String runTest(Backend backend) throws Exception {
-    return testForR8(backend)
-        .enableForceInliningAnnotations()
-        .addProgramClasses(LineDeltaTestClass.class)
-        .addKeepMainRule(LineDeltaTestClass.class)
-        .addKeepRules("-keepattributes LineNumberTable")
-        .run(LineDeltaTestClass.class)
-        .assertSuccessWithOutput(
-            StringUtils.lines(
-                "In test1() - 1",
-                "In test1() - 2",
-                "In test1() - 3",
-                "In test1() - 4",
-                "In test2() - 1",
-                "In test2() - 2",
-                "In test2() - 3",
-                "In test2() - 4"))
-        .proguardMap();
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection parameters() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    String proguardMap =
+        testForR8(parameters.getBackend())
+            .addProgramClasses(LineDeltaTestClass.class)
+            .addKeepMainRule(LineDeltaTestClass.class)
+            .addKeepRules("-keepattributes LineNumberTable")
+            .setMinApi(parameters.getApiLevel())
+            .compile()
+            .inspect(
+                inspector ->
+                    assertEquals(1, inspector.clazz(LineDeltaTestClass.class).allMethods().size()))
+            .run(parameters.getRuntime(), LineDeltaTestClass.class)
+            .assertSuccessWithOutput(
+                StringUtils.lines(
+                    "In test1() - 1",
+                    "In test1() - 2",
+                    "In test1() - 3",
+                    "In test1() - 4",
+                    "In test2() - 1",
+                    "In test2() - 2",
+                    "In test2() - 3",
+                    "In test2() - 4"))
+            .proguardMap();
+    assertEquals(parameters.isCfRuntime() ? 5 : 17, mapLines(proguardMap));
   }
 
   private long mapLines(String map) {
     return StringUtils.splitLines(map).stream().filter(line -> !line.startsWith("#")).count();
   }
-
-  @Test
-  public void testDex() throws Exception {
-    assertEquals(17, mapLines(runTest(Backend.DEX)));
-  }
-
-  @Test
-  public void testCf() throws Exception {
-    assertEquals(5, mapLines(runTest(Backend.CF)));
-  }
 }
 
 class LineDeltaTestClass {
-  @ForceInline
   static void test1() {
     System.out.println("In test1() - 1");
     // One line comment.
@@ -63,7 +74,6 @@
     System.out.println("In test1() - 4");
   }
 
-  @ForceInline
   static void test2() {
     System.out.println("In test2() - 1");
     // Seven line comments.
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java
index 62c4de9..c84c685 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java
@@ -53,7 +53,6 @@
             .setMode(mode)
             .enableProguardTestOptions()
             .addProgramClasses(getClasses())
-            .addForceInliningAnnotations()
             .addKeepMainRule(getMainClass())
             .addKeepRules(keepRules)
             .apply(this::configure)
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
index 42cd37e..d2e1d70 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
@@ -9,7 +9,6 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -56,14 +55,12 @@
       BiConsumer<CodeInspector, CompilationMode> inspection,
       boolean enableClassInliner, CompilationMode mode) throws Exception {
     R8Command.Builder builder = R8Command.builder();
-    builder.addProgramFiles(ToolHelper.getClassFileForTestClass(ForceInline.class));
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
     builder.setProgramConsumer(emptyConsumer(parameters.getBackend()));
     builder.addLibraryFiles(runtimeJar(parameters.getBackend()));
     builder.setMode(mode);
     builder.addProguardConfiguration(
         ImmutableList.of(
-            "-forceinline class * { @com.android.tools.r8.ForceInline *; }",
             "-keep class " + TestClass.class.getTypeName() + " {",
             "  public static void main(java.lang.String[]);",
             "  *** test*(...);",
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/TestClass.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/TestClass.java
index e354c48..ed62754 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/TestClass.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/TestClass.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.neverreturnsnormally;
 
-import com.android.tools.r8.ForceInline;
-
 public class TestClass {
   public static boolean throwNpe(String message) {
     String newMessage = "prefix:" + message + ":suffix";
@@ -13,7 +11,6 @@
     throw new NullPointerException(newMessage);
   }
 
-  @ForceInline
   public static int throwToBeInlined() {
     throwNpe("throwToBeInlined");
     return "Nobody cares".length();
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
index a9574e8..76e8f34 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.rewrite.enums;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static java.util.Collections.emptyList;
 import static java.util.stream.Collectors.toList;
@@ -58,7 +59,6 @@
         .addProgramClassesAndInnerClasses(Ordinals.class)
         .addKeepMainRule(Ordinals.class)
         .enableConstantArgumentAnnotations()
-        .enableForceInliningAnnotations()
         .enableInliningAnnotations()
         .enableSideEffectAnnotations()
         .addOptionsModification(this::configure)
@@ -100,6 +100,8 @@
 
     assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("libraryType"));
     assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("phi"));
+
+    assertThat(clazz.uniqueMethodWithName("inlined2"), isAbsent());
   }
 
   @Test
@@ -108,7 +110,6 @@
         .addProgramClassesAndInnerClasses(Names.class)
         .addKeepMainRule(Names.class)
         .enableConstantArgumentAnnotations()
-        .enableForceInliningAnnotations()
         .enableInliningAnnotations()
         .enableSideEffectAnnotations()
         .addOptionsModification(this::configure)
@@ -147,6 +148,8 @@
     assertNameWasNotReplaced(clazz.uniqueMethodWithName("libraryType"));
 
     assertNameWasNotReplaced(clazz.uniqueMethodWithName("phi"));
+
+    assertThat(clazz.uniqueMethodWithName("inlined2"), isAbsent());
   }
 
   @Test
@@ -155,7 +158,6 @@
         .addProgramClassesAndInnerClasses(ToStrings.class)
         .addKeepMainRule(ToStrings.class)
         .enableConstantArgumentAnnotations()
-        .enableForceInliningAnnotations()
         .enableInliningAnnotations()
         .enableSideEffectAnnotations()
         .addOptionsModification(this::configure)
@@ -197,6 +199,8 @@
 
     assertToStringWasNotReplaced(clazz.uniqueMethodWithName("libraryType"));
     assertToStringWasNotReplaced(clazz.uniqueMethodWithName("phi"));
+
+    assertThat(clazz.uniqueMethodWithName("inlined2"), isAbsent());
   }
 
   private static void assertOrdinalReplacedWithConst(MethodSubject method, int expectedConst) {
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/Names.java b/src/test/java/com/android/tools/r8/rewrite/enums/Names.java
index 1c2964c..10a70c4a 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/Names.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/Names.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.rewrite.enums;
 
 import com.android.tools.r8.AssumeMayHaveSideEffects;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import java.util.concurrent.TimeUnit;
@@ -48,7 +47,6 @@
     return inlined2(Number.TWO);
   }
 
-  @ForceInline
   private static String inlined2(Number number) {
     return number.name();
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/Ordinals.java b/src/test/java/com/android/tools/r8/rewrite/enums/Ordinals.java
index c3fbffc..de4677d 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/Ordinals.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/Ordinals.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.rewrite.enums;
 
 import com.android.tools.r8.AssumeMayHaveSideEffects;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import java.util.concurrent.TimeUnit;
@@ -44,7 +43,7 @@
   private static long inlined() {
     return inlined2(Number.TWO);
   }
-  @ForceInline
+
   private static long inlined2(Number number) {
     return number.ordinal();
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/ToStrings.java b/src/test/java/com/android/tools/r8/rewrite/enums/ToStrings.java
index 020f5fd..957a5e1 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/ToStrings.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/ToStrings.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.rewrite.enums;
 
 import com.android.tools.r8.AssumeMayHaveSideEffects;
-import com.android.tools.r8.ForceInline;
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import java.util.Locale;
@@ -85,7 +84,6 @@
     return inlined2(NoToString.TWO);
   }
 
-  @ForceInline
   private static String inlined2(NoToString number) {
     return number.toString();
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index c93200c..a296b9b 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -1720,8 +1720,7 @@
 
   @Test
   public void parse_testInlineOptions() {
-    List<String> options = ImmutableList.of(
-        "-neverinline", "-forceinline");
+    List<String> options = ImmutableList.of("-neverinline");
     for (String option : options) {
       try {
         reset();
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/A.java b/src/test/java/com/android/tools/r8/shaking/testrules/A.java
deleted file mode 100644
index 23aa04e..0000000
--- a/src/test/java/com/android/tools/r8/shaking/testrules/A.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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 com.android.tools.r8.shaking.testrules;
-
-import com.android.tools.r8.NoHorizontalClassMerging;
-
-@NoHorizontalClassMerging
-public class A {
-
-  public static int m(int a, int b) {
-    int r = a + b;
-    System.out.println(a + " + " + b + " = " + r);
-    return r;
-  }
-
-  public static int method() {
-    return m(m(m(1, 2), m(3, 4)), m(m(5, 6), m(7, 8)));
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/B.java b/src/test/java/com/android/tools/r8/shaking/testrules/B.java
deleted file mode 100644
index 4d1f085..0000000
--- a/src/test/java/com/android/tools/r8/shaking/testrules/B.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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 com.android.tools.r8.shaking.testrules;
-
-public class B {
-
-  public int m(int a, int b) {
-    int r = a + b;
-    System.out.println(a + " + " + b + " = " + r);
-    return r;
-  }
-  public int method() {
-    return m(m(m(1, 2), m(3, 4)), m(m(5, 6), m(7, 8)));
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/C.java b/src/test/java/com/android/tools/r8/shaking/testrules/C.java
deleted file mode 100644
index 497c218..0000000
--- a/src/test/java/com/android/tools/r8/shaking/testrules/C.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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 com.android.tools.r8.shaking.testrules;
-
-import com.android.tools.r8.NeverInline;
-
-public class C {
-
-  private static int i;
-
-  @NeverInline
-  public static int x() {
-    return i;
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
deleted file mode 100644
index aaafe0c..0000000
--- a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// 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.
-
-// 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 com.android.tools.r8.shaking.testrules;
-
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.fail;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class ForceInlineTest extends TestBase {
-
-  private TestParameters parameters;
-
-  @Parameterized.Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withAllRuntimesAndApiLevels().build();
-  }
-
-  public ForceInlineTest(TestParameters parameters) {
-    this.parameters = parameters;
-  }
-
-  private CodeInspector runTest(List<String> proguardConfiguration) throws Exception {
-    return testForR8(parameters.getBackend())
-        .addProgramClasses(Main.class, A.class, B.class, C.class)
-        .addKeepRules(proguardConfiguration)
-        .enableInliningAnnotations()
-        .enableNoHorizontalClassMergingAnnotations()
-        .enableNoHorizontalClassMergingAnnotations()
-        .enableProguardTestOptions()
-        .compile()
-        .inspector();
-  }
-
-  @Test
-  public void testDefaultInlining() throws Exception {
-    CodeInspector inspector =
-        runTest(
-            ImmutableList.of(
-                "-keep class **.Main { *; }",
-                "-neverinline class *{ @com.android.tools.r8.NeverInline <methods>;}",
-                "-dontobfuscate"));
-
-    ClassSubject classA = inspector.clazz(A.class);
-    ClassSubject classB = inspector.clazz(B.class);
-    ClassSubject classC = inspector.clazz(C.class);
-    ClassSubject classMain = inspector.clazz(Main.class);
-    assertThat(classA, isPresent());
-    assertThat(classB, isPresent());
-    assertThat(classC, not(isPresent()));
-    assertThat(classMain, isPresent());
-
-    // By default A.m *will not* be inlined (called several times and not small).
-    assertThat(classA.method("int", "m", ImmutableList.of("int", "int")), isPresent());
-    // By default A.method *will* be inlined (called only once).
-    assertThat(classA.method("int", "method", ImmutableList.of()), not(isPresent()));
-    // By default B.m *will not* be inlined (called several times and not small).
-    assertThat(classB.method("int", "m", ImmutableList.of("int", "int")), isPresent());
-    // By default B.method *will* be inlined (called only once).
-    assertThat(classB.method("int", "method", ImmutableList.of()), not(isPresent()));
-  }
-
-  @Test
-  public void testNeverInline() throws Exception {
-    CodeInspector inspector =
-        runTest(
-            ImmutableList.of(
-                "-neverinline class **.A { method(); }",
-                "-neverinline class **.B { method(); }",
-                "-keep class **.Main { *; }",
-                "-neverinline class *{ @com.android.tools.r8.NeverInline <methods>;}",
-                "-dontobfuscate"));
-
-    ClassSubject classA = inspector.clazz(A.class);
-    ClassSubject classB = inspector.clazz(B.class);
-    ClassSubject classC = inspector.clazz(C.class);
-    ClassSubject classMain = inspector.clazz(Main.class);
-    assertThat(classA, isPresent());
-    assertThat(classB, isPresent());
-    assertThat(classC, not(isPresent()));
-    assertThat(classMain, isPresent());
-
-    // Compared to the default method is no longer inlined.
-    assertThat(classA.method("int", "m", ImmutableList.of("int", "int")), isPresent());
-    assertThat(classA.method("int", "method", ImmutableList.of()), isPresent());
-    assertThat(classB.method("int", "m", ImmutableList.of("int", "int")), isPresent());
-    assertThat(classB.method("int", "method", ImmutableList.of()), isPresent());
-  }
-
-  @Test
-  public void testForceInline() throws Exception {
-    CodeInspector inspector =
-        runTest(
-            ImmutableList.of(
-                "-forceinline class **.A { int m(int, int); }",
-                "-forceinline class **.B { int m(int, int); }",
-                "-keep class **.Main { *; }",
-                "-neverinline class *{ @com.android.tools.r8.NeverInline <methods>;}",
-                "-dontobfuscate"));
-
-    // Compared to the default m is now inlined and method still is, so classes A and B are gone.
-    assertThat(inspector.clazz(A.class), not(isPresent()));
-    assertThat(inspector.clazz(B.class), not(isPresent()));
-    assertThat(inspector.clazz(C.class), not(isPresent()));
-    assertThat(inspector.clazz(Main.class), isPresent());
-  }
-
-  @Test
-  public void testForceInlineFails() {
-    try {
-      runTest(
-          ImmutableList.of(
-              "-forceinline class **.A { int x(); }",
-              "-keep class **.Main { *; }",
-              "-dontobfuscate"));
-      fail("Force inline of non-inlinable method succeeded");
-    } catch (Throwable t) {
-      // Ignore assertion error.
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/Main.java b/src/test/java/com/android/tools/r8/shaking/testrules/Main.java
deleted file mode 100644
index d326216..0000000
--- a/src/test/java/com/android/tools/r8/shaking/testrules/Main.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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 com.android.tools.r8.shaking.testrules;
-
-public class Main {
-
-  public static void main(String[] args) {
-    System.out.println(A.method());
-    System.out.println(new B().method());
-    System.out.println(C.x());
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index b100332..9c057e6 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
+import static com.google.common.base.Predicates.alwaysTrue;
+
 import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -17,7 +19,6 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.ListUtils;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -41,7 +42,7 @@
   public abstract void forAllMethods(Consumer<FoundMethodSubject> inspection);
 
   public final List<FoundMethodSubject> allMethods() {
-    return allMethods(Predicates.alwaysTrue());
+    return allMethods(alwaysTrue());
   }
 
   public final List<FoundMethodSubject> allMethods(Predicate<FoundMethodSubject> predicate) {
@@ -58,7 +59,7 @@
   public abstract void forAllVirtualMethods(Consumer<FoundMethodSubject> inspection);
 
   public final List<FoundMethodSubject> virtualMethods() {
-    return virtualMethods(Predicates.alwaysTrue());
+    return virtualMethods(alwaysTrue());
   }
 
   public final List<FoundMethodSubject> virtualMethods(Predicate<FoundMethodSubject> predicate) {
@@ -111,6 +112,10 @@
     return method("void", "main", ImmutableList.of("java.lang.String[]"));
   }
 
+  public MethodSubject uniqueMethod() {
+    return uniqueMethodThatMatches(alwaysTrue());
+  }
+
   public MethodSubject clinit() {
     return method("void", "<clinit>", ImmutableList.of());
   }