Add hasLocalInfo method into Value

Change-Id: I4978f1e5e6786e6e7053db2139780776bd9d2e59
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
index aebb9ed..131e0d0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
@@ -346,7 +346,7 @@
     assert invoke.inValues().size() == arguments.size();
     for (int i = 0; i < invoke.inValues().size(); i++) {
       // TODO(zerny): Support inlining in --debug mode.
-      assert arguments.get(i).getLocalInfo() == null;
+      assert !arguments.get(i).hasLocalInfo();
       if ((i == 0) && (downcast != null)) {
         Value invokeValue = invoke.inValues().get(0);
         Value receiverValue = arguments.get(0);
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
index a96b673..d3d5553 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
@@ -18,7 +18,7 @@
 
   public DebugLocalWrite(Value dest, Value src) {
     super(dest, src);
-    assert dest.getLocalInfo() != null;
+    assert dest.hasLocalInfo();
     assert dest.getLocalInfo() != src.getLocalInfo() || src.isPhi();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 20bba3f..2e8b683 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -246,7 +246,7 @@
       assert phiUser.getOperands().contains(value);
       assert phiUser.getBlock().getPhis().contains(phiUser);
     }
-    if (value.getLocalInfo() != null) {
+    if (value.hasLocalInfo()) {
       for (Instruction debugUser : value.debugUsers()) {
         assert debugUser.getDebugValues().contains(value);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index 15291a5..21c2abf 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -59,7 +59,7 @@
 
   public boolean hasInValueWithLocalInfo() {
     for (Value inValue : inValues()) {
-      if (inValue.getLocalInfo() != null) {
+      if (inValue.hasLocalInfo()) {
         return true;
       }
     }
@@ -79,7 +79,7 @@
   }
 
   public void addDebugValue(Value value) {
-    assert value.getLocalInfo() != null;
+    assert value.hasLocalInfo();
     if (debugValues == null) {
       debugValues = new HashSet<>();
     }
@@ -116,7 +116,7 @@
 
   public void replaceDebugValue(Value oldValue, Value newValue) {
     if (debugValues.remove(oldValue)) {
-      if (newValue.getLocalInfo() != null) {
+      if (newValue.hasLocalInfo()) {
         // TODO(zerny): Insert a write if replacing a phi with different debug-local info.
         addDebugValue(newValue);
       }
@@ -141,7 +141,7 @@
   }
 
   public void removeDebugValue(Value value) {
-    assert value.getLocalInfo() != null;
+    assert value.hasLocalInfo();
     if (debugValues != null) {
       assert debugValues.contains(value);
       if (debugValues.remove(value)) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index a644470..22c8380 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -100,7 +100,7 @@
   }
 
   public void addDebugValue(Value value) {
-    assert value.getLocalInfo() != null;
+    assert value.hasLocalInfo();
     if (debugValues == null) {
       debugValues = new HashSet<>();
     }
@@ -165,7 +165,7 @@
   }
 
   void replaceDebugValue(Value current, Value newValue) {
-    assert current.getLocalInfo() != null;
+    assert current.hasLocalInfo();
     assert current.getLocalInfo() == newValue.getLocalInfo();
     if (debugValues.remove(current)) {
       addDebugValue(newValue);
@@ -240,7 +240,7 @@
     StringBuilder builder = new StringBuilder();
     builder.append("v");
     builder.append(number);
-    if (getLocalInfo() != null) {
+    if (hasLocalInfo()) {
       builder.append("(").append(getLocalInfo()).append(")");
     }
     builder.append(" <- phi");
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 61bd315..1915155 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
@@ -114,6 +114,10 @@
     return debugData == null ? null : debugData.local;
   }
 
+  public boolean hasLocalInfo() {
+    return getLocalInfo() != null;
+  }
+
   public void setLocalInfo(DebugLocalInfo local) {
     assert local != null;
     assert debugData == null;
@@ -316,12 +320,12 @@
   }
 
   public void addDebugUser(Instruction user) {
-    assert getLocalInfo() != null;
+    assert hasLocalInfo();
     debugData.users.putIfAbsent(user, DebugUse.LIVE);
   }
 
   public void addDebugPhiUser(Phi user) {
-    assert getLocalInfo() != null;
+    assert hasLocalInfo();
     debugData.phiUsers.add(user);
   }
 
@@ -453,8 +457,7 @@
     builder.append("v");
     builder.append(number);
     boolean isConstant = definition != null && definition.isConstNumber();
-    boolean hasLocalInfo = getLocalInfo() != null;
-    if (isConstant || hasLocalInfo) {
+    if (isConstant || hasLocalInfo()) {
       builder.append("(");
       if (isConstant) {
         ConstNumber constNumber = definition.asConstNumber();
@@ -464,10 +467,10 @@
           builder.append(constNumber.getRawValue());
         }
       }
-      if (isConstant && hasLocalInfo) {
+      if (isConstant && hasLocalInfo()) {
         builder.append(", ");
       }
-      if (hasLocalInfo) {
+      if (hasLocalInfo()) {
         builder.append(getLocalInfo());
       }
       builder.append(")");
@@ -496,7 +499,7 @@
   }
 
   public boolean isConstant() {
-    return definition.isOutConstant() && getLocalInfo() == null;
+    return definition.isOutConstant() && !hasLocalInfo();
   }
 
   public boolean isPhi() {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index fc516e4..91b51f4 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -546,7 +546,7 @@
     }
     Value value = writeRegister(register, MoveType.fromConstType(type), ThrowingInfo.NO_THROW,
         null);
-    assert value.getLocalInfo() == null;
+    assert !value.hasLocalInfo();
     addInstruction(new DebugLocalUninitialized(type, value));
   }
 
@@ -1183,7 +1183,7 @@
 
   public void addMoveException(int dest) {
     Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.NO_THROW);
-    assert out.getLocalInfo() == null;
+    assert !out.hasLocalInfo();
     MoveException instruction = new MoveException(out);
     assert !instruction.instructionTypeCanThrow();
     if (!currentBlock.getInstructions().isEmpty()
@@ -1549,7 +1549,7 @@
     // If this assert triggers, the probable cause is that we end up reading an SSA value
     // after it should have been ended on a fallthrough from a conditional jump or a trivial-phi
     // removal resurrected the local.
-    assert value.getLocalInfo() == null
+    assert !value.hasLocalInfo()
         || value.getDebugLocalEnds() != null
         || source.verifyLocalInScope(value.getLocalInfo());
     return value;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index ca307f4..810039f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -803,7 +803,7 @@
       Instruction current = iterator.next();
       if (current.isInvokeMethod()) {
         InvokeMethod invoke = current.asInvokeMethod();
-        if (invoke.outValue() != null && invoke.outValue().getLocalInfo() == null) {
+        if (invoke.outValue() != null && !invoke.outValue().hasLocalInfo()) {
           boolean isLibraryMethodReturningReceiver =
               libraryMethodsReturningReceiver.contains(invoke.getInvokedMethod());
           if (isLibraryMethodReturningReceiver) {
@@ -1165,7 +1165,7 @@
       Instruction instruction = it.next();
       if (instruction.isConstNumber() &&
           instruction.outValue().numberOfAllUsers() != 0 &&
-          instruction.outValue().getLocalInfo() == null) {
+          !instruction.outValue().hasLocalInfo()) {
         // Collect the blocks for all users of the constant.
         List<BasicBlock> userBlocks = new LinkedList<>();
         for (Instruction user : instruction.outValue().uniqueUsers()) {
@@ -1464,7 +1464,7 @@
   public void simplifyDebugLocals(IRCode code) {
     for (BasicBlock block : code.blocks) {
       for (Phi phi : block.getPhis()) {
-        if (phi.getLocalInfo() == null && phi.numberOfUsers() == 1 && phi.numberOfAllUsers() == 1) {
+        if (!phi.hasLocalInfo() && phi.numberOfUsers() == 1 && phi.numberOfAllUsers() == 1) {
           Instruction instruction = phi.uniqueUsers().iterator().next();
           if (instruction.isDebugLocalWrite()) {
             removeDebugWriteOfPhi(phi, instruction.asDebugLocalWrite());
@@ -1480,7 +1480,7 @@
           Value inValue = instruction.inValues().get(0);
           if (inValue.definition != null &&
               !hasLineChangeBetween(inValue.definition, instruction) &&
-              inValue.getLocalInfo() == null &&
+              !inValue.hasLocalInfo() &&
               inValue.numberOfAllUsers() == 1) {
             inValue.setLocalInfo(instruction.outValue().getLocalInfo());
             instruction.moveDebugValues(inValue.definition);
@@ -1551,7 +1551,7 @@
         }
         // Copy over each debug value replacing phi values of this block by their operands.
         for (Value value : origInstruction.getDebugValues()) {
-          assert value.getLocalInfo() != null;
+          assert value.hasLocalInfo();
           if (value.isPhi() && block.getPhis().contains(value)) {
             Phi phi = value.asPhi();
             Value operand = phi.getOperand(predIndex);
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 7facea6..7a2dc4a 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -83,7 +83,7 @@
     final int end;
 
     LocalRange(Value value, int register, int start, int end) {
-      assert value.getLocalInfo() != null;
+      assert value.hasLocalInfo();
       this.value = value;
       this.local = value.getLocalInfo();
       this.register = register;
@@ -228,7 +228,7 @@
     List<LocalRange> ranges = new ArrayList<>();
     for (LiveIntervals interval : liveIntervals) {
       Value value = interval.getValue();
-      if (value.getLocalInfo() == null) {
+      if (!value.hasLocalInfo()) {
         continue;
       }
       List<Integer> starts = ListUtils.map(value.getDebugLocalStarts(), Instruction::getNumber);