aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Zerny <zerny@google.com>2017-08-18 10:38:46 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-08-18 10:38:46 +0000
commit4c93257b8ddc4f75b68322a0d1c2b7735f2a9af9 (patch)
tree50c46f5147ade9e1b4cd517bdde0d3ba6fb00cf8
parent7e81006803f88ab4e40d9811952c7fc1c5658f4b (diff)
parent6bbbad5385eadc465e509ee80972a07303940f87 (diff)
downloadr8-4c93257b8ddc4f75b68322a0d1c2b7735f2a9af9.tar.gz
Merge "Eliminate debug-moves if their preceding phi-move is sufficient."
-rw-r--r--src/main/java/com/android/tools/r8/ir/code/Value.java8
-rw-r--r--src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java4
-rw-r--r--src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java32
3 files changed, 43 insertions, 1 deletions
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 bf935307f..b6c593c07 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
@@ -71,7 +71,7 @@ public class Value {
private boolean isThis = false;
private boolean isArgument = false;
private LongInterval valueRange;
- private final DebugData debugData;
+ private DebugData debugData;
public Value(int number, MoveType type, DebugInfo debugInfo) {
this.number = number;
@@ -95,6 +95,12 @@ public class Value {
return type.requiredRegisters();
}
+ public void setDebugInfo(DebugInfo info) {
+ assert info != null;
+ assert debugData == null;
+ debugData = new DebugData(info);
+ }
+
public DebugInfo getDebugInfo() {
return debugData == null ? null : new DebugInfo(debugData.local, debugData.previousLocalValue);
}
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 fad378eaf..a68f29b9b 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
@@ -438,6 +438,10 @@ public class IRConverter {
printC1VisualizerHeader(method);
printMethod(code, "Initial IR (SSA)");
+ if (options.debug) {
+ codeRewriter.simplifyDebugLocals(code);
+ }
+
if (!method.isProcessed()) {
if (protoLiteRewriter != null && protoLiteRewriter.appliesTo(method)) {
protoLiteRewriter.rewriteProtoLiteSpecialMethod(code, method);
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 78d8369e3..b4aaa86eb 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
@@ -37,6 +37,7 @@ import com.android.tools.r8.ir.code.Cmp.Bias;
import com.android.tools.r8.ir.code.ConstInstruction;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
+import com.android.tools.r8.ir.code.DebugLocalWrite;
import com.android.tools.r8.ir.code.DominatorTree;
import com.android.tools.r8.ir.code.Goto;
import com.android.tools.r8.ir.code.IRCode;
@@ -1146,6 +1147,37 @@ public class CodeRewriter {
}
}
+ public void simplifyDebugLocals(IRCode code) {
+ for (BasicBlock block : code.blocks) {
+ for (Phi phi : block.getPhis()) {
+ if (phi.getDebugInfo() == null && phi.numberOfUsers() == 1 && phi.numberOfAllUsers() == 1) {
+ Instruction instruction = phi.uniqueUsers().iterator().next();
+ if (instruction.isDebugLocalWrite()) {
+ removeDebugWriteOfPhi(phi, instruction.asDebugLocalWrite());
+ }
+ }
+ }
+ }
+ }
+
+ private void removeDebugWriteOfPhi(Phi phi, DebugLocalWrite write) {
+ assert write.src() == phi;
+ Value previousLocalValue = write.getPreviousLocalValue();
+ if (previousLocalValue != null) {
+ if (phi.getOperands().contains(previousLocalValue)) {
+ // The phi is explicitly redefining the local already.
+ previousLocalValue.removeDebugUser(write);
+ } else {
+ // If the phi would redefine a local the debug-write instruction must remain.
+ return;
+ }
+ }
+ phi.setDebugInfo(write.getDebugInfo());
+ phi.removeUser(write);
+ write.outValue().replaceUsers(phi);
+ write.getBlock().removeInstruction(write);
+ }
+
private static class ExpressionEquivalence extends Equivalence<Instruction> {
@Override