diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index d8c4ea7..2784e8d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -51,7 +51,6 @@
   private final IRCode code;
   private final CallSiteInformation callSiteInformation;
   private final Predicate<DexEncodedMethod> isProcessedConcurrently;
-  private final InliningInfo info;
   private final int inliningInstructionLimit;
   private int instructionAllowance;
 
@@ -70,7 +69,6 @@
     this.code = code;
     this.callSiteInformation = callSiteInformation;
     this.isProcessedConcurrently = isProcessedConcurrently;
-    info = Log.ENABLED ? new InliningInfo(method) : null;
     this.inliningInstructionLimit = inliningInstructionLimit;
     this.instructionAllowance = inliningInstructionAllowance;
   }
@@ -80,13 +78,6 @@
     return false;
   }
 
-  @Override
-  public void finish() {
-    if (Log.ENABLED && info != null) {
-      Log.debug(getClass(), info.toString());
-    }
-  }
-
   private boolean isSingleTargetInvalid(
       InvokeMethod invoke,
       DexEncodedMethod singleTarget,
@@ -96,17 +87,11 @@
     }
 
     if (!singleTarget.hasCode()) {
-      if (info != null) {
-        info.exclude(invoke, "No inlinee");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return true;
     }
 
     if (appView.definitionFor(singleTarget.method.holder).isNotProgramClass()) {
-      if (info != null) {
-        info.exclude(invoke, "No inlinee");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return true;
     }
@@ -115,9 +100,6 @@
     int numberOfArguments =
         invoke.arguments().size() - BooleanUtils.intValue(invoke.isInvokeMethodWithReceiver());
     if (numberOfArguments != singleTarget.method.getArity()) {
-      if (info != null) {
-        info.exclude(invoke, "Argument number mismatch");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return true;
     }
@@ -233,9 +215,6 @@
       // Cannot handle recursive inlining at this point.
       // Force inlined method should never be recursive.
       assert !candidate.getOptimizationInfo().forceInline();
-      if (info != null) {
-        info.exclude(invoke, "direct recursion");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return false;
     }
@@ -246,9 +225,6 @@
     // processes all relevant methods in parallel with the full optimization pipeline enabled.
     // TODO(sgjesse): Add this assert "assert !isProcessedConcurrently.test(candidate);"
     if (reason != Reason.FORCE && isProcessedConcurrently.test(candidate)) {
-      if (info != null) {
-        info.exclude(invoke, "is processed in parallel");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return false;
     }
@@ -269,9 +245,6 @@
 
     // Abort inlining attempt if method -> target access is not right.
     if (!inliner.hasInliningAccess(method, candidate)) {
-      if (info != null) {
-        info.exclude(invoke, "target does not have right access");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return false;
     }
@@ -281,9 +254,6 @@
     if (holder.isInterface()) {
       // Art978_virtual_interfaceTest correctly expects an IncompatibleClassChangeError exception at
       // runtime.
-      if (info != null) {
-        info.exclude(invoke, "Do not inline target if method holder is an interface class");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return false;
     }
@@ -295,9 +265,6 @@
 
     // Don't inline if target is synchronized.
     if (candidate.accessFlags.isSynchronized()) {
-      if (info != null) {
-        info.exclude(invoke, "target is synchronized");
-      }
       whyAreYouNotInliningReporter.reportUnknownReason();
       return false;
     }
@@ -311,9 +278,6 @@
         inliner.recordDoubleInliningCandidate(method, candidate);
       } else {
         if (inliner.satisfiesRequirementsForDoubleInlining(method, candidate)) {
-          if (info != null) {
-            info.exclude(invoke, "target is not ready for double inlining");
-          }
           whyAreYouNotInliningReporter.reportUnknownReason();
           return false;
         }
@@ -330,9 +294,6 @@
       if (inliner.mainDexClasses.getRoots().contains(method.method.holder)
           && MainDexDirectReferenceTracer.hasReferencesOutsideFromCode(
           appView.appInfo(), candidate, inliner.mainDexClasses.getRoots())) {
-        if (info != null) {
-          info.exclude(invoke, "target has references beyond main dex");
-        }
         whyAreYouNotInliningReporter.reportUnknownReason();
         return false;
       }
@@ -350,14 +311,6 @@
     if (code.estimatedSizeForInliningAtMost(instructionLimit)) {
       return true;
     }
-    if (info != null) {
-      info.exclude(
-          invoke,
-          "instruction limit exceeds: "
-              + code.estimatedSizeForInlining()
-              + " <= "
-              + instructionLimit);
-    }
     return false;
   }
 
@@ -404,10 +357,6 @@
     Reason reason = computeInliningReason(singleTarget);
     if (!singleTarget.isInliningCandidate(
         method, reason, appView.appInfo(), whyAreYouNotInliningReporter)) {
-      // Abort inlining attempt if the single target is not an inlining candidate.
-      if (info != null) {
-        info.exclude(invoke, "target is not identified for inlining");
-      }
       return null;
     }
 
@@ -415,10 +364,6 @@
       return null;
     }
 
-    if (info != null) {
-      info.include(invoke.getType(), singleTarget);
-    }
-
     Value receiver = invoke.getReceiver();
     if (receiver.getTypeLattice().isDefinitelyNull()) {
       // A definitely null receiver will throw an error on call site.
@@ -439,19 +384,6 @@
           whyAreYouNotInliningReporter.reportUnknownReason();
           return null;
         }
-        if (!options.nullableReceiverInliningFilter.isEmpty()
-            && !options.nullableReceiverInliningFilter.contains(
-                invoke.getInvokedMethod().toSourceString())) {
-          whyAreYouNotInliningReporter.reportUnknownReason();
-          return null;
-        }
-        if (Log.ENABLED && Log.isLoggingEnabledFor(Inliner.class)) {
-          Log.debug(
-              Inliner.class,
-              "Inlining method `%s` with nullable receiver into `%s`",
-              invoke.getInvokedMethod().toSourceString(),
-              invocationContext.toSourceString());
-        }
         action.setShouldSynthesizeNullCheckForReceiver();
       }
     }
@@ -477,19 +409,12 @@
     // Determine if this should be inlined no matter how big it is.
     if (!singleTarget.isInliningCandidate(
         method, reason, appView.appInfo(), whyAreYouNotInliningReporter)) {
-      // Abort inlining attempt if the single target is not an inlining candidate.
-      if (info != null) {
-        info.exclude(invoke, "target is not identified for inlining");
-      }
       return null;
     }
 
     // Abort inlining attempt if we can not guarantee class for static target has been initialized.
     if (!canInlineStaticInvoke(
         invoke, method, singleTarget, classInitializationAnalysis, whyAreYouNotInliningReporter)) {
-      if (info != null) {
-        info.exclude(invoke, "target is static but we cannot guarantee class has been initialized");
-      }
       return null;
     }
 
@@ -497,9 +422,6 @@
       return null;
     }
 
-    if (info != null) {
-      info.include(invoke.getType(), singleTarget);
-    }
     return new InlineAction(singleTarget, invoke, reason);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
index 6c93489..e29070d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
@@ -44,9 +44,6 @@
   }
 
   @Override
-  public void finish() {}
-
-  @Override
   public DexEncodedMethod lookupSingleTarget(InvokeMethod invoke, DexType context) {
     Inliner.InliningInfo info = invokesToInline.get(invoke);
     if (info != null) {
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 074c6cd..f3bdff2 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
@@ -624,7 +624,7 @@
     }
   }
 
-  public static class InlineeWithReason {
+  static class InlineeWithReason {
 
     final Reason reason;
     final IRCode code;
@@ -840,7 +840,6 @@
     assumeDynamicTypeRemover.removeMarkedInstructions(blocksToRemove);
     assumeDynamicTypeRemover.finish();
     classInitializationAnalysis.finish();
-    oracle.finish();
     code.removeBlocks(blocksToRemove);
     code.removeAllTrivialPhis();
     assert code.isConsistentSSA();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningInfo.java
deleted file mode 100644
index f58cadd..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningInfo.java
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2017, 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.ir.optimize;
-
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.ir.code.Invoke.Type;
-import com.android.tools.r8.ir.code.InvokeMethod;
-import java.util.ArrayList;
-import java.util.List;
-
-
-// Class for collecting inlining information for one compiled DexEncodedMethod.
-public class InliningInfo {
-
-  static class Edge {
-    final Type type;
-    final DexMethod declared;
-    final Node inlinee;
-
-    public Edge(Type type, DexMethod declared, Node inlinee) {
-      this.type = type;
-      this.declared = declared;
-      this.inlinee = inlinee;
-    }
-
-    void appendOn(StringBuffer buffer) {
-      if (declared != null) {
-        buffer.append(declared.toSourceString());
-        buffer.append(' ');
-      }
-      inlinee.appendOn(buffer);
-    }
-  }
-
-  static abstract class Node {
-    abstract void appendOn(StringBuffer buffer);
-  }
-
-  static class Inlining extends Node {
-    final DexEncodedMethod target;
-
-    Inlining(DexEncodedMethod target) {
-      this.target = target;
-    }
-
-    @Override
-    void appendOn(StringBuffer buffer) {
-      buffer.append("<< INLINED");
-    }
-  }
-
-  static class NotInlining extends Node {
-
-    final String reason;
-
-    NotInlining(String reason) {
-      this.reason = reason;
-    }
-
-    @Override
-    public void appendOn(StringBuffer buffer) {
-      buffer.append("-- no inlining: ");
-      buffer.append(reason);
-    }
-  }
-
-  final DexEncodedMethod method;
-  final List<Edge> edges = new ArrayList<>();
-
-  public InliningInfo(DexEncodedMethod method) {
-    this.method = method;
-  }
-
-  public void include(Type type, DexEncodedMethod target) {
-    edges.add(new Edge(type, target.method, new Inlining(target)));
-  }
-
-  public void exclude(InvokeMethod invoke, String reason) {
-    edges.add(new Edge(invoke.getType(), invoke.getInvokedMethod(), new NotInlining(reason)));
-  }
-
-  @Override
-  public String toString() {
-    StringBuffer buffer = new StringBuffer(method.method.toSourceString());
-    buffer.append(" {\n");
-    for (Edge edge : edges) {
-      buffer.append("  ");
-      edge.appendOn(buffer);
-      buffer.append(".\n");
-    }
-    buffer.append("}\n");
-    return buffer.toString();
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
index 2cbc5a0..f75f3ff 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
@@ -21,8 +21,6 @@
 
   boolean isForcedInliningOracle();
 
-  void finish();
-
   // TODO(b/142116551): This should be equivalent to invoke.lookupSingleTarget(appView, context)!
   DexEncodedMethod lookupSingleTarget(InvokeMethod invoke, DexType context);
 
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 763ab39..ad82955 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -369,10 +369,8 @@
   }
 
   public Set<String> extensiveLoggingFilter = getExtensiveLoggingFilter();
-  public Set<String> extensiveFieldMinifierLoggingFilter = getExtensiveFieldMinifierLoggingFilter();
   public Set<String> extensiveInterfaceMethodMinifierLoggingFilter =
       getExtensiveInterfaceMethodMinifierLoggingFilter();
-  public Set<String> nullableReceiverInliningFilter = getNullableReceiverInliningFilter();
 
   public List<String> methodsFilter = ImmutableList.of();
   public int minApiLevel = AndroidApiLevel.getDefault().getLevel();
