Extend field optimization info to include if a field has become dead
Change-Id: I1bde23ea158da1f637c482f2afaf028fb35b4234
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/FieldOptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/conversion/FieldOptimizationFeedback.java
index 99c2933..a6d6267 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/FieldOptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/FieldOptimizationFeedback.java
@@ -15,6 +15,8 @@
void markFieldCannotBeKept(DexEncodedField field);
+ void markFieldAsDead(DexEncodedField field);
+
void markFieldAsPropagated(DexEncodedField field);
void markFieldHasDynamicLowerBoundType(DexEncodedField field, ClassTypeLatticeElement type);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
index a30c24f..8248e52 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
@@ -50,6 +50,11 @@
}
@Override
+ public boolean isDead() {
+ return false;
+ }
+
+ @Override
public boolean valueHasBeenPropagated() {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
index 9103459..33a6e75 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
@@ -26,6 +26,8 @@
public abstract TypeLatticeElement getDynamicUpperBoundType();
+ public abstract boolean isDead();
+
public abstract boolean valueHasBeenPropagated();
public boolean isDefaultFieldOptimizationInfo() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index 0626a7b..a4917f2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -24,10 +24,13 @@
*/
public class MutableFieldOptimizationInfo extends FieldOptimizationInfo {
+ private static final int FLAGS_CANNOT_BE_KEPT = 1 << 0;
+ private static final int FLAGS_IS_DEAD = 1 << 1;
+ private static final int FLAGS_VALUE_HAS_BEEN_PROPAGATED = 1 << 2;
+
private AbstractValue abstractValue = UnknownValue.getInstance();
+ private int flags;
private int readBits = 0;
- private boolean cannotBeKept = false;
- private boolean valueHasBeenPropagated = false;
private ClassTypeLatticeElement dynamicLowerBoundType = null;
private TypeLatticeElement dynamicUpperBoundType = null;
@@ -52,8 +55,7 @@
@Override
public MutableFieldOptimizationInfo mutableCopy() {
MutableFieldOptimizationInfo copy = new MutableFieldOptimizationInfo();
- copy.cannotBeKept = cannotBeKept();
- copy.valueHasBeenPropagated = valueHasBeenPropagated();
+ copy.flags = flags;
return copy;
}
@@ -62,7 +64,7 @@
return abstractValue;
}
- public void setAbstractValue(AbstractValue abstractValue) {
+ void setAbstractValue(AbstractValue abstractValue) {
this.abstractValue = abstractValue;
}
@@ -81,11 +83,11 @@
@Override
public boolean cannotBeKept() {
- return cannotBeKept;
+ return (flags & FLAGS_CANNOT_BE_KEPT) != 0;
}
void markCannotBeKept() {
- cannotBeKept = true;
+ flags |= FLAGS_CANNOT_BE_KEPT;
}
@Override
@@ -107,12 +109,21 @@
}
@Override
+ public boolean isDead() {
+ return (flags & FLAGS_IS_DEAD) != 0;
+ }
+
+ void markAsDead() {
+ flags |= FLAGS_IS_DEAD;
+ }
+
+ @Override
public boolean valueHasBeenPropagated() {
- return valueHasBeenPropagated;
+ return (flags & FLAGS_VALUE_HAS_BEEN_PROPAGATED) != 0;
}
void markAsPropagated() {
- valueHasBeenPropagated = true;
+ flags |= FLAGS_VALUE_HAS_BEEN_PROPAGATED;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index c241c0a..e33b617 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -116,6 +116,11 @@
}
@Override
+ public void markFieldAsDead(DexEncodedField field) {
+ getFieldOptimizationInfoForUpdating(field).markAsDead();
+ }
+
+ @Override
public void markFieldAsPropagated(DexEncodedField field) {
getFieldOptimizationInfoForUpdating(field).markAsPropagated();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
index ee5a745..5d0f4ef 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
@@ -34,6 +34,9 @@
public void markFieldCannotBeKept(DexEncodedField field) {}
@Override
+ public void markFieldAsDead(DexEncodedField field) {}
+
+ @Override
public void markFieldAsPropagated(DexEncodedField field) {}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
index ad3080b..b258bdf 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
@@ -36,6 +36,11 @@
}
@Override
+ public void markFieldAsDead(DexEncodedField field) {
+ field.getMutableOptimizationInfo().markAsDead();
+ }
+
+ @Override
public void markFieldAsPropagated(DexEncodedField field) {
field.getMutableOptimizationInfo().markAsPropagated();
}