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();
   }