Make IRCode.options private

Change-Id: I2d8a70cc7ba9cf0a6819926d590b18da193c786f
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 27577c0..11b9a3d 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
@@ -117,7 +117,7 @@
   @Override
   public boolean canBeDeadCode(AppView<? extends AppInfo> appView, IRCode code) {
     // No side-effect, such as throwing an exception, in CF.
-    return code.options.isGeneratingClassFiles() || !instructionInstanceCanThrow();
+    return appView.options().isGeneratingClassFiles() || !instructionInstanceCanThrow();
   }
 
   @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 40376d5..7d83faf 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
@@ -104,7 +104,7 @@
   public boolean hasConstString;
   public final boolean hasMonitorInstruction;
 
-  public final InternalOptions options;
+  private final InternalOptions options;
 
   public final Origin origin;
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
index 3ccd8b0..09619fb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java
+++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -71,8 +71,8 @@
 
   @Override
   public boolean canBeDeadCode(AppView<? extends AppInfo> appView, IRCode code) {
-    return !(code.options.debug || code.method.getOptimizationInfo().isReachabilitySensitive())
-        && code.options.isGeneratingDex();
+    return !(appView.options().debug || code.method.getOptimizationInfo().isReachabilitySensitive())
+        && appView.options().isGeneratingDex();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index 2eaa046..bda37c3 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -122,9 +122,8 @@
   BasicBlock nextBlock;
 
   public DexBuilder(IRCode ir, RegisterAllocator registerAllocator) {
-    this(ir, registerAllocator, ir.options);
+    this(ir, registerAllocator, registerAllocator.options());
     assert ir != null;
-    assert registerAllocator != null;
   }
 
   private DexBuilder(IRCode ir, RegisterAllocator registerAllocator, InternalOptions options) {
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 a2ea118..bb3e80e 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
@@ -827,7 +827,7 @@
     }
 
     if (options.canHaveArtStringNewInitBug()) {
-      CodeRewriter.ensureDirectStringNewToInit(code);
+      CodeRewriter.ensureDirectStringNewToInit(code, appView.dexItemFactory());
     }
 
     boolean isDebugMode = options.debug || method.getOptimizationInfo().isReachabilitySensitive();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 064f105..79621b8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -322,6 +322,6 @@
     BasicBlock currentBlock = newInstance.getBlock();
     BasicBlock nextBlock = instructions.split(code, blocks);
     assert !instructions.hasNext();
-    nextBlock.copyCatchHandlers(code, blocks, currentBlock, code.options);
+    nextBlock.copyCatchHandlers(code, blocks, currentBlock, appView.options());
   }
 }
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 e31924e..1f299aa 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
@@ -397,7 +397,7 @@
       }
       // Copy catch handlers after all blocks are split.
       for (BasicBlock newBlock : newBlocks) {
-        newBlock.copyCatchHandlers(code, blocks, currentBlock, code.options);
+        newBlock.copyCatchHandlers(code, blocks, currentBlock, appView.options());
       }
     }
 
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 2bacf8f..705dcb1 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
@@ -2666,9 +2666,11 @@
   private static class CSEExpressionEquivalence extends Equivalence<Instruction> {
 
     private final IRCode code;
+    private final InternalOptions options;
 
-    private CSEExpressionEquivalence(IRCode code) {
+    private CSEExpressionEquivalence(IRCode code, InternalOptions options) {
       this.code = code;
+      this.options = options;
     }
 
     @Override
@@ -2676,7 +2678,7 @@
       // Some Dalvik VMs incorrectly handle Cmp instructions which leads to a requirement
       // that we do not perform common subexpression elimination for them. See comment on
       // canHaveCmpLongBug for details.
-      if (a.isCmp() && code.options.canHaveCmpLongBug()) {
+      if (a.isCmp() && options.canHaveCmpLongBug()) {
         return false;
       }
       // Note that we don't consider positions because CSE can at most remove an instruction.
@@ -2786,7 +2788,7 @@
     if (hasCSECandidate(code, noCandidate)) {
       final ListMultimap<Wrapper<Instruction>, Value> instructionToValue =
           ArrayListMultimap.create();
-      final CSEExpressionEquivalence equivalence = new CSEExpressionEquivalence(code);
+      final CSEExpressionEquivalence equivalence = new CSEExpressionEquivalence(code, options);
       final DominatorTree dominatorTree = new DominatorTree(code);
       for (int i = 0; i < dominatorTree.getSortedBlocks().length; i++) {
         BasicBlock block = dominatorTree.getSortedBlocks()[i];
@@ -3458,7 +3460,7 @@
    */
   public static void removeUnneededMovesOnExitingPaths(
       IRCode code, LinearScanRegisterAllocator allocator) {
-    if (!code.options.debug) {
+    if (!allocator.options().debug) {
       return;
     }
     for (BasicBlock block : code.blocks) {
@@ -3765,16 +3767,15 @@
     iterator.add(new InvokeVirtual(printLn, null, ImmutableList.of(out, empty)));
   }
 
-  public static void ensureDirectStringNewToInit(IRCode code) {
-    DexItemFactory factory = code.options.itemFactory;
+  public static void ensureDirectStringNewToInit(IRCode code, DexItemFactory dexItemFactory) {
     for (BasicBlock block : code.blocks) {
       for (InstructionListIterator it = block.listIterator(); it.hasNext(); ) {
         Instruction instruction = it.next();
         if (instruction.isInvokeDirect()) {
           InvokeDirect invoke = instruction.asInvokeDirect();
           DexMethod method = invoke.getInvokedMethod();
-          if (factory.isConstructor(method)
-              && method.holder == factory.stringType
+          if (dexItemFactory.isConstructor(method)
+              && method.holder == dexItemFactory.stringType
               && invoke.getReceiver().isPhi()) {
             NewInstance newInstance = findNewInstance(invoke.getReceiver().asPhi());
             replaceTrivialNewInstancePhis(newInstance.outValue());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
index 5e8a11b..13d5c77 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
@@ -192,7 +192,7 @@
       codeRewriter.simplifyIf(code);
       // If a method was inlined we may see more trivial computation/conversion of String.
       boolean isDebugMode =
-          code.options.debug || method.getOptimizationInfo().isReachabilitySensitive();
+          appView.options().debug || method.getOptimizationInfo().isReachabilitySensitive();
       if (!isDebugMode) {
         // Reflection/string optimization 3. trivial conversion/computation on const-string
         stringOptimizer.computeTrivialOperationsOnConstString(code);
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
index c7dd142..ede8aaf 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
@@ -370,7 +370,7 @@
         // In case the runtime might have a bound-check elimination bug we make sure to define all
         // indexing constants with an actual const instruction rather than a move. This appears to
         // avoid a bug where the index variable could end up being uninitialized.
-        if (code.options.canHaveBoundsCheckEliminationBug()
+        if (allocator.options().canHaveBoundsCheckEliminationBug()
             && move.from.getValue().isConstNumber()
             && move.type.isSingle()
             && allocator.unadjustedRealRegisterFromAllocated(move.to.getRegister()) < 256) {