Revert "Optimize empty Object[] -> null in reflection APIs"
This reverts commit b2baa96841919a9fd14102c652f2b881fb77aa15.
Reason for revert: Causes verification errors, b/395140848
Bug: b/395140848
Change-Id: I6a3311a56443f911d0179a7a40772201fb3e687a
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/ClassOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/ClassOptimizer.java
deleted file mode 100644
index db81e4b..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/ClassOptimizer.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2023, 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.ir.optimize.library;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlockIterator;
-import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.InvokeMethod;
-import com.android.tools.r8.ir.optimize.AffectedValues;
-import com.android.tools.r8.utils.InternalOptions;
-import java.util.Set;
-
-public class ClassOptimizer extends StatelessLibraryMethodModelCollection {
-
- private final InternalOptions options;
- private final DexItemFactory dexItemFactory;
- private final DexMethod getConstructor;
- private final DexMethod getDeclaredConstructor;
- private final DexMethod getMethod;
- private final DexMethod getDeclaredMethod;
-
- ClassOptimizer(AppView<?> appView) {
- DexItemFactory dexItemFactory = appView.dexItemFactory();
- this.options = appView.options();
- this.dexItemFactory = dexItemFactory;
- getConstructor = dexItemFactory.classMethods.getConstructor;
- getDeclaredConstructor = dexItemFactory.classMethods.getDeclaredConstructor;
- getMethod = dexItemFactory.classMethods.getMethod;
- getDeclaredMethod = dexItemFactory.classMethods.getDeclaredMethod;
- }
-
- @Override
- public DexType getType() {
- return dexItemFactory.classType;
- }
-
- @Override
- @SuppressWarnings("ReferenceEquality")
- public InstructionListIterator optimize(
- IRCode code,
- BasicBlockIterator blockIterator,
- InstructionListIterator instructionIterator,
- InvokeMethod invoke,
- DexClassAndMethod singleTarget,
- AffectedValues affectedValues,
- Set<BasicBlock> blocksToRemove) {
- DexMethod singleTargetReference = singleTarget.getReference();
- if (singleTargetReference.isIdenticalTo(getConstructor)
- || singleTargetReference.isIdenticalTo(getDeclaredConstructor)
- || singleTargetReference.isIdenticalTo(getMethod)
- || singleTargetReference.isIdenticalTo(getDeclaredMethod)) {
- EmptyVarargsUtil.replaceWithNullIfEmptyArray(
- invoke.getLastArgument(), code, instructionIterator, options, affectedValues);
- assert instructionIterator.peekPrevious() == invoke;
- }
- return instructionIterator;
- }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/ConstructorOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/ConstructorOptimizer.java
deleted file mode 100644
index 718ed8b..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/ConstructorOptimizer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2023, 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.ir.optimize.library;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlockIterator;
-import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.InvokeMethod;
-import com.android.tools.r8.ir.optimize.AffectedValues;
-import com.android.tools.r8.utils.InternalOptions;
-import java.util.Set;
-
-public class ConstructorOptimizer extends StatelessLibraryMethodModelCollection {
-
- private final InternalOptions options;
- private final DexItemFactory dexItemFactory;
- private final DexMethod newInstance;
-
- ConstructorOptimizer(AppView<?> appView) {
- DexItemFactory dexItemFactory = appView.dexItemFactory();
- this.options = appView.options();
- this.dexItemFactory = dexItemFactory;
- newInstance = dexItemFactory.constructorMethods.newInstance;
- }
-
- @Override
- public DexType getType() {
- return dexItemFactory.constructorType;
- }
-
- @Override
- @SuppressWarnings("ReferenceEquality")
- public InstructionListIterator optimize(
- IRCode code,
- BasicBlockIterator blockIterator,
- InstructionListIterator instructionIterator,
- InvokeMethod invoke,
- DexClassAndMethod singleTarget,
- AffectedValues affectedValues,
- Set<BasicBlock> blocksToRemove) {
- DexMethod singleTargetReference = singleTarget.getReference();
- if (singleTargetReference.isIdenticalTo(newInstance)) {
- EmptyVarargsUtil.replaceWithNullIfEmptyArray(
- invoke.getArgument(1), code, instructionIterator, options, affectedValues);
- assert instructionIterator.peekPrevious() == invoke;
- }
- return instructionIterator;
- }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsUtil.java b/src/main/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsUtil.java
deleted file mode 100644
index a81a0c5..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsUtil.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2023, 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.ir.optimize.library;
-
-import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.Instruction;
-import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.ir.optimize.AffectedValues;
-import com.android.tools.r8.utils.InternalOptions;
-
-public class EmptyVarargsUtil {
- public static void replaceWithNullIfEmptyArray(
- Value value,
- IRCode code,
- InstructionListIterator instructionIterator,
- InternalOptions options,
- AffectedValues affectedValues) {
- if (value.isDefinedByInstructionSatisfying(Instruction::isNewArrayEmpty)
- && value.definition.asNewArrayEmpty().sizeIfConst() == 0) {
- instructionIterator.previous();
- value.replaceUsers(
- instructionIterator.insertConstNullInstruction(code, options), affectedValues);
- instructionIterator.next();
- }
- }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMemberOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMemberOptimizer.java
index 788cbf6..cadab0f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMemberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMemberOptimizer.java
@@ -46,12 +46,9 @@
this.appView = appView;
timing.begin("Register optimizers");
PrimitiveMethodOptimizer.forEachPrimitiveOptimizer(appView, this::register);
- register(new ClassOptimizer(appView));
register(new CollectionsOptimizer(appView));
- register(new ConstructorOptimizer(appView));
register(new ListOptimizer(appView));
register(new MapOptimizer(appView));
- register(new MethodOptimizer(appView));
register(new ObjectMethodOptimizer(appView));
register(new ObjectsMethodOptimizer(appView));
register(new SetOptimizer(appView));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/MethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/MethodOptimizer.java
deleted file mode 100644
index 78b0149..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/MethodOptimizer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2023, 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.ir.optimize.library;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlockIterator;
-import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.InvokeMethod;
-import com.android.tools.r8.ir.optimize.AffectedValues;
-import com.android.tools.r8.utils.InternalOptions;
-import java.util.Set;
-
-public class MethodOptimizer extends StatelessLibraryMethodModelCollection {
-
- private final InternalOptions options;
- private final DexItemFactory dexItemFactory;
- private final DexMethod invoke;
-
- MethodOptimizer(AppView<?> appView) {
- DexItemFactory dexItemFactory = appView.dexItemFactory();
- this.options = appView.options();
- this.dexItemFactory = dexItemFactory;
- invoke = dexItemFactory.methodMethods.invoke;
- }
-
- @Override
- public DexType getType() {
- return dexItemFactory.methodType;
- }
-
- @Override
- @SuppressWarnings("ReferenceEquality")
- public InstructionListIterator optimize(
- IRCode code,
- BasicBlockIterator blockIterator,
- InstructionListIterator instructionIterator,
- InvokeMethod invoke,
- DexClassAndMethod singleTarget,
- AffectedValues affectedValues,
- Set<BasicBlock> blocksToRemove) {
- DexMethod singleTargetReference = singleTarget.getReference();
- if (singleTargetReference.isIdenticalTo(this.invoke)) {
- EmptyVarargsUtil.replaceWithNullIfEmptyArray(
- invoke.getArgument(2), code, instructionIterator, options, affectedValues);
- assert instructionIterator.peekPrevious() == invoke;
- }
- return instructionIterator;
- }
-}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsTest.java
index 2384387..ea72d77 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/EmptyVarargsTest.java
@@ -53,9 +53,9 @@
MethodSubject testMethod =
mainClassSubject.uniqueMethodWithOriginalName("testDeclared");
- assertTrue(testMethod.streamInstructions().noneMatch(InstructionSubject::isNewArray));
+ assertTrue(testMethod.streamInstructions().anyMatch(InstructionSubject::isNewArray));
testMethod = mainClassSubject.uniqueMethodWithOriginalName("testNonDeclared");
- assertTrue(testMethod.streamInstructions().noneMatch(InstructionSubject::isNewArray));
+ assertTrue(testMethod.streamInstructions().anyMatch(InstructionSubject::isNewArray));
})
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("hi", "hi");