Merge "Clean up uses of synchronized keyword just for disablining inlining."
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
index fbf630c..abd1b5f 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
@@ -38,20 +38,6 @@
return builder;
}
- static R8Command.Builder loadProgramFiles(Backend backend, Package p, Class... classes)
- throws Exception {
- R8Command.Builder builder = R8Command.builder();
- builder.addProgramFiles(ToolHelper.getClassFilesForTestPackage(p));
- for (Class clazz : classes) {
- builder.addProgramFiles(ToolHelper.getClassFileForTestClass(clazz));
- }
- builder.setProgramConsumer(emptyConsumer(backend)).addLibraryFiles(runtimeJar(backend));
- if (backend == Backend.DEX) {
- builder.setMinApiLevel(ToolHelper.getMinApiLevelForDexVm().getLevel());
- }
- return builder;
- }
-
void compareReferenceJVMAndProcessed(AndroidApp app, Class mainClass) throws Exception {
// Run on Jvm.
String jvmOutput = runOnJava(mainClass);
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
index 44149e0..7ab3625 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
@@ -6,7 +6,6 @@
import static org.junit.Assert.assertEquals;
-import com.android.tools.r8.R8Command;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.accessrelaxation.privateinstance.Base;
@@ -18,8 +17,6 @@
import com.android.tools.r8.accessrelaxation.privatestatic.BB;
import com.android.tools.r8.accessrelaxation.privatestatic.C;
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.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -67,21 +64,22 @@
+ "java.lang.IllegalAccessErrorB::bar() >> java.lang.IllegalAccessError",
"B::foo()A::foo()A::baz()A::bar()A::bar(int)",
"C::blah(int)");
-
+ Class<?> mainClass = C.class;
if (backend == Backend.CF) {
// Only run JVM reference once (for CF backend)
- testForJvm().addTestClasspath().run(C.class).assertSuccessWithOutput(expectedOutput);
+ testForJvm().addTestClasspath().run(mainClass).assertSuccessWithOutput(expectedOutput);
}
R8TestRunResult result =
testForR8(backend)
- .addProgramFiles(ToolHelper.getClassFilesForTestPackage(C.class.getPackage()))
+ .addProgramFiles(ToolHelper.getClassFilesForTestPackage(mainClass.getPackage()))
.addOptionsModification(o -> o.enableArgumentRemoval = enableArgumentRemoval)
+ .noMinification()
.addKeepRules(
// Note: we use '-checkdiscard' to indirectly check that the access relaxation is
// done which leads to inlining of all pB*** methods so they are removed. Without
// access relaxation inlining is not performed and method are kept.
- "-keep class " + C.class.getCanonicalName() + "{",
+ "-keep class " + mainClass.getCanonicalName() + "{",
" public static void main(java.lang.String[]);",
"}",
"",
@@ -100,9 +98,8 @@
" *** pBlah1();",
"}",
"",
- "-dontobfuscate",
"-allowaccessmodification")
- .run(C.class);
+ .run(mainClass);
assertEquals(
expectedOutput,
@@ -134,42 +131,60 @@
}
private void testInstanceMethodRelaxation(boolean enableVerticalClassMerging) throws Exception {
- Class mainClass = TestMain.class;
- R8Command.Builder builder = loadProgramFiles(backend, mainClass.getPackage());
+ String expectedOutput =
+ StringUtils.lines(
+ "Base::foo()",
+ "Base::foo1()",
+ "Base::foo2()",
+ "Sub1::foo1()",
+ "Itf1::foo1(0) >> Sub1::foo1()",
+ "Sub1::bar1(0)",
+ "Sub2::foo2()",
+ "Itf2::foo2(0) >> Sub2::foo2()",
+ "Sub2::bar2(0)");
+ Class<?> mainClass = TestMain.class;
+ if (backend == Backend.CF) {
+ // Only run JVM reference once (for CF backend)
+ testForJvm().addTestClasspath().run(mainClass).assertSuccessWithOutput(expectedOutput);
+ }
- builder.addProguardConfiguration(
- ImmutableList.of(
- "-keep class " + mainClass.getCanonicalName() + "{",
- " public static void main(java.lang.String[]);",
- "}",
- "",
- "-checkdiscard class " + Base.class.getCanonicalName() + "{",
- " *** p*();",
- "}",
- "",
- "-checkdiscard class " + Sub1.class.getCanonicalName() + "{",
- " *** p*();",
- "}",
- "",
- "-checkdiscard class " + Sub2.class.getCanonicalName() + "{",
- " *** p*();",
- "}",
- "",
- "-dontobfuscate",
- "-allowaccessmodification"
- ),
- Origin.unknown());
+ R8TestRunResult result =
+ testForR8(backend)
+ .addProgramFiles(ToolHelper.getClassFilesForTestPackage(mainClass.getPackage()))
+ .addOptionsModification(o -> o.enableVerticalClassMerging = enableVerticalClassMerging)
+ .enableInliningAnnotations()
+ .noMinification()
+ .addKeepRules(
+ "-keep class " + mainClass.getCanonicalName() + "{",
+ " public static void main(java.lang.String[]);",
+ "}",
+ "",
+ "-checkdiscard class " + Base.class.getCanonicalName() + "{",
+ " *** p*();",
+ "}",
+ "",
+ "-checkdiscard class " + Sub1.class.getCanonicalName() + "{",
+ " *** p*();",
+ "}",
+ "",
+ "-checkdiscard class " + Sub2.class.getCanonicalName() + "{",
+ " *** p*();",
+ "}",
+ "",
+ "-allowaccessmodification"
+ )
+ .run(mainClass);
- AndroidApp app =
- ToolHelper.runR8(
- builder.build(),
- options -> options.enableVerticalClassMerging = enableVerticalClassMerging);
- compareReferenceJVMAndProcessed(app, mainClass);
+ assertEquals(
+ expectedOutput,
+ result
+ .getStdOut()
+ .replace("java.lang.IncompatibleClassChangeError", "java.lang.IllegalAccessError"));
// When vertical class merging is enabled, Itf1 is merged into Sub1 and Itf2 is merged into
// Sub2, and as a result of these merges, neither Sub1 nor Sub2 end up in the output because of
// inlining.
- CodeInspector codeInspector = new CodeInspector(app);
+ CodeInspector codeInspector = result.inspector();
assertPublic(codeInspector, Base.class, new MethodSignature("foo", STRING, ImmutableList.of()));
// Base#foo?() can't be publicized due to Itf<1>#foo<1>().
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Base.java b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Base.java
index 6325c78..130ba9a 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Base.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Base.java
@@ -3,10 +3,12 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.accessrelaxation.privateinstance;
+import com.android.tools.r8.NeverInline;
+
public class Base {
- // NOTE: here and below 'synchronized' is supposed to disable inlining of this method.
- private synchronized String foo() {
+ @NeverInline
+ private String foo() {
return "Base::foo()";
}
@@ -14,7 +16,8 @@
return foo();
}
- private synchronized String foo1() {
+ @NeverInline
+ private String foo1() {
return "Base::foo1()";
}
@@ -22,7 +25,8 @@
return foo1();
}
- private synchronized String foo2() {
+ @NeverInline
+ private String foo2() {
return "Base::foo2()";
}
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java
index 317aaff..0793001 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.accessrelaxation.privateinstance;
+import com.android.tools.r8.NeverInline;
+
public class Sub1 extends Base implements Itf1 {
@Override
@@ -10,7 +12,8 @@
return "Sub1::foo1()";
}
- private synchronized String bar1(int i) {
+ @NeverInline
+ private String bar1(int i) {
return "Sub1::bar1(" + i + ")";
}
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java
index 039e3ac..018bc90 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.accessrelaxation.privateinstance;
+import com.android.tools.r8.NeverInline;
+
public class Sub2 extends Base implements Itf2 {
@Override
@@ -10,7 +12,8 @@
return "Sub2::foo2()";
}
- private synchronized String bar1(int i) {
+ @NeverInline
+ private String bar1(int i) {
return "Sub2::bar1(" + i + ")";
}
@@ -18,7 +21,8 @@
return bar1(1);
}
- private synchronized String bar2(int i) {
+ @NeverInline
+ private String bar2(int i) {
return "Sub2::bar2(" + i + ")";
}
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 ec728b1..967277c 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -9,6 +9,7 @@
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;
import com.android.tools.r8.ToolHelper;
@@ -41,6 +42,7 @@
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.addLibraryFiles(runtimeJar(backend));
@@ -49,6 +51,7 @@
builder.addProguardConfiguration(
ImmutableList.of(
"-forceinline class * { @com.android.tools.r8.ForceInline *; }",
+ "-neverinline class * { @com.android.tools.r8.NeverInline *; }",
"-keep class " + TestClass.class.getCanonicalName() + "{ *; }",
"-dontobfuscate",
"-allowaccessmodification"
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 086eac6..2af704d 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.movestringconstants;
import com.android.tools.r8.ForceInline;
+import com.android.tools.r8.NeverInline;
public class TestClass {
public static void main(String[] args) {}
@@ -36,7 +37,8 @@
}
}
- private synchronized static void throwException(String message) {
+ @NeverInline
+ private static void throwException(String message) {
throw new RuntimeException(message);
}
}