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() {