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());
}