Fix missing type propagation in constant propagation

Change-Id: I53724eae38aea9297c9769bb5130ad9b0e751d9d
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
index be72b24..54d5160 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.constant;
 
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.IRCode;
@@ -14,6 +16,7 @@
 import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.code.StringSwitch;
 import com.android.tools.r8.ir.code.Value;
+import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Deque;
@@ -21,6 +24,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Implementation of Sparse Conditional Constant Propagation from the paper of Wegman and Zadeck
@@ -29,6 +33,7 @@
  */
 public class SparseConditionalConstantPropagation {
 
+  private final AppView<?> appView;
   private final IRCode code;
   private final Map<Value, LatticeElement> mapping = new HashMap<>();
   private final Deque<Value> ssaEdges = new LinkedList<>();
@@ -37,7 +42,8 @@
   private final BitSet[] executableFlowEdges;
   private final BitSet visitedBlocks;
 
-  public SparseConditionalConstantPropagation(IRCode code) {
+  public SparseConditionalConstantPropagation(AppView<?> appView, IRCode code) {
+    this.appView = appView;
     this.code = code;
     nextBlockNumber = code.getHighestBlockNumber() + 1;
     executableFlowEdges = new BitSet[nextBlockNumber];
@@ -45,7 +51,6 @@
   }
 
   public void run() {
-
     BasicBlock firstBlock = code.entryBlock();
     visitInstructions(firstBlock);
 
@@ -77,8 +82,8 @@
   }
 
   private void rewriteCode() {
+    Set<Value> affectedValues = Sets.newIdentityHashSet();
     List<BasicBlock> blockToAnalyze = new ArrayList<>();
-
     mapping.entrySet().stream()
         .filter(entry -> entry.getValue().isConst())
         .forEach(
@@ -86,6 +91,7 @@
               Value value = entry.getKey();
               ConstNumber evaluatedConst = entry.getValue().asConst().getConstNumber();
               if (value.definition != evaluatedConst) {
+                value.addAffectedValuesTo(affectedValues);
                 if (value.isPhi()) {
                   // D8 relies on dead code removal to get rid of the dead phi itself.
                   if (value.hasAnyUsers()) {
@@ -112,11 +118,12 @@
                 }
               }
             });
-
     for (BasicBlock block : blockToAnalyze) {
       block.deduplicatePhis();
     }
-
+    if (!affectedValues.isEmpty()) {
+      new TypeAnalysis(appView).narrowing(affectedValues);
+    }
     code.removeAllDeadAndTrivialPhis();
   }
 
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 844ccce..dd481a9 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
@@ -1370,7 +1370,7 @@
     codeRewriter.splitRangeInvokeConstants(code);
     timing.end();
     timing.begin("Propogate sparse conditionals");
-    new SparseConditionalConstantPropagation(code).run();
+    new SparseConditionalConstantPropagation(appView, code).run();
     timing.end();
     timing.begin("Rewrite always throwing invokes");
     codeRewriter.processMethodsNeverReturningNormally(code);