Remove applyDoubleInlining flag

This replaces uses of the applyDoubleInlining flag by checking if we have a PostMethodProcessor.

This also restricts the DUAL_CALLER inlining reason to the primary and the secondary optimization pass, such that we do not end up DUAL_CALLER inlining outside these two optimization passes.

Change-Id: I4633e6581dabb343e770a93ea31d01818f155fbf
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
index e8770c7..8c71936 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
 import com.android.tools.r8.ir.optimize.inliner.InliningReasonStrategy;
 
@@ -34,7 +35,10 @@
 
   @Override
   public Reason computeInliningReason(
-      InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
+      InvokeMethod invoke,
+      ProgramMethod target,
+      ProgramMethod context,
+      MethodProcessor methodProcessor) {
     if (references.isAbstractGeneratedMessageLiteBuilder(context.getHolder())
         && invoke.isInvokeSuper()) {
       // Aggressively inline invoke-super calls inside the GeneratedMessageLite builders. Such
@@ -44,7 +48,7 @@
     }
     return references.isDynamicMethod(target) || references.isDynamicMethodBridge(target)
         ? computeInliningReasonForDynamicMethod(invoke, target, context)
-        : parent.computeInliningReason(invoke, target, context);
+        : parent.computeInliningReason(invoke, target, context, methodProcessor);
   }
 
   private Reason computeInliningReasonForDynamicMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
index 9857098..d0b0349 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
@@ -12,6 +12,10 @@
     return false;
   }
 
+  public boolean isPostMethodProcessor() {
+    return false;
+  }
+
   public abstract MethodProcessingContext createMethodProcessingContext(ProgramMethod method);
 
   public abstract boolean isProcessedConcurrently(ProgramMethod method);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index a25e9dc..a54b717 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -50,6 +50,11 @@
   }
 
   @Override
+  public boolean isPostMethodProcessor() {
+    return true;
+  }
+
+  @Override
   public boolean shouldApplyCodeRewritings(ProgramMethod method) {
     assert !wave.contains(method);
     return !processed.contains(method);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index c3649fb..4a91c4c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -179,20 +179,22 @@
     }
 
     if (reason == Reason.DUAL_CALLER) {
+      assert methodProcessor.isPrimaryMethodProcessor() || methodProcessor.isPostMethodProcessor();
       if (satisfiesRequirementsForSimpleInlining(invoke, singleTarget)) {
         // When we have a method with two call sites, we simply inline the method as we normally do
         // when the method is small. We still need to ensure that the other call site is also
         // inlined, though. Therefore, we record here that we have seen one of the two call sites
         // as we normally do.
-        inliner.recordDoubleInliningCandidate(method, singleTarget);
-      } else if (inliner.isDoubleInliningEnabled()) {
-        if (!inliner.satisfiesRequirementsForDoubleInlining(method, singleTarget)) {
+        inliner.recordDoubleInliningCandidate(method, singleTarget, methodProcessor);
+      } else if (inliner.isDoubleInliningEnabled(methodProcessor)) {
+        if (!inliner.satisfiesRequirementsForDoubleInlining(
+            method, singleTarget, methodProcessor)) {
           whyAreYouNotInliningReporter.reportInvalidDoubleInliningCandidate();
           return false;
         }
       } else {
         // TODO(b/142300882): Should in principle disallow inlining in this case.
-        inliner.recordDoubleInliningCandidate(method, singleTarget);
+        inliner.recordDoubleInliningCandidate(method, singleTarget, methodProcessor);
       }
     } else if (reason == Reason.SIMPLE
         && !satisfiesRequirementsForSimpleInlining(invoke, singleTarget)) {
@@ -279,7 +281,8 @@
       return null;
     }
 
-    Reason reason = reasonStrategy.computeInliningReason(invoke, singleTarget, context);
+    Reason reason =
+        reasonStrategy.computeInliningReason(invoke, singleTarget, context, methodProcessor);
     if (reason == Reason.NEVER) {
       return null;
     }
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 7591f78..605896f 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
@@ -87,7 +87,6 @@
   final MainDexInfo mainDexInfo;
 
   // State for inlining methods which are known to be called twice.
-  private boolean applyDoubleInlining = false;
   private LongLivedProgramMethodSetBuilder<ProgramMethodSet> doubleInlineCallers;
   private final ProgramMethodSet doubleInlineSelectedTargets = ProgramMethodSet.create();
   private final Map<DexEncodedMethod, ProgramMethod> doubleInlineeCandidates =
@@ -149,8 +148,8 @@
     return false;
   }
 
-  boolean isDoubleInliningEnabled() {
-    return applyDoubleInlining;
+  boolean isDoubleInliningEnabled(MethodProcessor methodProcessor) {
+    return methodProcessor.isPostMethodProcessor();
   }
 
   private ConstraintWithTarget instructionAllowedForInlining(
@@ -210,19 +209,20 @@
   }
 
   synchronized boolean satisfiesRequirementsForDoubleInlining(
-      ProgramMethod method, ProgramMethod target) {
-    if (applyDoubleInlining) {
+      ProgramMethod method, ProgramMethod target, MethodProcessor methodProcessor) {
+    if (isDoubleInliningEnabled(methodProcessor)) {
       // Don't perform the actual inlining if this was not selected.
       return doubleInlineSelectedTargets.contains(target);
     }
 
     // Just preparing for double inlining.
-    recordDoubleInliningCandidate(method, target);
+    recordDoubleInliningCandidate(method, target, methodProcessor);
     return false;
   }
 
-  synchronized void recordDoubleInliningCandidate(ProgramMethod method, ProgramMethod target) {
-    if (applyDoubleInlining) {
+  synchronized void recordDoubleInliningCandidate(
+      ProgramMethod method, ProgramMethod target, MethodProcessor methodProcessor) {
+    if (isDoubleInliningEnabled(methodProcessor)) {
       return;
     }
 
@@ -252,7 +252,6 @@
     // rewritten with a newer graph lens).
     postMethodProcessorBuilder.getMethodsToReprocessBuilder().merge(doubleInlineCallers);
     doubleInlineCallers = null;
-    applyDoubleInlining = true;
   }
 
   /**
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 c6b0aa4..43b302b 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
@@ -10,6 +10,7 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.conversion.CallSiteInformation;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.Inliner;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -31,7 +32,10 @@
 
   @Override
   public Reason computeInliningReason(
-      InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
+      InvokeMethod invoke,
+      ProgramMethod target,
+      ProgramMethod context,
+      MethodProcessor methodProcessor) {
     DexEncodedMethod targetMethod = target.getDefinition();
     DexMethod targetReference = target.getReference();
     if (targetMethod.getOptimizationInfo().forceInline()) {
@@ -52,7 +56,7 @@
     if (isSingleCallerInliningTarget(target)) {
       return Reason.SINGLE_CALLER;
     }
-    if (isDoubleInliningTarget(target)) {
+    if (isDoubleInliningTarget(target, methodProcessor)) {
       return Reason.DUAL_CALLER;
     }
     return Reason.SIMPLE;
@@ -72,11 +76,13 @@
     return true;
   }
 
-  private boolean isDoubleInliningTarget(ProgramMethod candidate) {
-    // 10 is found from measuring.
-    if (callSiteInformation.hasDoubleCallSite(candidate)
-        || inliner.isDoubleInlineSelectedTarget(candidate)) {
-      return candidate.getDefinition().getCode().estimatedSizeForInliningAtMost(10);
+  private boolean isDoubleInliningTarget(ProgramMethod candidate, MethodProcessor methodProcessor) {
+    if (methodProcessor.isPrimaryMethodProcessor() || methodProcessor.isPostMethodProcessor()) {
+      if (callSiteInformation.hasDoubleCallSite(candidate)
+          || inliner.isDoubleInlineSelectedTarget(candidate)) {
+        // 10 is found from measuring.
+        return candidate.getDefinition().getCode().estimatedSizeForInliningAtMost(10);
+      }
     }
     return false;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java
index ae23a74..aed242b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
 
 public class FixedInliningReasonStrategy implements InliningReasonStrategy {
@@ -18,7 +19,10 @@
 
   @Override
   public Reason computeInliningReason(
-      InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
+      InvokeMethod invoke,
+      ProgramMethod target,
+      ProgramMethod context,
+      MethodProcessor methodProcessor) {
     return reason;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java
index f2ae52a..00ff53c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java
@@ -6,9 +6,14 @@
 
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
 
 public interface InliningReasonStrategy {
 
-  Reason computeInliningReason(InvokeMethod invoke, ProgramMethod target, ProgramMethod context);
+  Reason computeInliningReason(
+      InvokeMethod invoke,
+      ProgramMethod target,
+      ProgramMethod context,
+      MethodProcessor methodProcessor);
 }