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/";