Make NaturalIntLoopRemover a CodeRewriterPass
Change-Id: I82ba6746022c8c3ce460bc290cb0ee4eac62465a
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 9e5d496..7aae701 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -32,6 +32,7 @@
import com.android.tools.r8.ir.conversion.passes.BranchSimplifier;
import com.android.tools.r8.ir.conversion.passes.CommonSubexpressionElimination;
import com.android.tools.r8.ir.conversion.passes.DexConstantOptimizer;
+import com.android.tools.r8.ir.conversion.passes.NaturalIntLoopRemover;
import com.android.tools.r8.ir.conversion.passes.ParentConstructorHoistingCodeRewriter;
import com.android.tools.r8.ir.conversion.passes.SplitBranch;
import com.android.tools.r8.ir.conversion.passes.ThrowCatchOptimizer;
@@ -53,7 +54,6 @@
import com.android.tools.r8.ir.optimize.IdempotentFunctionCallCanonicalizer;
import com.android.tools.r8.ir.optimize.Inliner;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
-import com.android.tools.r8.ir.optimize.NaturalIntLoopRemover;
import com.android.tools.r8.ir.optimize.RedundantFieldLoadAndStoreElimination;
import com.android.tools.r8.ir.optimize.ReflectionOptimizer;
import com.android.tools.r8.ir.optimize.RemoveVerificationErrorForUnknownReturnedValues;
@@ -123,7 +123,6 @@
public final CommonSubexpressionElimination commonSubexpressionElimination;
private final SplitBranch splitBranch;
public AssertionErrorTwoArgsConstructorRewriter assertionErrorTwoArgsConstructorRewriter;
- private final NaturalIntLoopRemover naturalIntLoopRemover = new NaturalIntLoopRemover();
public final MemberValuePropagation<?> memberValuePropagation;
private final LensCodeRewriter lensCodeRewriter;
protected final Inliner inliner;
@@ -747,9 +746,7 @@
timing.begin("Rewrite array length");
codeRewriter.rewriteKnownArrayLengthCalls(code);
timing.end();
- timing.begin("Natural Int Loop Remover");
- naturalIntLoopRemover.run(appView, code);
- timing.end();
+ new NaturalIntLoopRemover(appView).run(context, code);
if (assertionErrorTwoArgsConstructorRewriter != null) {
timing.begin("Rewrite AssertionError");
assertionErrorTwoArgsConstructorRewriter.rewrite(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NaturalIntLoopRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/ir/optimize/NaturalIntLoopRemover.java
rename to src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java
index fc26421..16e9415 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NaturalIntLoopRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java
@@ -1,11 +1,13 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// 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;
+package com.android.tools.r8.ir.conversion.passes;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.Goto;
import com.android.tools.r8.ir.code.IRCode;
@@ -27,12 +29,19 @@
* pattern match fori and for loops with any initial value and increment, but this should be
* extended for while loop support.
*/
-public class NaturalIntLoopRemover {
+public class NaturalIntLoopRemover extends CodeRewriterPass<AppInfo> {
- public void run(AppView<?> appView, IRCode code) {
- if (!appView.options().enableLoopUnrolling) {
- return;
- }
+ public NaturalIntLoopRemover(AppView<?> appView) {
+ super(appView);
+ }
+
+ @Override
+ String getTimingId() {
+ return "NaturalIntLoopRemover";
+ }
+
+ @Override
+ void rewriteCode(ProgramMethod method, IRCode code) {
boolean loopRemoved = false;
for (BasicBlock comparisonBlockCandidate : code.blocks) {
if (isComparisonBlock(comparisonBlockCandidate)) {
@@ -46,6 +55,11 @@
}
}
+ @Override
+ boolean shouldRewriteCode(ProgramMethod method, IRCode code) {
+ return appView.options().enableLoopUnrolling;
+ }
+
private boolean isComparisonBlock(BasicBlock comparisonBlockCandidate) {
if (!comparisonBlockCandidate.exit().isIf()
|| comparisonBlockCandidate.exit().asIf().isZeroTest()) {