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