diff options
author | Ian Zerny <zerny@google.com> | 2017-08-18 10:38:46 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-08-18 10:38:46 +0000 |
commit | 4c93257b8ddc4f75b68322a0d1c2b7735f2a9af9 (patch) | |
tree | 50c46f5147ade9e1b4cd517bdde0d3ba6fb00cf8 | |
parent | 7e81006803f88ab4e40d9811952c7fc1c5658f4b (diff) | |
parent | 6bbbad5385eadc465e509ee80972a07303940f87 (diff) | |
download | r8-4c93257b8ddc4f75b68322a0d1c2b7735f2a9af9.tar.gz |
Merge "Eliminate debug-moves if their preceding phi-move is sufficient."
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 |