Always consider const string instructions as potentially throwing.
Bug: 179769995
Change-Id: I6f1efccae8e7b629bcc6d7db24b85fa7211f9561
diff --git a/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java b/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java
index 339f961..faf9046 100644
--- a/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/LoadStoreHelper.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstClass;
import com.android.tools.r8.ir.code.ConstInstruction;
import com.android.tools.r8.ir.code.ConstNumber;
@@ -264,15 +263,11 @@
if (constant.isConstNumber()) {
return new ConstNumber(stackValue, constant.asConstNumber().getRawValue());
} else if (constant.isConstString()) {
- return new ConstString(
- stackValue, constant.asConstString().getValue(), ThrowingInfo.NO_THROW);
+ return new ConstString(stackValue, constant.asConstString().getValue());
} else if (constant.isDexItemBasedConstString()) {
DexItemBasedConstString computedConstant = constant.asDexItemBasedConstString();
return new DexItemBasedConstString(
- stackValue,
- computedConstant.getItem(),
- computedConstant.getNameComputationInfo(),
- ThrowingInfo.NO_THROW);
+ stackValue, computedConstant.getItem(), computedConstant.getNameComputationInfo());
} else if (constant.isConstClass()) {
return new ConstClass(stackValue, constant.asConstClass().getValue());
} else {
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 4d45d55..4247d74 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -5,7 +5,6 @@
import static com.android.tools.r8.graph.DexCode.FAKE_THIS_PREFIX;
import static com.android.tools.r8.graph.DexCode.FAKE_THIS_SUFFIX;
-import static com.android.tools.r8.ir.conversion.CfSourceCode.canThrowHelper;
import static org.objectweb.asm.Opcodes.ACC_STATIC;
import com.android.tools.r8.cf.CfPrinter;
@@ -803,7 +802,7 @@
// Check the exceptional edge prior to evaluating the instruction. The local state is stable
// at this point as store operations are not throwing and the current stack does not
// affect the exceptional transfer (the exception edge is always a singleton stack).
- if (canThrowHelper(instruction, appView.options().isGeneratingClassFiles())) {
+ if (instruction.canThrow()) {
assert !instruction.isStore();
builder.verifyExceptionEdges();
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java
index 3c17c60..52a57bf 100644
--- a/src/main/java/com/android/tools/r8/graph/DexValue.java
+++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.AbstractValueFactory;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstInstruction;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.DexItemBasedConstString;
@@ -1253,8 +1252,7 @@
AppView<? extends AppInfoWithClassHierarchy> appView, IRCode code, DebugLocalInfo local) {
TypeElement type = TypeElement.stringClassType(appView, definitelyNotNull());
Value outValue = code.createValue(type, local);
- ConstString instruction =
- new ConstString(outValue, value, ThrowingInfo.defaultForConstString(appView.options()));
+ ConstString instruction = new ConstString(outValue, value);
if (!instruction.instructionInstanceCanThrow()) {
return instruction;
}
@@ -1346,11 +1344,7 @@
TypeElement type = TypeElement.stringClassType(appView, definitelyNotNull());
Value outValue = code.createValue(type, local);
DexItemBasedConstString instruction =
- new DexItemBasedConstString(
- outValue,
- value,
- nameComputationInfo,
- ThrowingInfo.defaultForConstString(appView.options()));
+ new DexItemBasedConstString(outValue, value, nameComputationInfo);
// DexItemBasedConstString cannot throw.
assert !instruction.instructionInstanceCanThrow();
return instruction;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
index ab3673e..1053b49 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -18,7 +18,6 @@
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.ArrayPut;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.IRCodeUtils;
@@ -45,7 +44,6 @@
private final RawMessageInfoDecoder decoder;
private final RawMessageInfoEncoder encoder;
private final ProtoReferences references;
- private final ThrowingInfo throwingInfo;
private final TypeElement objectArrayType;
private final TypeElement stringType;
@@ -58,7 +56,6 @@
this.decoder = decoder;
this.encoder = new RawMessageInfoEncoder(appView.dexItemFactory());
this.references = references;
- this.throwingInfo = ThrowingInfo.defaultForConstString(appView.options());
// Types.
this.objectArrayType =
@@ -154,9 +151,7 @@
private void rewriteInfoArgumentToNewMessageInfo(
IRCode code, Value infoValue, ProtoMessageInfo protoMessageInfo) {
infoValue.definition.replace(
- new ConstString(
- code.createValue(stringType), encoder.encodeInfo(protoMessageInfo), throwingInfo),
- code);
+ new ConstString(code.createValue(stringType), encoder.encodeInfo(protoMessageInfo)), code);
}
private void rewriteObjectsArgumentToNewMessageInfo(
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/LiveProtoFieldObject.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/LiveProtoFieldObject.java
index 308ea07..4727869 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/LiveProtoFieldObject.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/LiveProtoFieldObject.java
@@ -34,10 +34,9 @@
code.createValue(TypeElement.stringClassType(appView, Nullability.definitelyNotNull()));
ThrowingInfo throwingInfo = ThrowingInfo.defaultForConstString(appView.options());
if (appView.options().isMinifying()) {
- return new DexItemBasedConstString(
- value, field, FieldNameComputationInfo.forFieldName(), throwingInfo);
+ return new DexItemBasedConstString(value, field, FieldNameComputationInfo.forFieldName());
}
- return new ConstString(value, field.name, throwingInfo);
+ return new ConstString(value, field.name);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
index 88ea973..f2d8962 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.analysis.type.TypeElement;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.DexItemBasedConstString;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
@@ -78,11 +77,7 @@
Value returnedValue =
code.createValue(stringClassType(appView, definitelyNotNull()), debugLocalInfo);
DexItemBasedConstString instruction =
- new DexItemBasedConstString(
- returnedValue,
- item,
- nameComputationInfo,
- ThrowingInfo.defaultForConstString(appView.options()));
+ new DexItemBasedConstString(returnedValue, item, nameComputationInfo);
assert !instruction.instructionInstanceCanThrow();
return instruction;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
index e494c43..cd0c9e9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.analysis.type.TypeElement;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
@@ -73,9 +72,7 @@
.isTrue();
Value returnedValue =
code.createValue(stringClassType(appView, definitelyNotNull()), debugLocalInfo);
- ConstString instruction =
- new ConstString(
- returnedValue, string, ThrowingInfo.defaultForConstString(appView.options()));
+ ConstString instruction = new ConstString(returnedValue, string);
assert !instruction.instructionInstanceCanThrow();
return instruction;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
index 93b95e7..f873fd8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -17,7 +17,6 @@
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
import com.android.tools.r8.ir.optimize.DeadCodeRemover.DeadInstructionResult;
@@ -27,12 +26,10 @@
public class ConstString extends ConstInstruction {
private final DexString value;
- private final ThrowingInfo throwingInfo;
- public ConstString(Value dest, DexString value, ThrowingInfo throwingInfo) {
+ public ConstString(Value dest, DexString value) {
super(dest);
this.value = value;
- this.throwingInfo = throwingInfo;
}
@Override
@@ -53,7 +50,7 @@
public static ConstString copyOf(Value newValue, ConstString original) {
assert newValue != original.outValue();
- return new ConstString(newValue, original.getValue(), original.throwingInfo);
+ return new ConstString(newValue, original.getValue());
}
public Value dest() {
@@ -98,7 +95,7 @@
@Override
public boolean instructionTypeCanThrow() {
- return throwingInfo == ThrowingInfo.CAN_THROW;
+ return true;
}
@Override
@@ -118,9 +115,6 @@
@Override
public boolean instructionInstanceCanThrow() {
- if (throwingInfo == ThrowingInfo.NO_THROW) {
- return false;
- }
// The const-string instruction can be a throwing instruction in DEX, if decode() fails.
try {
value.toString();
diff --git a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
index 9c209c9..4c8c646 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.ir.analysis.type.Nullability;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
import com.android.tools.r8.ir.optimize.DeadCodeRemover.DeadInstructionResult;
@@ -27,17 +26,12 @@
private final DexReference item;
private final NameComputationInfo<?> nameComputationInfo;
- private final ThrowingInfo throwingInfo;
public DexItemBasedConstString(
- Value dest,
- DexReference item,
- NameComputationInfo<?> nameComputationInfo,
- ThrowingInfo throwingInfo) {
+ Value dest, DexReference item, NameComputationInfo<?> nameComputationInfo) {
super(dest);
this.item = item;
this.nameComputationInfo = nameComputationInfo;
- this.throwingInfo = throwingInfo;
}
@Override
@@ -58,8 +52,7 @@
public static DexItemBasedConstString copyOf(Value newValue, DexItemBasedConstString original) {
assert newValue != original.outValue();
- return new DexItemBasedConstString(
- newValue, original.getItem(), original.nameComputationInfo, original.throwingInfo);
+ return new DexItemBasedConstString(newValue, original.getItem(), original.nameComputationInfo);
}
public DexReference getItem() {
@@ -118,7 +111,7 @@
@Override
public boolean instructionTypeCanThrow() {
- return throwingInfo == ThrowingInfo.CAN_THROW;
+ return true;
}
@Override
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 36eeadf..cbc8c6b 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
@@ -19,7 +19,6 @@
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.Nullability;
import com.android.tools.r8.ir.analysis.type.TypeElement;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.Phi.RegisterReadType;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.origin.Origin;
@@ -1148,7 +1147,7 @@
public ConstString createStringConstant(
AppView<?> appView, DexString value, DebugLocalInfo local) {
Value out = createValue(TypeElement.stringClassType(appView, definitelyNotNull()), local);
- return new ConstString(out, value, ThrowingInfo.defaultForConstString(appView.options()));
+ return new ConstString(out, value);
}
public Phi createPhi(BasicBlock block, TypeElement type) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index 5df390f..50ba68b 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -293,28 +293,13 @@
@Override
public void clear() {}
- // Utility method that treats constant strings as not throwing in the case of having CF output.
- // This is the only instruction that differ in throwing between DEX and CF. If we find more
- // consider rewriting CfInstruction.canThrow to take in options.
- private boolean canThrowHelper(CfInstruction instruction) {
- return canThrowHelper(instruction, internalOutputMode.isGeneratingClassFiles());
- }
-
- public static boolean canThrowHelper(CfInstruction instruction, boolean isGeneratingClassFiles) {
- if (isGeneratingClassFiles
- && (instruction.isConstString() || instruction.isDexItemBasedConstString())) {
- return false;
- }
- return instruction.canThrow();
- }
-
@Override
public int traceInstruction(int instructionIndex, IRBuilder builder) {
CfInstruction instruction = code.getInstructions().get(instructionIndex);
AppView<?> appView = builder.appView;
assert appView.options().isGeneratingClassFiles()
== internalOutputMode.isGeneratingClassFiles();
- if (canThrowHelper(instruction)) {
+ if (instruction.canThrow()) {
TryHandlerList tryHandlers = getTryHandlers(instructionIndex, appView.dexItemFactory());
if (!tryHandlers.isEmpty()) {
// Ensure the block starts at the start of the try-range (don't enqueue, not a target).
@@ -537,7 +522,7 @@
assert currentBlockInfo != null;
setLocalVariableLists();
- if (canThrowHelper(instruction)) {
+ if (instruction.canThrow()) {
Snapshot exceptionTransfer =
state.getSnapshot().exceptionTransfer(builder.appView.dexItemFactory().throwableType);
for (int target : currentBlockInfo.exceptionalSuccessors) {
@@ -858,7 +843,7 @@
@Override
public boolean verifyCurrentInstructionCanThrow() {
return isCurrentlyGeneratingMethodSynchronization()
- || canThrowHelper(code.getInstructions().get(currentInstructionIndex));
+ || code.getInstructions().get(currentInstructionIndex).canThrow();
}
@Override
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 1bee2d4..93c61ab 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
@@ -1272,15 +1272,13 @@
}
private ThrowingInfo throwingInfoForConstStrings() {
- return appView.options().isGeneratingClassFiles()
- ? ThrowingInfo.NO_THROW
- : ThrowingInfo.CAN_THROW;
+ return ThrowingInfo.CAN_THROW;
}
public void addConstString(int dest, DexString string) {
TypeElement typeLattice = TypeElement.stringClassType(appView, definitelyNotNull());
ThrowingInfo throwingInfo = throwingInfoForConstStrings();
- add(new ConstString(writeRegister(dest, typeLattice, throwingInfo), string, throwingInfo));
+ add(new ConstString(writeRegister(dest, typeLattice, throwingInfo), string));
}
public void addDexItemBasedConstString(
@@ -1288,7 +1286,7 @@
TypeElement typeLattice = TypeElement.stringClassType(appView, definitelyNotNull());
ThrowingInfo throwingInfo = throwingInfoForConstStrings();
Value out = writeRegister(dest, typeLattice, throwingInfo);
- add(new DexItemBasedConstString(out, item, nameComputationInfo, throwingInfo));
+ add(new DexItemBasedConstString(out, item, nameComputationInfo));
}
public void addDiv(NumericType type, int dest, int left, int right) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
index fec0919..845793f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.ir.analysis.type.PrimitiveTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.Goto;
import com.android.tools.r8.ir.code.IRCode;
@@ -50,13 +49,11 @@
private final AppView<?> appView;
private final IdentifierNameStringMarker identifierNameStringMarker;
private final ClassTypeElement stringType;
- private final ThrowingInfo throwingInfo;
StringSwitchRemover(AppView<?> appView, IdentifierNameStringMarker identifierNameStringMarker) {
this.appView = appView;
this.identifierNameStringMarker = identifierNameStringMarker;
this.stringType = TypeElement.stringClassType(appView, definitelyNotNull());
- this.throwingInfo = ThrowingInfo.defaultForConstString(appView.options());
}
void run(IRCode code) {
@@ -222,7 +219,7 @@
BasicBlock previous = null;
for (Entry<DexString, BasicBlock> entry : structure.entrySet()) {
ConstString constStringInstruction =
- new ConstString(code.createValue(stringType), entry.getKey(), throwingInfo);
+ new ConstString(code.createValue(stringType), entry.getKey());
constStringInstruction.setPosition(position);
InvokeVirtual invokeInstruction =
new InvokeVirtual(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java
index 4b33d2f..514ee97 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java
@@ -18,7 +18,6 @@
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
@@ -441,11 +440,7 @@
@Override
Value getOrCreateValue() {
Value value = code.createValue(TypeElement.stringClassType(appView, definitelyNotNull()));
- appendInstruction(
- new ConstString(
- value,
- factory.createString(str),
- ThrowingInfo.defaultForConstString(appView.options())));
+ appendInstruction(new ConstString(value, factory.createString(str)));
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 0713d06..d01470e 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
@@ -39,7 +39,6 @@
import com.android.tools.r8.ir.code.ArrayPut;
import com.android.tools.r8.ir.code.Assume;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.Binop;
import com.android.tools.r8.ir.code.CatchHandlers;
import com.android.tools.r8.ir.code.CheckCast;
@@ -3634,9 +3633,7 @@
private Value addConstString(IRCode code, InstructionListIterator iterator, String s) {
TypeElement typeLattice = TypeElement.stringClassType(appView, definitelyNotNull());
Value value = code.createValue(typeLattice);
- ThrowingInfo throwingInfo =
- options.isGeneratingClassFiles() ? ThrowingInfo.NO_THROW : ThrowingInfo.CAN_THROW;
- iterator.add(new ConstString(value, dexItemFactory.createString(s), throwingInfo));
+ iterator.add(new ConstString(value, dexItemFactory.createString(s)));
return value;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
index 88eedce..7ad0bdb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
@@ -22,7 +22,6 @@
import com.android.tools.r8.ir.analysis.value.SingleStringValue;
import com.android.tools.r8.ir.code.ArrayGet;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.IRCode;
@@ -120,11 +119,7 @@
if (isNameInvoke) {
Value newValue =
code.createValue(TypeElement.stringClassType(appView, definitelyNotNull()));
- iterator.replaceCurrentInstruction(
- new ConstString(
- newValue,
- nameValue.getDexString(),
- ThrowingInfo.defaultForConstString(appView.options())));
+ iterator.replaceCurrentInstruction(new ConstString(newValue, nameValue.getDexString()));
newValue.addAffectedValuesTo(affectedValues);
continue;
}
@@ -155,11 +150,7 @@
Value newValue =
code.createValue(TypeElement.stringClassType(appView, definitelyNotNull()));
- iterator.replaceCurrentInstruction(
- new ConstString(
- newValue,
- nameValue.getDexString(),
- ThrowingInfo.defaultForConstString(appView.options())));
+ iterator.replaceCurrentInstruction(new ConstString(newValue, nameValue.getDexString()));
newValue.addAffectedValuesTo(affectedValues);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java
index 3864fb8..5fdaf51 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java
@@ -593,8 +593,7 @@
code.createValue(
TypeElement.stringClassType(appView, definitelyNotNull()),
invoke.getLocalInfo());
- it.replaceCurrentInstruction(
- new ConstString(dummy, factory.createString(DUMMY), throwingInfo));
+ it.replaceCurrentInstruction(new ConstString(dummy, factory.createString(DUMMY)));
} else {
it.removeOrReplaceByDebugLocalRead();
}
@@ -614,8 +613,7 @@
code.createValue(
TypeElement.stringClassType(appView, definitelyNotNull()), invoke.getLocalInfo());
affectedValues.addAll(outValue.affectedValues());
- it.replaceCurrentInstruction(
- new ConstString(stringValue, factory.createString(element), throwingInfo));
+ it.replaceCurrentInstruction(new ConstString(stringValue, factory.createString(element)));
simplifiedBuilders.add(builder);
numberOfBuildersSimplified++;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
index 3c6c003..48f2199 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
@@ -22,7 +22,6 @@
import com.android.tools.r8.ir.analysis.escape.EscapeAnalysisConfiguration;
import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
import com.android.tools.r8.ir.analysis.type.TypeElement;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstClass;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
@@ -49,7 +48,6 @@
private final AppView<?> appView;
private final DexItemFactory factory;
- private final ThrowingInfo throwingInfo;
private int numberOfSimplifiedOperations = 0;
private final Object2IntMap<ClassNameMapping> numberOfComputedNames;
@@ -61,7 +59,6 @@
public StringOptimizer(AppView<?> appView) {
this.appView = appView;
this.factory = appView.dexItemFactory();
- this.throwingInfo = ThrowingInfo.defaultForConstString(appView.options());
if (Log.ENABLED && Log.isLoggingEnabledFor(StringOptimizer.class)) {
numberOfComputedNames = new Object2IntArrayMap<>();
numberOfDeferredComputationOfNames = new Object2IntArrayMap<>();
@@ -186,8 +183,7 @@
code.createValue(
TypeElement.stringClassType(appView, definitelyNotNull()), invoke.getLocalInfo());
affectedValues.addAll(invoke.outValue().affectedValues());
- it.replaceCurrentInstruction(
- new ConstString(stringValue, factory.createString(sub), throwingInfo));
+ it.replaceCurrentInstruction(new ConstString(stringValue, factory.createString(sub)));
numberOfSimplifiedOperations++;
continue;
}
@@ -203,7 +199,7 @@
code.createValue(
TypeElement.stringClassType(appView, definitelyNotNull()), invoke.getLocalInfo());
affectedValues.addAll(invoke.outValue().affectedValues());
- it.replaceCurrentInstruction(new ConstString(newOutValue, resultString, throwingInfo));
+ it.replaceCurrentInstruction(new ConstString(newOutValue, resultString));
numberOfSimplifiedOperations++;
continue;
}
@@ -379,10 +375,7 @@
if (mayBeRenamed) {
deferred =
new DexItemBasedConstString(
- invoke.outValue(),
- baseType,
- ClassNameComputationInfo.create(NAME, arrayDepth),
- throwingInfo);
+ invoke.outValue(), baseType, ClassNameComputationInfo.create(NAME, arrayDepth));
logDeferredNameComputation(NAME);
} else {
name = NAME.map(descriptor, holder, factory, arrayDepth);
@@ -408,8 +401,7 @@
new DexItemBasedConstString(
invoke.outValue(),
baseType,
- ClassNameComputationInfo.create(CANONICAL_NAME, arrayDepth),
- throwingInfo);
+ ClassNameComputationInfo.create(CANONICAL_NAME, arrayDepth));
logDeferredNameComputation(CANONICAL_NAME);
} else {
name = CANONICAL_NAME.map(descriptor, holder, factory, arrayDepth);
@@ -431,8 +423,7 @@
new DexItemBasedConstString(
invoke.outValue(),
baseType,
- ClassNameComputationInfo.create(SIMPLE_NAME, arrayDepth),
- throwingInfo);
+ ClassNameComputationInfo.create(SIMPLE_NAME, arrayDepth));
logDeferredNameComputation(SIMPLE_NAME);
} else {
name = SIMPLE_NAME.map(descriptor, holder, factory, arrayDepth);
@@ -445,7 +436,7 @@
Value stringValue =
code.createValue(
TypeElement.stringClassType(appView, definitelyNotNull()), invoke.getLocalInfo());
- ConstString constString = new ConstString(stringValue, name, throwingInfo);
+ ConstString constString = new ConstString(stringValue, name);
it.replaceCurrentInstruction(constString);
logHistogramOfNames(name);
} else if (deferred != null) {
@@ -531,8 +522,7 @@
Value nullStringValue =
code.createValue(
TypeElement.stringClassType(appView, definitelyNotNull()), invoke.getLocalInfo());
- ConstString nullString =
- new ConstString(nullStringValue, factory.createString("null"), throwingInfo);
+ ConstString nullString = new ConstString(nullStringValue, factory.createString("null"));
it.replaceCurrentInstruction(nullString);
numberOfSimplifiedConversions++;
} else if (inType.nullability().isDefinitelyNotNull()
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 2168235..2d9a19d 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -20,7 +20,6 @@
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.DexItemBasedConstString;
import com.android.tools.r8.ir.code.FieldInstruction;
@@ -54,12 +53,10 @@
private final AppView<AppInfoWithLiveness> appView;
private final Object2BooleanMap<DexReference> identifierNameStrings;
- private final ThrowingInfo throwingInfo;
public IdentifierNameStringMarker(AppView<AppInfoWithLiveness> appView) {
this.appView = appView;
this.identifierNameStrings = appView.appInfo().identifierNameStrings;
- this.throwingInfo = ThrowingInfo.defaultForConstString(appView.options());
}
public void decoupleIdentifierNameStringsInFields(
@@ -161,8 +158,7 @@
// Prepare $decoupled just before $fieldPut
Value newIn = code.createValue(in.getType(), in.getLocalInfo());
DexItemBasedConstString decoupled =
- new DexItemBasedConstString(
- newIn, itemBasedString, ClassNameComputationInfo.none(), throwingInfo);
+ new DexItemBasedConstString(newIn, itemBasedString, ClassNameComputationInfo.none());
decoupled.setPosition(fieldPut.getPosition());
// If the current block has catch handler, split into two blocks.
// Because const-string we're about to add is also a throwing instr, we need to split
@@ -227,10 +223,7 @@
Value newIn = code.createValue(in.getType(), in.getLocalInfo());
DexItemBasedConstString decoupled =
new DexItemBasedConstString(
- newIn,
- identifierLookupResult.getReference(),
- ClassNameComputationInfo.none(),
- throwingInfo);
+ newIn, identifierLookupResult.getReference(), ClassNameComputationInfo.none());
changes[identifierPosition] = newIn;
if (in.numberOfAllUsers() == 1) {
@@ -295,8 +288,7 @@
// Prepare $decoupled just before $invoke
Value newIn = code.createValue(in.getType(), in.getLocalInfo());
DexItemBasedConstString decoupled =
- new DexItemBasedConstString(
- newIn, itemBasedString, ClassNameComputationInfo.none(), throwingInfo);
+ new DexItemBasedConstString(newIn, itemBasedString, ClassNameComputationInfo.none());
decoupled.setPosition(invoke.getPosition());
changes[i] = newIn;
// If the current block has catch handler, split into two blocks.
diff --git a/src/test/examples/shaking1/print-mapping-cf.ref b/src/test/examples/shaking1/print-mapping-cf.ref
index 87a7bc0..a7e0b8e 100644
--- a/src/test/examples/shaking1/print-mapping-cf.ref
+++ b/src/test/examples/shaking1/print-mapping-cf.ref
@@ -3,3 +3,4 @@
1:1:java.lang.String method():17:17 -> a
1:1:void main(java.lang.String[]):8:8 -> main
1:1:void <init>(java.lang.String):12:12 -> <init>
+ 1:1:java.lang.String aMethodThatIsNotUsedButKept():21:21 -> aMethodThatIsNotUsedButKept
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/d8/ThrowingConstStringTest.java b/src/test/java/com/android/tools/r8/d8/ThrowingConstStringTest.java
new file mode 100644
index 0000000..314d32d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/d8/ThrowingConstStringTest.java
@@ -0,0 +1,73 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.d8;
+
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class ThrowingConstStringTest extends TestBase {
+
+ static final String EXPECTED = StringUtils.lines("Hello!");
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+ }
+
+ public ThrowingConstStringTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void test() throws Exception {
+ Path cfout =
+ testForD8(Backend.CF)
+ .addInnerClasses(ThrowingConstStringTest.class)
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.testing.forceIRForCfToCfDesugar = true)
+ .compile()
+ .inspect(
+ inspector -> {
+ MethodSubject method = inspector.clazz(TestClass.class).mainMethod();
+ InstructionSubject constString =
+ method.iterateInstructions(InstructionSubject::isConstString).next();
+ assertTrue(
+ "ConstString is not covered by try range",
+ method
+ .streamTryCatches()
+ .anyMatch(
+ tryCatch ->
+ tryCatch.getRange().includes(constString.getOffset(method))));
+ })
+ .writeToZip();
+ testForD8(parameters.getBackend())
+ .addProgramFiles(cfout)
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED);
+ }
+
+ static class TestClass {
+
+ public static void main(String[] args) {
+ synchronized (TestClass.class) {
+ String constant = "Hello!";
+ System.out.println(constant);
+ }
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
index 7ba46d2..63c9f40 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
@@ -13,7 +13,9 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
-import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
import com.android.tools.r8.ToolHelper;
import java.io.BufferedReader;
import java.io.IOException;
@@ -23,8 +25,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collection;
+import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Rule;
@@ -36,17 +37,19 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class TreeShakingSpecificTest {
+public class TreeShakingSpecificTest extends TestBase {
private Backend backend;
- @Parameters(name = "Backend: {0}")
- public static Collection<Backend> data() {
- return Arrays.asList(Backend.values());
+ @Parameters(name = "Backend: {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ TestParametersBuilder.builder().withNoneRuntime().build(), Backend.values());
}
- public TreeShakingSpecificTest(Backend backend) {
+ public TreeShakingSpecificTest(TestParameters parameters, Backend backend) {
this.backend = backend;
+ parameters.assertNoneRuntime();
}
private static final String VALID_PROGUARD_DIR = "src/test/proguard/valid/";