Merge "Don't consider local-associated SSA values as constants."
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 06ebe60..7d01462 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -398,6 +398,12 @@
     internal.keepRules = proguardConfiguration.getRules();
     internal.dontWarnPatterns = proguardConfiguration.getDontWarnPatterns();
     internal.outputMode = getOutputMode();
+    if (internal.debug) {
+      // TODO(zerny): Should we support removeSwitchMaps in debug mode? b/62936642
+      internal.removeSwitchMaps = false;
+      // TODO(zerny): Should we support inlining in debug mode? b/62937285
+      internal.inlineAccessors = false;
+    }
     return internal;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 0ccf076..6c5fbb7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -28,7 +28,7 @@
     // We create const numbers after register allocation for rematerialization of values. Those
     // are all for fixed register values. All other values that are used as the destination for
     // const number instructions should be marked as constants.
-    assert dest.isFixedRegisterValue() || dest.isConstant();
+    assert dest.isFixedRegisterValue() || dest.definition.isConstNumber();
     assert type != ConstType.OBJECT;
     this.type = type;
     this.value = value;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index 6487631..4136c6a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -341,9 +341,6 @@
   }
 
   public boolean internalComputeNeedsRegister() {
-    if (getLocalInfo() != null) {
-      return true;
-    }
     if (!isConstant()) {
       return true;
     }
@@ -368,7 +365,7 @@
     StringBuilder builder = new StringBuilder();
     builder.append("v");
     builder.append(number);
-    boolean isConstant = definition != null && isConstant();
+    boolean isConstant = definition != null && definition.isConstNumber();
     boolean hasLocalInfo = getLocalInfo() != null;
     if (isConstant || hasLocalInfo) {
       builder.append("(");
@@ -396,12 +393,12 @@
   }
 
   public ConstInstruction getConstInstruction() {
-    assert definition.isOutConstant();
+    assert isConstant();
     return definition.getOutConstantConstInstruction();
   }
 
   public boolean isConstant() {
-    return definition.isOutConstant();
+    return definition.isOutConstant() && getLocalInfo() == null;
   }
 
   public boolean isPhi() {
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 a787025..f58ea72 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
@@ -433,9 +433,13 @@
       memberValuePropagation.rewriteWithConstantValues(code);
     }
     if (options.removeSwitchMaps) {
+      // TODO(zerny): Should we support removeSwitchMaps in debug mode? b/62936642
+      assert !options.debug;
       codeRewriter.removeSwitchMaps(code);
     }
     if (options.inlineAccessors && inliner != null) {
+      // TODO(zerny): Should we support inlining in debug mode? b/62937285
+      assert !options.debug;
       inliner.performInlining(method, code, callGraph);
     }
     codeRewriter.rewriteLongCompareAndRequireNonNull(code, options.canUseObjectsNonNull());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
index 839a51b..b5b0bd3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
@@ -215,7 +215,7 @@
         } else if (current.outValue() != null && current.outValue().needsRegister()) {
           Value outValue = current.outValue();
           int instructionNumber = current.getNumber();
-          if (current.isConstNumber()) {
+          if (outValue.isConstant() && current.isConstNumber()) {
             if (constantSpilledAtDefinition(current.asConstNumber(), allocator)) {
               // Remove constant instructions that are spilled at their definition and are
               // therefore unused.
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java b/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
index f01ed3a..06b33f4 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
@@ -85,7 +85,7 @@
   }
 
   public boolean isRematerializable(LinearScanRegisterAllocator registerAllocator) {
-    if (value.isPhi() || !value.definition.isConstNumber()) {
+    if (!value.isConstant()) {
       return false;
     }
     // If one of the non-spilled splits uses a register that is higher than U8BIT_MAX we cannot
@@ -420,7 +420,7 @@
   }
 
   public boolean isConstantNumberInterval() {
-    return value.definition != null && value.definition.isConstNumber();
+    return value.definition != null && value.isConstant();
   }
 
   public int numberOfUsesWithConstraint() {