Revert "Check for valid override in devirtualizer" This reverts commit f6c349d326bb75eceec858245e27aa0e1b313cc5. Reason for revert: Bots failing Change-Id: I48fd637e80336cd745100b86f9491a8f740dda4c
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java index cf07031..0cc7497 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
@@ -3,8 +3,6 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.optimize; -import static com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult.isOverriding; - import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; @@ -375,10 +373,6 @@ || newResolutionResult .isAccessibleForVirtualDispatchFrom(context, appView.appInfo()) .isPossiblyFalse() - || !isOverriding( - resolutionResult.getResolvedMethod(), newResolutionResult.getResolvedMethod()) - // isOverriding do not check for invalid invokes and we should not bind if the candidate - // is not at least as visible. || !newResolutionResult .getResolvedMethod() .getAccessFlags()
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PackagePrivateOverrideDeVirtualizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PackagePrivateOverrideDeVirtualizerTest.java index 33da30f..b3ca988 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PackagePrivateOverrideDeVirtualizerTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PackagePrivateOverrideDeVirtualizerTest.java
@@ -56,7 +56,8 @@ .enableNoVerticalClassMergingAnnotations() .enableNeverClassInliningAnnotations() .run(parameters.getRuntime(), Main.class) - .apply(this::assertSuccessOutput); + // TODO(b/182185057): This should be EXPECTED. + .assertSuccessWithOutputLines(EXPECTED_DALVIK); } private byte[] getSubViewModelInAnotherPackage() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java b/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java new file mode 100644 index 0000000..f9583f7 --- /dev/null +++ b/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java
@@ -0,0 +1,102 @@ +// Copyright (c) 2021, 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; + +import com.android.tools.r8.NeverClassInline; +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoVerticalClassMerging; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.google.common.collect.ImmutableList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class AbstractSuperClassLiveMethodTest extends TestBase { + + private final TestParameters parameters; + private final String NEW_DESCRIPTOR = "Lfoo/A;"; + private final String[] EXPECTED = new String[] {"A::foo", "Base::foo"}; + private final String[] EXPECTED_DALVIK = new String[] {"A::foo", "A::foo"}; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public AbstractSuperClassLiveMethodTest(TestParameters parameters) { + this.parameters = parameters; + } + + public List<byte[]> getProgramClassFileData() throws Exception { + return ImmutableList.of( + transformer(A.class).setClassDescriptor(NEW_DESCRIPTOR).transform(), + transformer(Main.class) + .replaceClassDescriptorInMethodInstructions(descriptor(A.class), NEW_DESCRIPTOR) + .transform()); + } + + @Test + public void testRuntime() throws Exception { + testForRuntime(parameters) + .addProgramClasses(Base.class) + .addProgramClassFileData(getProgramClassFileData()) + .run(parameters.getRuntime(), Main.class) + .applyIf( + parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isDalvik(), + r -> r.assertSuccessWithOutputLines(EXPECTED_DALVIK), + r -> r.assertSuccessWithOutputLines(EXPECTED)); + } + + @Test + public void testForR8() throws Exception { + testForR8(parameters.getBackend()) + .addProgramClasses(Base.class) + .addProgramClassFileData(getProgramClassFileData()) + .setMinApi(parameters.getApiLevel()) + .addKeepMainRule(Main.class) + .enableInliningAnnotations() + .enableNoVerticalClassMergingAnnotations() + .enableNeverClassInliningAnnotations() + .addOptionsModification(options -> options.enableDevirtualization = false) + .run(parameters.getRuntime(), Main.class) + .applyIf( + parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isDalvik(), + r -> r.assertSuccessWithOutputLines(EXPECTED_DALVIK), + r -> r.assertSuccessWithOutputLines(EXPECTED)); + } + + @NoVerticalClassMerging + public abstract static class Base { + + @NeverInline + void foo() { + System.out.println("Base::foo"); + } + } + + @NeverClassInline + public static class /* will be foo.A */ A extends Base { + + @Override + @NeverInline + public void foo() { + System.out.println("A::foo"); + } + } + + public static class Main { + + public static void main(String[] args) { + Base a = new A(); + ((A) a).foo(); + a.foo(); + } + } +}