diff --git a/build.gradle b/build.gradle
index 9299592..c97aa9d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -23,6 +23,7 @@
     '-Xep:OvershadowingSubclassFields:WARN',
     '-Xep:IntLongMath:WARN',
     '-Xep:EqualsHashCode:WARN',
+    '-Xep:InconsistentOverloads:WARN',
     '-Xep:ArrayHashCode:WARN',
     '-Xep:EqualsIncompatibleType:WARN',
     '-Xep:NonOverridingEquals:WARN',
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index 6c4b9bc..6961024 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -109,19 +109,19 @@
     private boolean enableDesugaring = true;
 
     protected Builder(CompilationMode mode) {
-      this(AndroidApp.builder(), mode, false);
+      this(mode, false, AndroidApp.builder());
     }
 
     protected Builder(CompilationMode mode, boolean ignoreDexInArchive) {
-      this(AndroidApp.builder(), mode, ignoreDexInArchive);
+      this(mode, ignoreDexInArchive, AndroidApp.builder());
     }
 
     // Internal constructor for testing.
-    Builder(AndroidApp app, CompilationMode mode) {
-      this(AndroidApp.builder(app), mode, false);
+    Builder(CompilationMode mode, AndroidApp app) {
+      this(mode, false, AndroidApp.builder(app));
     }
 
-    private Builder(AndroidApp.Builder builder, CompilationMode mode, boolean ignoreDexInArchive) {
+    private Builder(CompilationMode mode, boolean ignoreDexInArchive, AndroidApp.Builder builder) {
       super(builder, ignoreDexInArchive);
       assert mode != null;
       this.mode = mode;
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index a5213c5..ae370ae 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -199,7 +199,7 @@
       throws IOException, ExecutionException, ApiLevelException {
     final CfgPrinter printer = options.printCfg ? new CfgPrinter() : null;
 
-    IRConverter converter = new IRConverter(timing, appInfo, options, printer);
+    IRConverter converter = new IRConverter(appInfo, options, timing, printer);
     application = converter.convertToDex(application, executor);
 
     if (options.printCfg) {
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index b96dfb7..d0c99d5 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -44,7 +44,7 @@
     }
 
     private Builder(AndroidApp app) {
-      super(app, CompilationMode.DEBUG);
+      super(CompilationMode.DEBUG, app);
     }
 
     /** Add classpath file resources. */
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index 9d7478d..d29d9ae 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -68,7 +68,7 @@
      * Add proguard configuration for automatic main dex list calculation.
      */
     public GenerateMainDexListCommand.Builder addMainDexRules(List<String> lines) {
-      mainDexRules.add(new ProguardConfigurationSourceStrings(Paths.get("."), lines));
+      mainDexRules.add(new ProguardConfigurationSourceStrings(lines, Paths.get(".")));
       return self();
     }
 
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d9066bd..c9ede51 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -129,7 +129,7 @@
     timing.begin("Create IR");
     try {
       IRConverter converter = new IRConverter(
-          timing, appInfo, options, printer, graphLense);
+          appInfo, options, timing, printer, graphLense);
       application = converter.optimize(application, executorService);
     } finally {
       timing.end();
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 1df56db..d24eb43 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -49,7 +49,7 @@
     }
 
     private Builder(AndroidApp app) {
-      super(app, CompilationMode.RELEASE);
+      super(CompilationMode.RELEASE, app);
     }
 
     @Override
@@ -105,7 +105,7 @@
      * Add proguard configuration for automatic main dex list calculation.
      */
     public Builder addMainDexRules(List<String> lines) {
-      mainDexRules.add(new ProguardConfigurationSourceStrings(Paths.get("."), lines));
+      mainDexRules.add(new ProguardConfigurationSourceStrings(lines, Paths.get(".")));
       return self();
     }
 
@@ -138,7 +138,7 @@
      * Add proguard configuration.
      */
     public Builder addProguardConfiguration(List<String> lines) {
-      proguardConfigs.add(new ProguardConfigurationSourceStrings(Paths.get("."), lines));
+      proguardConfigs.add(new ProguardConfigurationSourceStrings(lines, Paths.get(".")));
       return self();
     }
 
diff --git a/src/main/java/com/android/tools/r8/code/Format45cc.java b/src/main/java/com/android/tools/r8/code/Format45cc.java
index c269fad..f5123cf 100644
--- a/src/main/java/com/android/tools/r8/code/Format45cc.java
+++ b/src/main/java/com/android/tools/r8/code/Format45cc.java
@@ -117,13 +117,13 @@
     StringBuilder builder = new StringBuilder();
     appendRegisterArguments(builder, " ");
     builder.append(" ");
-    builder.append(toString(BBBB, naming));
+    builder.append(itemToString(BBBB, naming));
     builder.append(", ");
-    builder.append(toString(HHHH, naming));
+    builder.append(itemToString(HHHH, naming));
     return formatString(builder.toString());
   }
 
-  private String toString(IndexedDexItem indexedDexItem, ClassNameMapper naming) {
+  private String itemToString(IndexedDexItem indexedDexItem, ClassNameMapper naming) {
     String str;
     if (naming == null) {
       str = indexedDexItem.toSmaliString();
diff --git a/src/main/java/com/android/tools/r8/dex/DexFileReader.java b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
index 770afdf..64909cc 100644
--- a/src/main/java/com/android/tools/r8/dex/DexFileReader.java
+++ b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
@@ -983,7 +983,7 @@
     DexString shorty = indexedItems.getString(shortyIndex);
     DexType returnType = indexedItems.getType(returnTypeIndex);
     DexTypeList parameters = typeListAt(parametersOffsetIndex);
-    return dexItemFactory.createProto(shorty, returnType, parameters);
+    return dexItemFactory.createProto(returnType, shorty, parameters);
   }
 
   private DexMethod methodAt(int index) {
diff --git a/src/main/java/com/android/tools/r8/errors/InternalCompilerError.java b/src/main/java/com/android/tools/r8/errors/InternalCompilerError.java
index b51c7ec..a5080d3 100644
--- a/src/main/java/com/android/tools/r8/errors/InternalCompilerError.java
+++ b/src/main/java/com/android/tools/r8/errors/InternalCompilerError.java
@@ -14,8 +14,8 @@
   public InternalCompilerError() {
   }
 
-  public InternalCompilerError(String s) {
-    super(s);
+  public InternalCompilerError(String message) {
+    super(message);
   }
 
   public InternalCompilerError(String message, Throwable cause) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 6a2fcbf..a05299c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -168,11 +168,10 @@
 
   public IRCode buildIR(
       DexEncodedMethod encodedMethod,
-      ValueNumberGenerator valueNumberGenerator,
-      InternalOptions options)
+      InternalOptions options, ValueNumberGenerator valueNumberGenerator)
       throws ApiLevelException {
     DexSourceCode source = new DexSourceCode(this, encodedMethod);
-    IRBuilder builder = new IRBuilder(encodedMethod, source, valueNumberGenerator, options);
+    IRBuilder builder = new IRBuilder(encodedMethod, source, options, valueNumberGenerator);
     return builder.build();
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 99325f9..1974397 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -265,11 +265,11 @@
     return code == null ? null : code.buildIR(this, options);
   }
 
-  public IRCode buildIR(ValueNumberGenerator valueNumberGenerator, InternalOptions options)
+  public IRCode buildIR(InternalOptions options, ValueNumberGenerator valueNumberGenerator)
       throws ApiLevelException {
     return code == null
         ? null
-        : code.asDexCode().buildIR(this, valueNumberGenerator, options);
+        : code.asDexCode().buildIR(this, options, valueNumberGenerator);
   }
 
   public void setCode(
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 153c2e6..a7d44ba 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -346,23 +346,19 @@
     return createField(clazz, type, createString(name));
   }
 
-  public DexProto createProto(DexString shorty, DexType returnType, DexTypeList parameters) {
+  public DexProto createProto(DexType returnType, DexString shorty, DexTypeList parameters) {
     assert !sorted;
     DexProto proto = new DexProto(shorty, returnType, parameters);
     return canonicalize(protos, proto);
   }
 
-  public DexProto createProto(DexString shorty, DexType returnType, DexType[] parameters) {
+  public DexProto createProto(DexType returnType, DexType... parameters) {
     assert !sorted;
-    return createProto(shorty, returnType,
+    return createProto(returnType, createShorty(returnType, parameters),
         parameters.length == 0 ? DexTypeList.empty() : new DexTypeList(parameters));
   }
 
-  public DexProto createProto(DexType returnType, DexType... parameters) {
-    return createProto(createShorty(returnType, parameters), returnType, parameters);
-  }
-
-  public DexString createShorty(DexType returnType, DexType[] argumentTypes) {
+  private DexString createShorty(DexType returnType, DexType[] argumentTypes) {
     StringBuilder shortyBuilder = new StringBuilder();
     shortyBuilder.append(returnType.toShorty());
     for (DexType argumentType : argumentTypes) {
@@ -407,7 +403,7 @@
     for (int i = 0; i < parameterDescriptors.length; i++) {
       parameterTypes[i] = createType(parameterDescriptors[i]);
     }
-    DexProto proto = createProto(shorty(returnType, parameterTypes), returnType, parameterTypes);
+    DexProto proto = createProto(returnType, parameterTypes);
 
     return createMethod(clazz, proto, name);
   }
@@ -464,20 +460,6 @@
     return method.name == classConstructorMethodName;
   }
 
-  private DexString shorty(DexType returnType, DexType[] parameters) {
-    StringBuilder builder = new StringBuilder();
-    addToShorty(builder, returnType);
-    for (DexType parameter : parameters) {
-      addToShorty(builder, parameter);
-    }
-    return createString(builder.toString());
-  }
-
-  private void addToShorty(StringBuilder builder, DexType type) {
-    char first = type.toDescriptorString().charAt(0);
-    builder.append(first == '[' ? 'L' : first);
-  }
-
   private static <S extends PresortedComparable<S>> void assignSortedIndices(Collection<S> items,
       NamingLens namingLens) {
     List<S> sorted = new ArrayList<>(items);
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLense.java b/src/main/java/com/android/tools/r8/graph/GraphLense.java
index 3abe7c5..7d7d366 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLense.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLense.java
@@ -44,10 +44,10 @@
     }
 
     public GraphLense build(DexItemFactory dexItemFactory) {
-      return build(new IdentityGraphLense(), dexItemFactory);
+      return build(dexItemFactory, new IdentityGraphLense());
     }
 
-    public GraphLense build(GraphLense previousLense, DexItemFactory dexItemFactory) {
+    public GraphLense build(DexItemFactory dexItemFactory, GraphLense previousLense) {
       return new NestedGraphLense(typeMap, methodMap, fieldMap, previousLense, dexItemFactory);
     }
 
@@ -118,7 +118,7 @@
     @Override
     public DexType lookupType(DexType type, DexEncodedMethod context) {
       if (type.isArrayType()) {
-        synchronized(this) {
+        synchronized (this) {
           // This block need to be synchronized due to arrayTypeCache.
           DexType result = arrayTypeCache.get(type);
           if (result == null) {
diff --git a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
index 757ae71..6bf1a17 100644
--- a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
@@ -18,6 +18,7 @@
  * It does not currently support multithreaded reading.
  */
 public class JarApplicationReader {
+
   public final InternalOptions options;
 
   ConcurrentHashMap<String, DexString> stringCache = new ConcurrentHashMap<>();
@@ -111,8 +112,8 @@
       argumentDescriptors[i] = arguments[i].getDescriptor();
     }
     DexProto proto = options.itemFactory.createProto(
-        getString(shortyDescriptor.toString()),
         getTypeFromDescriptor(returnType.getDescriptor()),
+        getString(shortyDescriptor.toString()),
         getTypeListFromDescriptors(argumentDescriptors));
     return proto;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index e842028..44bc529 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -94,34 +94,34 @@
       throws ApiLevelException {
     triggerDelayedParsingIfNeccessary();
     return options.debug
-        ? internalBuildWithLocals(encodedMethod, null, options)
-        : internalBuild(encodedMethod, null, options);
+        ? internalBuildWithLocals(encodedMethod, options, null)
+        : internalBuild(encodedMethod, options, null);
   }
 
   public IRCode buildIR(
-      DexEncodedMethod encodedMethod, ValueNumberGenerator generator, InternalOptions options)
+      DexEncodedMethod encodedMethod, InternalOptions options, ValueNumberGenerator generator)
       throws ApiLevelException {
     assert generator != null;
     triggerDelayedParsingIfNeccessary();
     return options.debug
-        ? internalBuildWithLocals(encodedMethod, generator, options)
-        : internalBuild(encodedMethod, generator, options);
+        ? internalBuildWithLocals(encodedMethod, options, generator)
+        : internalBuild(encodedMethod, options, generator);
   }
 
   private IRCode internalBuildWithLocals(
-      DexEncodedMethod encodedMethod, ValueNumberGenerator generator, InternalOptions options)
+      DexEncodedMethod encodedMethod, InternalOptions options, ValueNumberGenerator generator)
       throws ApiLevelException {
     try {
-      return internalBuild(encodedMethod, generator, options);
+      return internalBuild(encodedMethod, options, generator);
     } catch (InvalidDebugInfoException e) {
       options.warningInvalidDebugInfo(encodedMethod, origin, e);
       node.localVariables.clear();
-      return internalBuild(encodedMethod, generator, options);
+      return internalBuild(encodedMethod, options, generator);
     }
   }
 
   private IRCode internalBuild(
-      DexEncodedMethod encodedMethod, ValueNumberGenerator generator, InternalOptions options)
+      DexEncodedMethod encodedMethod, InternalOptions options, ValueNumberGenerator generator)
       throws ApiLevelException {
     if (!options.debug) {
       node.localVariables.clear();
@@ -130,7 +130,7 @@
     IRBuilder builder =
         (generator == null)
             ? new IRBuilder(encodedMethod, source, options)
-            : new IRBuilder(encodedMethod, source, generator, options);
+            : new IRBuilder(encodedMethod, source, options, generator);
     return builder.build();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index bfbfb02..37b3119 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -959,10 +959,10 @@
    * <p>The constructed basic block has no predecessors and has one
    * successors which is the target block.
    *
-   * @param target the target of the goto block
    * @param blockNumber the block number of the goto block
+   * @param target the target of the goto block
    */
-  public static BasicBlock createGotoBlock(BasicBlock target, int blockNumber) {
+  public static BasicBlock createGotoBlock(int blockNumber, BasicBlock target) {
     BasicBlock block = createGotoBlock(blockNumber);
     block.getSuccessors().add(target);
     return block;
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
index ff9e257..7bf8ec1 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
@@ -219,7 +219,7 @@
   }
 
   @Override
-  public BasicBlock split(int instructions, IRCode code, ListIterator<BasicBlock> blocksIterator) {
+  public BasicBlock split(IRCode code, int instructions, ListIterator<BasicBlock> blocksIterator) {
     // Split at the current cursor position.
     BasicBlock newBlock = split(code, blocksIterator);
     assert blocksIterator == null || IteratorUtils.peekPrevious(blocksIterator) == newBlock;
@@ -341,7 +341,7 @@
       List<BasicBlock> blocksToRemove, DexType downcast) {
     assert blocksToRemove != null;
     boolean inlineeCanThrow = canThrow(inlinee);
-    BasicBlock invokeBlock = split(1, code, blocksIterator);
+    BasicBlock invokeBlock = split(code, 1, blocksIterator);
     assert invokeBlock.getInstructions().size() == 2;
     assert invokeBlock.getInstructions().getFirst().isInvoke();
 
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 5e0fe8e..e5fb6ed 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
@@ -74,7 +74,7 @@
           // correct predecessor and successor structure. It is inserted
           // at the end of the list of blocks disregarding branching
           // structure.
-          BasicBlock newBlock = BasicBlock.createGotoBlock(block, nextBlockNumber++);
+          BasicBlock newBlock = BasicBlock.createGotoBlock(nextBlockNumber++, block);
           newBlocks.add(newBlock);
           pred.replaceSuccessor(block, newBlock);
           newBlock.getPredecessors().add(pred);
@@ -108,7 +108,7 @@
           fallthrough = fallthrough.exit().fallthroughBlock();
         }
         if (fallthrough != null) {
-          BasicBlock newFallthrough = BasicBlock.createGotoBlock(fallthrough, nextBlockNumber++);
+          BasicBlock newFallthrough = BasicBlock.createGotoBlock(nextBlockNumber++, fallthrough);
           current.exit().setFallthroughBlock(newFallthrough);
           newFallthrough.getPredecessors().add(current);
           fallthrough.replacePredecessor(current, newFallthrough);
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
index fc7817b..603ce6e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
@@ -126,8 +126,8 @@
    * If the current block have catch handlers these catch handlers will be attached to the block
    * containing the throwing instruction after the split.
    *
-   * @param instructions the number of instructions to include in the second block.
    * @param code the IR code for the block this iterator originates from.
+   * @param instructions the number of instructions to include in the second block.
    * @param blockIterator basic block iterator used to iterate the blocks. This must be positioned
    * just after the block for this is the instruction iterator. After this method returns it will be
    * positioned just after the second block inserted. Calling {@link #remove} without further
@@ -135,13 +135,13 @@
    * @return Returns the new block with the instructions after the cursor.
    */
   // TODO(sgjesse): Refactor to avoid the need for passing code and blockIterator.
-  BasicBlock split(int instructions, IRCode code, ListIterator<BasicBlock> blockIterator);
+  BasicBlock split(IRCode code, int instructions, ListIterator<BasicBlock> blockIterator);
 
   /**
-   * See {@link #split(int, IRCode, ListIterator)}.
+   * See {@link #split(IRCode, int, ListIterator)}.
    */
-  default BasicBlock split(int instructions, IRCode code) {
-    return split(instructions, code, null);
+  default BasicBlock split(IRCode code, int instructions) {
+    return split(code, instructions, null);
   }
 
   /**
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index 78c5c4e..dc6d500 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -70,7 +70,7 @@
     for (BasicBlock pred : block.getPredecessors()) {
       EdgeType edgeType = pred.getEdgeType(block);
       // Since this read has been delayed we must provide the local info for the value.
-      Value operand = builder.readRegister(register, pred, edgeType, type, getLocalInfo());
+      Value operand = builder.readRegister(register, type, pred, edgeType, getLocalInfo());
       canBeNull |= operand.canBeNull();
       appendOperand(operand);
     }
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 1915155..ea43cf8 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
@@ -593,10 +593,10 @@
 
   public boolean isDead(InternalOptions options) {
     // Totally unused values are trivially dead.
-    return !isUsed() || isDead(new HashSet<>(), options);
+    return !isUsed() || isDead(options, new HashSet<>());
   }
 
-  protected boolean isDead(Set<Value> active, InternalOptions options) {
+  protected boolean isDead(InternalOptions options, Set<Value> active) {
     // If the value has debug users we cannot eliminate it since it represents a value in a local
     // variable that should be visible in the debugger.
     if (numberOfDebugUsers() != 0) {
@@ -613,12 +613,12 @@
       // Instructions with no out value cannot be dead code by the current definition
       // (unused out value). They typically side-effect input values or deals with control-flow.
       assert outValue != null;
-      if (!active.contains(outValue) && !outValue.isDead(active, options)) {
+      if (!active.contains(outValue) && !outValue.isDead(options, active)) {
         return false;
       }
     }
     for (Phi phi : uniquePhiUsers()) {
-      if (!active.contains(phi) && !phi.isDead(active, options)) {
+      if (!active.contains(phi) && !phi.isDead(options, active)) {
         return false;
       }
     }
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 042232b..2335f2b 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
@@ -386,7 +386,7 @@
       if (ifsNeedingRewrite.contains(block)) {
         If theIf = block.exit().asIf();
         BasicBlock trueTarget = theIf.getTrueTarget();
-        BasicBlock newBlock = BasicBlock.createGotoBlock(trueTarget, ir.blocks.size());
+        BasicBlock newBlock = BasicBlock.createGotoBlock(ir.blocks.size(), trueTarget);
         theIf.setTrueTarget(newBlock);
         theIf.invert();
         it.add(newBlock);
@@ -641,7 +641,8 @@
       item = tryItems.get(i);
       coalescedTryItems.add(item);
       // Trim the range start for non-throwing instructions when starting a new range.
-      List<com.android.tools.r8.ir.code.Instruction> instructions = blocksWithHandlers.get(i).getInstructions();
+      List<com.android.tools.r8.ir.code.Instruction> instructions = blocksWithHandlers.get(i)
+          .getInstructions();
       for (com.android.tools.r8.ir.code.Instruction insn : instructions) {
         if (insn.instructionTypeCanThrow()) {
           item.start = getInfo(insn).getOffset();
@@ -819,7 +820,8 @@
     private Instruction[] instructions;
     private final int size;
 
-    public MultiFixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir, Instruction[] instructions) {
+    public MultiFixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir,
+        Instruction[] instructions) {
       super(ir);
       this.instructions = instructions;
       int size = 0;
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 2dceeab..4a96ae6 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
@@ -291,14 +291,13 @@
   private int nextBlockNumber = 0;
 
   public IRBuilder(DexEncodedMethod method, SourceCode source, InternalOptions options) {
-    this(method, source, new ValueNumberGenerator(), options);
+    this(method, source, options, new ValueNumberGenerator());
   }
 
   public IRBuilder(
       DexEncodedMethod method,
       SourceCode source,
-      ValueNumberGenerator valueNumberGenerator,
-      InternalOptions options) {
+      InternalOptions options, ValueNumberGenerator valueNumberGenerator) {
     assert source != null;
     this.method = method;
     this.source = source;
@@ -1624,7 +1623,7 @@
 
   public Value readRegister(int register, MoveType type) {
     DebugLocalInfo local = getCurrentLocal(register);
-    Value value = readRegister(register, currentBlock, EdgeType.NON_EDGE, type, local);
+    Value value = readRegister(register, type, currentBlock, EdgeType.NON_EDGE, local);
     // Check that any information about a current-local is consistent with the read.
     if (local != null && value.getLocalInfo() != local && !value.isUninitializedLocal()) {
       throw new InvalidDebugInfoException(
@@ -1643,10 +1642,10 @@
 
   public Value readRegisterIgnoreLocal(int register, MoveType type) {
     DebugLocalInfo local = getCurrentLocal(register);
-    return readRegister(register, currentBlock, EdgeType.NON_EDGE, type, local);
+    return readRegister(register, type, currentBlock, EdgeType.NON_EDGE, local);
   }
 
-  public Value readRegister(int register, BasicBlock block, EdgeType readingEdge, MoveType type,
+  public Value readRegister(int register, MoveType type, BasicBlock block, EdgeType readingEdge,
       DebugLocalInfo local) {
     checkRegister(register);
     Value value = block.readCurrentDefinition(register, readingEdge);
@@ -1665,7 +1664,7 @@
       assert block.verifyFilledPredecessors();
       BasicBlock pred = block.getPredecessors().get(0);
       EdgeType edgeType = pred.getEdgeType(block);
-      value = readRegister(register, pred, edgeType, type, local);
+      value = readRegister(register, type, pred, edgeType, local);
     } else {
       Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
       // We need to write the phi before adding operands to break cycles. If the phi is trivial
@@ -1939,7 +1938,7 @@
       BasicBlock target = pair.second;
 
       // New block with one unfilled predecessor.
-      BasicBlock newBlock = BasicBlock.createGotoBlock(target, nextBlockNumber++);
+      BasicBlock newBlock = BasicBlock.createGotoBlock(nextBlockNumber++, target);
       blocks.add(newBlock);
       newBlock.incrementUnfilledPredecessorCount();
 
@@ -2018,7 +2017,7 @@
             int otherPredecessorIndex = values.get(v);
             BasicBlock joinBlock = joinBlocks.get(otherPredecessorIndex);
             if (joinBlock == null) {
-              joinBlock = BasicBlock.createGotoBlock(block, blocks.size() + blocksToAdd.size());
+              joinBlock = BasicBlock.createGotoBlock(blocks.size() + blocksToAdd.size(), block);
               joinBlocks.put(otherPredecessorIndex, joinBlock);
               blocksToAdd.add(joinBlock);
               BasicBlock otherPredecessor = block.getPredecessors().get(otherPredecessorIndex);
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 dda8031..da022fe 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
@@ -82,11 +82,8 @@
   private DexString highestSortingString;
 
   private IRConverter(
-      Timing timing,
-      AppInfo appInfo,
-      GraphLense graphLense,
-      InternalOptions options,
-      CfgPrinter printer,
+      AppInfo appInfo, InternalOptions options, Timing timing,
+      CfgPrinter printer, GraphLense graphLense,
       boolean enableWholeProgramOptimizations) {
     assert appInfo != null;
     assert options != null;
@@ -127,30 +124,26 @@
   public IRConverter(
       AppInfo appInfo,
       InternalOptions options) {
-    this(null, appInfo, null, options, null, false);
+    this(appInfo, options, null, null, null, false);
   }
 
   /**
    * Create an IR converter for processing methods with full program optimization disabled.
    */
   public IRConverter(
-      Timing timing,
-      AppInfo appInfo,
-      InternalOptions options,
+      AppInfo appInfo, InternalOptions options, Timing timing,
       CfgPrinter printer) {
-    this(timing, appInfo, null, options, printer, false);
+    this(appInfo, options, timing, printer, null, false);
   }
 
   /**
    * Create an IR converter for processing methods with full program optimization enabled.
    */
   public IRConverter(
-      Timing timing,
-      AppInfoWithSubtyping appInfo,
-      InternalOptions options,
+      AppInfoWithSubtyping appInfo, InternalOptions options, Timing timing,
       CfgPrinter printer,
       GraphLense graphLense) {
-    this(timing, appInfo, graphLense, options, printer, true);
+    this(appInfo, options, timing, printer, graphLense, true);
   }
 
   private boolean enableInterfaceMethodDesugaring() {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index ab3efdb..b5fbb06 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -116,7 +116,7 @@
               // If the current block has catch handlers split the check cast into its own block.
               if (newInvoke.getBlock().hasCatchHandlers()) {
                 iterator.previous();
-                iterator.split(1, code, blocks);
+                iterator.split(code, 1, blocks);
               }
             }
           }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java
index 160da3c..1cf64fd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java
@@ -20,7 +20,7 @@
 final class AccessorMethodSourceCode extends SynthesizedLambdaSourceCode {
 
   AccessorMethodSourceCode(LambdaClass lambda) {
-    super(/* no receiver for static method */ null, lambda, lambda.target.callTarget);
+    super(lambda, lambda.target.callTarget, null /* no receiver for static method */);
     // We should never need an accessor for interface methods since
     // they are supposed to be public.
     assert !descriptor().implHandle.type.isInvokeInterface();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
index 31c6de1..408f53b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -58,6 +58,7 @@
 //       forward the call to an appropriate method in interface companion class.
 //
 public final class InterfaceMethodRewriter {
+
   // Public for testing.
   public static final String COMPANION_CLASS_NAME_SUFFIX = "-CC";
   private static final String DEFAULT_METHOD_PREFIX = "$default$";
@@ -75,11 +76,17 @@
    */
   private Set<DexItem> reportedMissing = Sets.newIdentityHashSet();
 
-  /** Defines a minor variation in desugaring. */
+  /**
+   * Defines a minor variation in desugaring.
+   */
   public enum Flavor {
-    /** Process all application resources. */
+    /**
+     * Process all application resources.
+     */
     IncludeAllResources,
-    /** Process all but DEX application resources. */
+    /**
+     * Process all but DEX application resources.
+     */
     ExcludeDexResources
   }
 
@@ -174,13 +181,14 @@
       } else if (holderClass.isInterface()) {
         throw new Unimplemented(
             "Desugaring of static interface method handle as in `"
-            + referencedFrom.toSourceString() + "` in is not yet supported.");
+                + referencedFrom.toSourceString() + "` in is not yet supported.");
       }
     }
   }
 
   /**
    * Returns the class definition for the specified type.
+   *
    * @return may return null if no definition for the given type is available.
    */
   final DexClass findDefinitionFor(DexType type) {
@@ -313,7 +321,7 @@
           .append("`");
     }
     options.diagnosticsHandler.warning(
-        new StringDiagnostic(classToDesugar.getOrigin(), builder.toString()));
+        new StringDiagnostic(builder.toString(), classToDesugar.getOrigin()));
   }
 
   private void warnMissingType(DexMethod referencedFrom, DexType missing) {
@@ -331,6 +339,6 @@
         .append("`");
     DexClass referencedFromClass = converter.appInfo.definitionFor(referencedFrom.getHolder());
     options.diagnosticsHandler.warning(
-        new StringDiagnostic(referencedFromClass.getOrigin(), builder.toString()));
+        new StringDiagnostic(builder.toString(), referencedFromClass.getOrigin()));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
index 539fcf0..411ab4c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
@@ -15,7 +15,7 @@
 final class LambdaClassConstructorSourceCode extends SynthesizedLambdaSourceCode {
 
   LambdaClassConstructorSourceCode(LambdaClass lambda) {
-    super(null /* Class initializer is static */, lambda, lambda.classConstructor);
+    super(lambda, lambda.classConstructor, null /* Class initializer is static */);
     assert lambda.instanceField != null;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/SynthesizedLambdaSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/SynthesizedLambdaSourceCode.java
index 9a3531f..bd38e1a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/SynthesizedLambdaSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/SynthesizedLambdaSourceCode.java
@@ -16,14 +16,14 @@
   final DexMethod currentMethod;
   final LambdaClass lambda;
 
-  SynthesizedLambdaSourceCode(DexType receiver, LambdaClass lambda, DexMethod currentMethod) {
+  SynthesizedLambdaSourceCode(LambdaClass lambda, DexMethod currentMethod, DexType receiver) {
     super(receiver, currentMethod.proto);
     this.lambda = lambda;
     this.currentMethod = currentMethod;
   }
 
   SynthesizedLambdaSourceCode(LambdaClass lambda, DexMethod currentMethod) {
-    this(lambda.type, lambda, currentMethod);
+    this(lambda, currentMethod, lambda.type);
   }
 
   final LambdaDescriptor descriptor() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 9699ec1..ad4639e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -232,14 +232,14 @@
         GraphLense graphLense, InternalOptions options) throws ApiLevelException {
       if (target.isProcessed()) {
         assert target.getCode().isDexCode();
-        return target.buildIR(generator, options);
+        return target.buildIR(options, generator);
       } else {
         // Build the IR for a yet not processed method, and perform minimal IR processing.
         IRCode code;
         if (target.getCode().isJarCode()) {
-          code = target.getCode().asJarCode().buildIR(target, generator, options);
+          code = target.getCode().asJarCode().buildIR(target, options, generator);
         } else {
-          code = target.getCode().asDexCode().buildIR(target, generator, options);
+          code = target.getCode().asDexCode().buildIR(target, options, generator);
         }
         new LensCodeRewriter(graphLense, appInfo).rewrite(code, target);
         return code;
diff --git a/src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java b/src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
index e9ec08c..0e971c2 100644
--- a/src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
+++ b/src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
@@ -43,24 +43,24 @@
     return copy;
   }
 
-  private void write(DexProgramClass clazz, PrintStream out) {
+  private void writeClass(DexProgramClass clazz, PrintStream out) {
     seenTypes.add(clazz.type);
     DexString descriptor = namingLens.lookupDescriptor(clazz.type);
     out.print(DescriptorUtils.descriptorToJavaType(clazz.type.descriptor.toSourceString()));
     out.print(" -> ");
     out.print(DescriptorUtils.descriptorToJavaType(descriptor.toSourceString()));
     out.println(":");
-    write(sortedCopy(
+    writeFields(sortedCopy(
         clazz.instanceFields(), Comparator.comparing(DexEncodedField::toSourceString)), out);
-    write(sortedCopy(
+    writeFields(sortedCopy(
         clazz.staticFields(), Comparator.comparing(DexEncodedField::toSourceString)), out);
-    write(sortedCopy(
+    writeMethods(sortedCopy(
         clazz.directMethods(), Comparator.comparing(DexEncodedMethod::toSourceString)), out);
-    write(sortedCopy(
+    writeMethods(sortedCopy(
         clazz.virtualMethods(), Comparator.comparing(DexEncodedMethod::toSourceString)), out);
   }
 
-  private void write(DexType type, PrintStream out) {
+  private void writeType(DexType type, PrintStream out) {
     if (type.isClassType() && seenTypes.add(type)) {
       DexString descriptor = namingLens.lookupDescriptor(type);
       out.print(DescriptorUtils.descriptorToJavaType(type.descriptor.toSourceString()));
@@ -70,7 +70,7 @@
     }
   }
 
-  private void write(DexEncodedField[] fields, PrintStream out) {
+  private void writeFields(DexEncodedField[] fields, PrintStream out) {
     for (DexEncodedField encodedField : fields) {
       DexField field = encodedField.field;
       DexString renamed = namingLens.lookupName(field);
@@ -102,7 +102,7 @@
     out.println(renamed);
   }
 
-  private void write(DexEncodedMethod[] methods, PrintStream out) {
+  private void writeMethods(DexEncodedMethod[] methods, PrintStream out) {
     for (DexEncodedMethod encodedMethod : methods) {
       DexMethod method = encodedMethod.method;
       DexString renamed = namingLens.lookupName(method);
@@ -125,9 +125,9 @@
     // First write out all classes that have been renamed.
     List<DexProgramClass> classes = new ArrayList<>(application.classes());
     classes.sort(Comparator.comparing(DexProgramClass::toSourceString));
-    classes.forEach(clazz -> write(clazz, out));
+    classes.forEach(clazz -> writeClass(clazz, out));
     // Now write out all types only mentioned in descriptors that have been renamed.
-    namingLens.forAllRenamedTypes(type -> write(type, out));
+    namingLens.forAllRenamedTypes(type -> writeType(type, out));
   }
 
   public void write(Path destination) throws IOException {
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 17da59b..71d6e46 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -219,6 +219,6 @@
         appInfo::lookupStaticTarget, DexClass::findStaticTarget);
     computeFieldRebinding(Sets.union(appInfo.instanceFieldReads, appInfo.instanceFieldWrites),
         appInfo::lookupInstanceTarget, DexClass::findInstanceTarget);
-    return builder.build(lense, appInfo.dexItemFactory);
+    return builder.build(appInfo.dexItemFactory, lense);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java
index 44b3393..cb69320 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java
@@ -12,6 +12,7 @@
 import joptsimple.internal.Strings;
 
 public class ProguardConfigurationSourceStrings implements ProguardConfigurationSource {
+
   private final Path basePath;
   private final List<String> config;
 
@@ -20,13 +21,13 @@
    * {@param basePath}, which allows all other options that use a relative path to reach out
    * to desired paths appropriately.
    */
-  public ProguardConfigurationSourceStrings(Path basePath, List<String> config) {
+  public ProguardConfigurationSourceStrings(List<String> config, Path basePath) {
     this.basePath = basePath;
     this.config = config;
   }
 
   private ProguardConfigurationSourceStrings(List<String> config) {
-    this(Paths.get("."), config);
+    this(config, Paths.get("."));
   }
 
   @VisibleForTesting
@@ -36,7 +37,7 @@
   }
 
   @Override
-  public String get() throws IOException{
+  public String get() throws IOException {
     return Strings.join(config, System.lineSeparator());
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java b/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
index 9affabf..b50d78e 100644
--- a/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
@@ -181,7 +181,7 @@
     if (Log.ENABLED) {
       Log.debug(getClass(), "Merged %d classes.", numberOfMerges);
     }
-    return renamedMembersLense.build(graphLense, application.dexItemFactory);
+    return renamedMembersLense.build(application.dexItemFactory, graphLense);
   }
 
   private class ClassMerger {
@@ -438,7 +438,7 @@
         DexType fixed = fixupType(type);
         lense.map(type, fixed);
       }
-      return lense.build(graphLense, application.dexItemFactory);
+      return lense.build(application.dexItemFactory, graphLense);
     }
 
     private DexEncodedMethod[] removeDupes(DexEncodedMethod[] methods) {
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index 24f5c08..980eb19 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -596,11 +596,11 @@
     /**
      * Add Java-bytecode program data.
      */
-    public Builder addClassProgramData(Origin origin, byte[] data) {
+    public Builder addClassProgramData(byte[] data, Origin origin) {
       return addProgramResources(Kind.CLASS, Resource.fromBytes(origin, data));
     }
 
-    public Builder addClassProgramData(Origin origin, byte[] data, Set<String> classDescriptors) {
+    public Builder addClassProgramData(byte[] data, Origin origin, Set<String> classDescriptors) {
       return addProgramResources(Kind.CLASS, Resource.fromBytes(origin, data, classDescriptors));
     }
 
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidAppOutputSink.java b/src/main/java/com/android/tools/r8/utils/AndroidAppOutputSink.java
index a4f2236..0f85cac 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidAppOutputSink.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidAppOutputSink.java
@@ -92,7 +92,7 @@
     } else if (!classFiles.isEmpty()) {
       assert dexFilesWithPrimary.isEmpty() && dexFilesWithId.isEmpty();
       classFiles.forEach(
-          d -> builder.addClassProgramData(Origin.unknown(), d.contents, d.descriptors));
+          d -> builder.addClassProgramData(d.contents, Origin.unknown(), d.descriptors));
     }
     closed = true;
     super.close();
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index a04e28f..1c0cc61 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -125,6 +125,7 @@
   public boolean minimalMainDex;
 
   public static class InvalidParameterAnnotationInfo {
+
     final DexMethod method;
     final int expectedParameterCount;
     final int actualParameterCount;
@@ -190,7 +191,7 @@
               .append(" actual count: ")
               .append(info.actualParameterCount);
         }
-        diagnosticsHandler.info(new StringDiagnostic(origin, builder.toString()));
+        diagnosticsHandler.info(new StringDiagnostic(builder.toString(), origin));
       }
       printed = true;
     }
@@ -209,7 +210,7 @@
         for (DexEncodedMethod method : warningInvalidDebugInfo.get(origin)) {
           builder.append("\n  ").append(method.toSourceString());
         }
-        diagnosticsHandler.info(new StringDiagnostic(origin, builder.toString()));
+        diagnosticsHandler.info(new StringDiagnostic(builder.toString(), origin));
       }
       printed = true;
       printOutdatedToolchain = true;
diff --git a/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java b/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java
index b2add4a..d2c6560 100644
--- a/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/StringDiagnostic.java
@@ -7,14 +7,15 @@
 import com.android.tools.r8.Resource.Origin;
 
 public class StringDiagnostic implements Diagnostic {
+
   private final Origin origin;
   private final String message;
 
   public StringDiagnostic(String message) {
-    this(Origin.unknown(), message);
+    this(message, Origin.unknown());
   }
 
-  public StringDiagnostic(Origin origin, String message) {
+  public StringDiagnostic(String message, Origin origin) {
     this.origin = origin;
     this.message = message;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/BasicBlockIteratorTest.java b/src/test/java/com/android/tools/r8/ir/BasicBlockIteratorTest.java
index cf191de..ad9a26a 100644
--- a/src/test/java/com/android/tools/r8/ir/BasicBlockIteratorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/BasicBlockIteratorTest.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.ir;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.ir.code.BasicBlock;
@@ -52,12 +51,12 @@
     // Build the code, and split the code into three blocks.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
     ListIterator<BasicBlock> blocks = code.listIterator();
     InstructionListIterator iter = blocks.next().listIterator();
     iter.nextUntil(i -> !i.isArgument());
     iter.previous();
-    iter.split(1, code, blocks);
+    iter.split(code, 1, blocks);
     return code;
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index 8258324..27a3ce9 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -76,13 +76,13 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodA = getMethod(application, signatureA);
-    IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodB = getMethod(application, signatureB);
-    IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new SmaliTestBase.TestApplication(application, method, code,
         ImmutableList.of(codeA, codeB), valueNumberGenerator, options);
@@ -159,10 +159,10 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodA = getMethod(application, signatureA);
-    IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code,
         ImmutableList.of(codeA), valueNumberGenerator, options);
@@ -239,19 +239,19 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     // Build three copies of a and b for inlining three times.
     List<IRCode> additionalCode = new ArrayList<>();
     for (int i = 0; i < 3; i++) {
       DexEncodedMethod methodA = getMethod(application, signatureA);
-      IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+      IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
       additionalCode.add(codeA);
     }
 
     for (int i = 0; i < 3; i++) {
       DexEncodedMethod methodB = getMethod(application, signatureB);
-      IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+      IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
       additionalCode.add(codeB);
     }
 
@@ -373,13 +373,13 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodA = getMethod(application, signatureA);
-    IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodB = getMethod(application, signatureB);
-    IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code,
         ImmutableList.of(codeA, codeB), valueNumberGenerator, options);
@@ -487,13 +487,13 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodA = getMethod(application, signatureA);
-    IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodB = getMethod(application, signatureB);
-    IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code,
         ImmutableList.of(codeA, codeB), valueNumberGenerator, options);
@@ -600,13 +600,13 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodA = getMethod(application, signatureA);
-    IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodB = getMethod(application, signatureB);
-    IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code,
         ImmutableList.of(codeA, codeB), valueNumberGenerator, options);
@@ -714,19 +714,19 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     // Build three copies of a and b for inlining three times.
     List<IRCode> additionalCode = new ArrayList<>();
     for (int i = 0; i < 3; i++) {
       DexEncodedMethod methodA = getMethod(application, signatureA);
-      IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+      IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
       additionalCode.add(codeA);
     }
 
     for (int i = 0; i < 3; i++) {
       DexEncodedMethod methodB = getMethod(application, signatureB);
-      IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+      IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
       additionalCode.add(codeB);
     }
 
@@ -871,19 +871,19 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     // Build three copies of a and b for inlining three times.
     List<IRCode> additionalCode = new ArrayList<>();
     for (int i = 0; i < 3; i++) {
       DexEncodedMethod methodA = getMethod(application, signatureA);
-      IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+      IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
       additionalCode.add(codeA);
     }
 
     for (int i = 0; i < 3; i++) {
       DexEncodedMethod methodB = getMethod(application, signatureB);
-      IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+      IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
       additionalCode.add(codeB);
     }
 
@@ -1118,13 +1118,13 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodA = getMethod(application, signatureA);
-    IRCode codeA = methodA.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeA = methodA.buildIR(new InternalOptions(), valueNumberGenerator);
 
     DexEncodedMethod methodB = getMethod(application, signatureB);
-    IRCode codeB = methodB.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode codeB = methodB.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code,
         ImmutableList.of(codeA, codeB), valueNumberGenerator, options);
diff --git a/src/test/java/com/android/tools/r8/ir/InstructionIteratorTest.java b/src/test/java/com/android/tools/r8/ir/InstructionIteratorTest.java
index b9eef9c..a688ffe 100644
--- a/src/test/java/com/android/tools/r8/ir/InstructionIteratorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InstructionIteratorTest.java
@@ -52,12 +52,12 @@
     // Build the code, and split the code into three blocks.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
     ListIterator<BasicBlock> blocks = code.listIterator();
     InstructionListIterator iter = blocks.next().listIterator();
     iter.nextUntil(i -> !i.isArgument());
     iter.previous();
-    iter.split(1, code, blocks);
+    iter.split(code, 1, blocks);
     return code;
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
index 7351206..9192b2f 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -64,7 +64,7 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code, valueNumberGenerator, options);
   }
@@ -123,7 +123,7 @@
       assertTrue(!block.getInstructions().get(i).isArgument());
 
       InstructionListIterator iterator = test.listIteratorAt(block, i);
-      BasicBlock newBlock = iterator.split(1, code);
+      BasicBlock newBlock = iterator.split(code, 1);
       assertTrue(code.isConsistentSSA());
 
       assertEquals(initialBlockCount + 2, code.blocks.size());
@@ -182,7 +182,7 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
     return new TestApplication(application, method, code, valueNumberGenerator, options);
   }
 
@@ -247,7 +247,7 @@
       assertEquals(secondBlockInstructions, instructionCount);
 
       InstructionListIterator iterator = test.listIteratorAt(block, i);
-      BasicBlock newBlock = iterator.split(1, code);
+      BasicBlock newBlock = iterator.split(code, 1);
       assertTrue(code.isConsistentSSA());
 
       assertEquals(initialBlockCount + 2, code.blocks.size());
@@ -307,7 +307,7 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code, valueNumberGenerator, options);
   }
@@ -431,7 +431,7 @@
     // Return the processed method for inspection.
     ValueNumberGenerator valueNumberGenerator = new ValueNumberGenerator();
     DexEncodedMethod method = getMethod(application, signature);
-    IRCode code = method.buildIR(valueNumberGenerator, new InternalOptions());
+    IRCode code = method.buildIR(new InternalOptions(), valueNumberGenerator);
 
     return new TestApplication(application, method, code, valueNumberGenerator, options);
   }
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
index c8ea3bb..a1046db 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
@@ -99,7 +99,8 @@
     }
 
     @Override
-    public BasicBlock split(int instructions, IRCode code, ListIterator<BasicBlock> blockIterator) {
+    public BasicBlock split(IRCode code, int instructions,
+        ListIterator<BasicBlock> blockIterator) {
       throw new Unimplemented();
     }
 
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java b/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
index 9baed48..caada82 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
@@ -191,7 +191,7 @@
         }
       };
       builder.addClassProgramData(
-          origin, compile(clazz), Collections.singleton(clazz.getDescriptor()));
+          compile(clazz), origin, Collections.singleton(clazz.getDescriptor()));
     }
     return builder.build();
   }
