Rename hasSingleInFlow
Change-Id: Id6cc78fd5adf4120276fa07210fba185fd6d2bb4
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java
index ec8d43e..6830918 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java
@@ -42,8 +42,8 @@
*/
Iterable<BaseInFlow> getBaseInFlow();
- default boolean hasSingleInFlow() {
- return true;
+ default boolean usesFlowGraphStateProvider() {
+ return false;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java
index c51a4cf..385c957 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java
@@ -15,44 +15,44 @@
if (!InternalOptions.assertionsEnabled()) {
return flowGraph;
}
- // If the abstract function is a canonical function, or the abstract function has a single
- // declared input, we should never perform any state lookups.
- if (abstractFunction.hasSingleInFlow()) {
- assert abstractFunction.isIdentity()
- || abstractFunction.isCastAbstractFunction()
- || abstractFunction.isUnknownAbstractFunction()
- || abstractFunction.isUpdateChangedFlagsAbstractFunction();
+ // If the abstract function needs to perform state lookups, we restrict state lookups to the
+ // declared base in flow. This is important for arriving at the correct fix point.
+ if (abstractFunction.usesFlowGraphStateProvider()) {
+ assert abstractFunction.isIfThenElseAbstractFunction()
+ || abstractFunction.isInstanceFieldReadAbstractFunction();
return new FlowGraphStateProvider() {
@Override
public ValueState getState(DexField field) {
- throw new Unreachable();
+ assert abstractFunction.verifyContainsBaseInFlow(new FieldValue(field));
+ return flowGraph.getState(field);
}
@Override
public ValueState getState(
MethodParameter methodParameter, Supplier<ValueState> defaultStateProvider) {
- throw new Unreachable();
+ assert abstractFunction.verifyContainsBaseInFlow(methodParameter);
+ return flowGraph.getState(methodParameter, defaultStateProvider);
}
};
}
- // Otherwise, restrict state lookups to the declared base in flow. This is required for arriving
- // at the correct fix point.
- assert abstractFunction.isIfThenElseAbstractFunction()
- || abstractFunction.isInstanceFieldReadAbstractFunction();
+ // Otherwise, the abstract function is a canonical function, or the abstract function has a
+ // single declared input, meaning we should never perform any state lookups.
+ assert abstractFunction.isIdentity()
+ || abstractFunction.isCastAbstractFunction()
+ || abstractFunction.isUnknownAbstractFunction()
+ || abstractFunction.isUpdateChangedFlagsAbstractFunction();
return new FlowGraphStateProvider() {
@Override
public ValueState getState(DexField field) {
- assert abstractFunction.verifyContainsBaseInFlow(new FieldValue(field));
- return flowGraph.getState(field);
+ throw new Unreachable();
}
@Override
public ValueState getState(
MethodParameter methodParameter, Supplier<ValueState> defaultStateProvider) {
- assert abstractFunction.verifyContainsBaseInFlow(methodParameter);
- return flowGraph.getState(methodParameter, defaultStateProvider);
+ throw new Unreachable();
}
};
}
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java
index 1e24de2..a6da375 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java
@@ -128,10 +128,8 @@
}
@Override
- public boolean hasSingleInFlow() {
- // TODO(b/302281503): This method is used to determine if arbitrary state lookup is allowed.
- // Rename this method.
- return false;
+ public boolean usesFlowGraphStateProvider() {
+ return true;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java
index 893a043..d9c23c4 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java
@@ -69,8 +69,8 @@
}
@Override
- public boolean hasSingleInFlow() {
- return false;
+ public boolean usesFlowGraphStateProvider() {
+ return true;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java
index e17e5b6..a39b534 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java
@@ -84,16 +84,14 @@
FlowGraphStateProvider flowGraphStateProvider) {
if (successorNode.getDebug()) {
List<String> transferFunctionDependencies = new ArrayList<>();
- if (!transferFunction.hasSingleInFlow()) {
- transferFunctionDependencies.add("");
- transferFunctionDependencies.add("TRANSFER FN INPUTS:");
- for (BaseInFlow transferFunctionDependency : transferFunction.getBaseInFlow()) {
- if (!node.equalsBaseInFlow(transferFunctionDependency)) {
- ValueState transferFunctionDependencyState =
- flowGraphStateProvider.getState(transferFunctionDependency, null);
- transferFunctionDependencies.add(" DEP: " + transferFunctionDependency);
- transferFunctionDependencies.add(" DEP STATE: " + transferFunctionDependencyState);
- }
+ transferFunctionDependencies.add("");
+ transferFunctionDependencies.add("TRANSFER FN INPUTS:");
+ for (BaseInFlow transferFunctionDependency : transferFunction.getBaseInFlow()) {
+ if (!node.equalsBaseInFlow(transferFunctionDependency)) {
+ ValueState transferFunctionDependencyState =
+ flowGraphStateProvider.getState(transferFunctionDependency, null);
+ transferFunctionDependencies.add(" DEP: " + transferFunctionDependency);
+ transferFunctionDependencies.add(" DEP STATE: " + transferFunctionDependencyState);
}
}
ValueState newSuccessorState = successorNode.getState();