diff --git a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
deleted file mode 100644
index 20571ba..0000000
--- a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
+++ /dev/null
@@ -1,242 +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.benchmarks;
-
-import static com.android.tools.r8.benchmarks.BenchmarkUtils.printRuntimeNanoseconds;
-
-import com.android.tools.r8.ByteDataView;
-import com.android.tools.r8.ClassFileResourceProvider;
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.D8;
-import com.android.tools.r8.D8Command;
-import com.android.tools.r8.D8Command.Builder;
-import com.android.tools.r8.DexFilePerClassFileConsumer;
-import com.android.tools.r8.DexFilePerClassFileConsumer.ForwardingConsumer;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.ProgramConsumer;
-import com.android.tools.r8.ProgramResource;
-import com.android.tools.r8.ProgramResource.Kind;
-import com.android.tools.r8.ResourceException;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.ThreadUtils;
-import com.android.tools.r8.utils.ZipUtils;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.io.ByteStreams;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
-public class FrameworkIncrementalDexingBenchmark {
-  private static final int ITERATIONS = 100;
-  private static final int API = 24;
-  private static final Path JAR_DESUGARED =
-      Paths.get("third_party", "framework", "framework_14082017_desugared.jar");
-  private static final Path JAR_NOT_DESUGARED =
-      Paths.get("third_party", "framework", "framework_14082017.jar");
-  private static final Path LIB =
-      Paths.get("third_party", "android_jar", "lib-v" + API, "android.jar");
-
-  static class InMemoryClassPathProvider implements ClassFileResourceProvider {
-    Origin origin;
-    Map<String, byte[]> resources;
-
-    InMemoryClassPathProvider(Path archive) throws IOException {
-      origin = new PathOrigin(archive);
-      ImmutableMap.Builder<String, byte[]> builder = ImmutableMap.builder();
-      ZipUtils.iter(
-          archive.toString(),
-          (entry, stream) -> {
-            String name = entry.getName();
-            if (ZipUtils.isClassFile(name)) {
-              String descriptor = DescriptorUtils.guessTypeDescriptor(name);
-              builder.put(descriptor, ByteStreams.toByteArray(stream));
-            }
-          });
-      resources = builder.build();
-    }
-
-    @Override
-    public Set<String> getClassDescriptors() {
-      return resources.keySet();
-    }
-
-    @Override
-    public ProgramResource getProgramResource(String descriptor) {
-      byte[] bytes = resources.get(descriptor);
-      return bytes == null
-          ? null
-          : ProgramResource.fromBytes(
-              new EntryOrigin(descriptor, origin),
-              Kind.CF,
-              bytes,
-              Collections.singleton(descriptor));
-    }
-  }
-
-  static class EntryOrigin extends Origin {
-    final String descriptor;
-
-    public EntryOrigin(String descriptor, Origin parent) {
-      super(parent);
-      this.descriptor = descriptor;
-    }
-
-    @Override
-    public String part() {
-      return descriptor;
-    }
-  }
-
-  private static String title(String title, boolean desugar) {
-    return "FrameworkIncremental" + (desugar ? title : "NoDesugar" + title);
-  }
-
-  private static void compileAll(
-      Path input,
-      InMemoryClassPathProvider provider,
-      boolean desugar,
-      Map<String, ProgramResource> outputs,
-      ExecutorService executor)
-      throws IOException, CompilationFailedException {
-
-    ProgramConsumer consumer =
-        new DexFilePerClassFileConsumer.ForwardingConsumer(null) {
-          @Override
-          public synchronized void accept(
-              String primaryClassDescriptor,
-              ByteDataView data,
-              Set<String> descriptors,
-              DiagnosticsHandler handler) {
-            ProgramResource resource = ProgramResource.fromBytes(
-                Origin.unknown(), Kind.DEX, data.copyByteData(), descriptors);
-            for (String descriptor : descriptors) {
-              assert !outputs.containsKey(descriptor);
-              if (provider.resources.containsKey(descriptor)) {
-                outputs.put(descriptor, resource);
-              }
-            }
-          }
-        };
-
-    long start = System.nanoTime();
-    D8.run(
-        D8Command.builder()
-            .setMinApiLevel(API)
-            .setIntermediate(true)
-            .setMode(CompilationMode.DEBUG)
-            .addProgramFiles(input)
-            .addLibraryFiles(LIB)
-            .setDisableDesugaring(!desugar)
-            .setProgramConsumer(consumer)
-            .build(),
-        executor);
-    printRuntimeNanoseconds(title("DexAll", desugar), System.nanoTime() - start);
-  }
-
-  private static void compileGroupsOf(
-      int count,
-      List<String> descriptors,
-      InMemoryClassPathProvider provider,
-      boolean desugar,
-      Map<String, ProgramResource> outputs,
-      ExecutorService executor)
-      throws IOException, CompilationFailedException {
-    ProgramConsumer consumer =
-        new ForwardingConsumer(null) {
-          @Override
-          public synchronized void accept(
-              String primaryClassDescriptor,
-              ByteDataView data,
-              Set<String> descriptors,
-              DiagnosticsHandler handler) {
-            ProgramResource resource = ProgramResource.fromBytes(
-                Origin.unknown(), Kind.DEX, data.copyByteData(), descriptors);
-            for (String descriptor : descriptors) {
-              if (provider.resources.containsKey(descriptor)) {
-                outputs.put(descriptor, resource);
-              }
-            }
-          }
-        };
-
-    descriptors.sort(String::compareTo);
-    int increment = descriptors.size() / ITERATIONS;
-    long start = System.nanoTime();
-    for (int iteration = 0; iteration < ITERATIONS; iteration++) {
-      int index = iteration * increment;
-      Builder builder =
-          D8Command.builder()
-              .setMinApiLevel(API)
-              .setIntermediate(true)
-              .setMode(CompilationMode.DEBUG)
-              .addClasspathResourceProvider(provider)
-              .addLibraryFiles(LIB)
-              .setProgramConsumer(consumer)
-              .setDisableDesugaring(!desugar);
-      for (int j = 0; j < count; j++) {
-        builder.addClassProgramData(provider.resources.get(descriptors.get(index + j)),
-            Origin.unknown());
-      }
-      D8.run(builder.build(), executor);
-    }
-    printRuntimeNanoseconds(title("DexGroupsOf" + count, desugar), System.nanoTime() - start);
-  }
-
-  private static void merge(
-      boolean desugar, Map<String, ProgramResource> outputs, ExecutorService executor)
-      throws IOException, CompilationFailedException, ResourceException {
-    Builder builder =
-        D8Command.builder()
-            .setMinApiLevel(API)
-            .setIntermediate(false)
-            .setMode(CompilationMode.DEBUG)
-            .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-            .setDisableDesugaring(true);
-    for (ProgramResource input : outputs.values()) {
-      try (InputStream inputStream = input.getByteStream()) {
-        builder.addDexProgramData(ByteStreams.toByteArray(inputStream), input.getOrigin());
-      }
-    }
-    long start = System.nanoTime();
-    D8.run(
-        builder // never need to desugar when merging dex.
-            .build(),
-        executor);
-    printRuntimeNanoseconds(title("DexMerge", desugar), System.nanoTime() - start);
-  }
-
-  public static void main(String[] args)
-      throws IOException, CompilationFailedException, ResourceException {
-    boolean desugar = Arrays.asList(args).contains("--desugar");
-    Path input = desugar ? JAR_NOT_DESUGARED : JAR_DESUGARED;
-    InMemoryClassPathProvider provider = new InMemoryClassPathProvider(input);
-    List<String> descriptors = new ArrayList<>(provider.getClassDescriptors());
-    Map<String, ProgramResource> outputs = new HashMap<>(provider.getClassDescriptors().size());
-    int threads = Integer.min(Runtime.getRuntime().availableProcessors(), 16) / 2;
-    ExecutorService executor = ThreadUtils.getExecutorService(threads);
-    try {
-      compileAll(input, provider, desugar, outputs, executor);
-      compileGroupsOf(1, descriptors, provider, desugar, outputs, executor);
-      compileGroupsOf(10, descriptors, provider, desugar, outputs, executor);
-      compileGroupsOf(100, descriptors, provider, desugar, outputs, executor);
-      merge(desugar, outputs, executor);
-      // TODO: We should run dex2oat to verify the compilation.
-    } finally {
-      executor.shutdown();
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java
deleted file mode 100644
index 477fd63..0000000
--- a/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java
+++ /dev/null
@@ -1,60 +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.benchmarks;
-
-import com.android.tools.r8.ByteDataView;
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.D8;
-import com.android.tools.r8.D8Command;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.utils.ThreadUtils;
-import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
-public class IncrementalDexingBenchmark {
-  private static final int ITERATIONS = 1000;
-
-  public static void compile(ExecutorService executor)
-      throws IOException, CompilationFailedException {
-    D8.run(
-        D8Command.builder()
-            .addProgramFiles(Paths.get("build/test/examples/arithmetic.jar"))
-            .setMode(CompilationMode.DEBUG)
-            .setDisableDesugaring(true)
-            .setProgramConsumer(
-                new DexIndexedConsumer.ForwardingConsumer(null) {
-                  @Override
-                  public void accept(
-                      int fileIndex,
-                      ByteDataView data,
-                      Set<String> descriptors,
-                      DiagnosticsHandler handler) {
-                    if (fileIndex != 0) {
-                      throw new RuntimeException("WAT");
-                    }
-                  }
-                })
-            .build(),
-        executor);
-  }
-
-  public static void main(String[] args) throws IOException, CompilationFailedException {
-    int threads = Integer.min(Runtime.getRuntime().availableProcessors(), 16) / 2;
-    ExecutorService executor = ThreadUtils.getExecutorService(threads);
-    try {
-      long start = System.nanoTime();
-      for (int i = 0; i < ITERATIONS; i++) {
-        compile(executor);
-      }
-      double elapsedMs = (System.nanoTime() - start) / 1000000.0;
-      BenchmarkUtils.printRuntimeMilliseconds("IncrementalDexing", elapsedMs);
-    } finally {
-      executor.shutdown();
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkSuite.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkSuite.java
index 1068f72..cecba1d 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkSuite.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkSuite.java
@@ -6,11 +6,7 @@
 /** Enumeration of the benchmark suites on Golem. */
 public enum BenchmarkSuite {
   R8_BENCHMARKS("R8Benchmarks", "suite"),
-  D8_BENCHMARKS("D8KeyBenchmarks", "d8KeySuite"),
-  D8_INCREMENTAL_BENCHMARKS("D8IncrementalBenchmarks", "incrementalSuite"),
-  OPENSOURCE_BENCHMARKS("OpenSourceAppDumps", "dumpsSuite"),
-  MEMORY_BENCHMARKS("R8MemoryBenchmarks", "r8MemorySuite"),
-  RETRACE_BENCHMARKS("R8RetraceBenchmarks", "r8RetraceSuite");
+  OPENSOURCE_BENCHMARKS("OpenSourceAppDumps", "dumpsSuite");
 
   private final String golemName;
   private final String dartName;
diff --git a/tools/golem_build.py b/tools/golem_build.py
index e9de5eb..4f668d6 100755
--- a/tools/golem_build.py
+++ b/tools/golem_build.py
@@ -8,26 +8,16 @@
 import sys
 
 import gradle
-import retrace_benchmark
 import run_benchmark
 import run_on_app_dump
 
 GRADLE_ARGS = ['--no-daemon', '-Pno_internal']
 
-LEGACY_BUILD_TARGETS = [
-  'R8',
-  'D8',
-  'buildExampleJars',
-  'downloadAndroidCts',
-  'downloadDx']
-
 def lower(items):
   return [ item.lower() for item in items ]
 
 def Main():
   targets = set()
-  targets.update(lower(LEGACY_BUILD_TARGETS))
-  targets.update(lower(retrace_benchmark.GOLEM_BUILD_TARGETS))
   targets.update(lower(run_benchmark.GOLEM_BUILD_TARGETS))
   targets.update(lower(run_on_app_dump.GOLEM_BUILD_TARGETS))
   cmd = GRADLE_ARGS + [target for target in targets]
diff --git a/tools/retrace_benchmark.py b/tools/retrace_benchmark.py
deleted file mode 100755
index 8c9121a..0000000
--- a/tools/retrace_benchmark.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2020, 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.
-
-import argparse
-import os
-import subprocess
-import sys
-import time
-
-import golem
-import jdk
-import proguard
-import utils
-
-GOLEM_BUILD_TARGETS = ['R8Lib']
-RETRACERS = ['r8', 'proguard', 'remapper']
-
-def parse_arguments(argv):
-  parser = argparse.ArgumentParser(
-                    description = 'Run r8 retrace bootstrap benchmarks.')
-  parser.add_argument('--golem',
-                    help = 'Link in third party dependencies.',
-                    default = False,
-                    action = 'store_true')
-  parser.add_argument('--ignore-java-version',
-                    help='Do not check java version',
-                    default=False,
-                    action='store_true')
-  parser.add_argument('--print-runtimeraw',
-                    metavar='BENCHMARKNAME',
-                    help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
-                        ' <elapsed> ms\' at the end where <elapsed> is' +
-                        ' the elapsed time in milliseconds.')
-  parser.add_argument('--retracer',
-                    help='The retracer to use',
-                    choices=RETRACERS,
-                    required=True)
-  parser.add_argument('--download-benchmarks',
-                      help='Download retrace benchmarks',
-                      default=False,
-                      action='store_true')
-  options = parser.parse_args(argv)
-  return options
-
-def download_benchmarks():
-  utils.DownloadFromGoogleCloudStorage(
-      os.path.join(utils.THIRD_PARTY, 'retrace_benchmark') + '.tar.gz.sha1')
-
-def run_retrace(options, temp):
-  if options.download_benchmarks:
-    download_benchmarks()
-  if options.retracer == 'r8':
-    retracer_args = [
-        '-cp', utils.R8LIB_JAR, 'com.android.tools.r8.retrace.Retrace']
-  elif options.retracer == 'proguard':
-    retracer_args = ['-jar', proguard.getRetraceJar()]
-  elif options.retracer == 'remapper':
-    retracer_args = ['-jar',
-                     os.path.join(
-                        utils.THIRD_PARTY,
-                        'remapper',
-                        'remapper_deploy.jar')]
-  else:
-    assert False, "Unexpected retracer " + options.retracer
-  retrace_args = [jdk.GetJavaExecutable()] + retracer_args + [
-    os.path.join(utils.THIRD_PARTY, 'retrace_benchmark', 'r8lib.jar.map'),
-    os.path.join(utils.THIRD_PARTY, 'retrace_benchmark', 'stacktrace.txt')]
-  utils.PrintCmd(retrace_args)
-  t0 = time.time()
-  subprocess.check_call(retrace_args)
-  t1 = time.time()
-  if options.print_runtimeraw:
-    print('{}(RunTimeRaw): {} ms'
-        .format(options.print_runtimeraw, 1000.0 * (t1 - t0)))
-
-
-if __name__ == '__main__':
-  options = parse_arguments(sys.argv[1:])
-  if options.golem:
-    golem.link_third_party()
-  if not options.ignore_java_version:
-    utils.check_java_version()
-  with utils.TempDir() as temp:
-    run_retrace(options, temp)
diff --git a/tools/run_bootstrap_benchmark.py b/tools/run_bootstrap_benchmark.py
deleted file mode 100755
index 0b35975..0000000
--- a/tools/run_bootstrap_benchmark.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2018, 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.
-
-import argparse
-import os
-import sys
-
-import golem
-import minify_tool
-import toolhelper
-import utils
-
-MEMORY_XMX_LIMIT_BENCHMARK = 270
-
-def parse_arguments(argv):
-  parser = argparse.ArgumentParser(
-      description = 'Run r8 bootstrap benchmarks.')
-  parser.add_argument('--golem',
-      help = 'Link in third party dependencies.',
-      default = False,
-      action = 'store_true')
-  parser.add_argument('--limit-memory-runtime-test',
-      help = 'Run in a specific memory limit.',
-      default = False,
-      action = 'store_true')
-  return parser.parse_args(argv)
-
-
-def dex(input, output):
-  return_code = toolhelper.run(
-      'd8', [
-        input,
-        '--output', output,
-        '--lib', utils.RT_JAR,
-        '--min-api', '10000',
-        '--no-desugaring',
-      ],
-      debug=False,
-      build=False)
-  if return_code != 0:
-    sys.exit(return_code)
-
-if __name__ == '__main__':
-  options = parse_arguments(sys.argv[1:])
-  if options.golem:
-    golem.link_third_party()
-  with utils.TempDir() as temp:
-    memory_file = os.path.join(temp, 'memory.dump')
-    r8_output = os.path.join(temp, 'r8.zip')
-    d8_r8_output = os.path.join(temp, 'd8r8.zip')
-    d8_pg_output = os.path.join(temp, 'd8pg.zip')
-
-    run_memory_test = options.limit_memory_runtime_test
-
-    java_args = (['-Xmx%sM' % MEMORY_XMX_LIMIT_BENCHMARK]
-                 if run_memory_test else [])
-
-    benchmark_name = "MemoryR8Pinned" if run_memory_test else "BootstrapR8"
-
-    return_code = minify_tool.minify_tool(
-      input_jar=utils.PINNED_R8_JAR,
-      output_jar=r8_output,
-      debug=False,
-      build=False,
-      track_memory_file=memory_file,
-      benchmark_name=benchmark_name,
-      java_args=java_args)
-
-    if return_code != 0:
-      sys.exit(return_code)
-
-    if run_memory_test:
-      # We are not tracking code-size, so return early.
-      sys.exit(0)
-
-    dex(r8_output, d8_r8_output)
-    print "BootstrapR8(CodeSize):", utils.uncompressed_size(r8_output)
-    print "BootstrapR8Dex(CodeSize):", utils.uncompressed_size(d8_r8_output)
-
-    dex(utils.PINNED_PGR8_JAR, d8_pg_output)
-    print "BootstrapR8PG(CodeSize):", utils.uncompressed_size(
-        utils.PINNED_PGR8_JAR)
-    print "BootstrapR8PGDex(CodeSize):", utils.uncompressed_size(d8_pg_output)
-
-    r8_notreeshaking_output = os.path.join(temp, 'r8-notreeshaking.zip')
-    return_code = minify_tool.minify_tool(
-      input_jar=utils.PINNED_R8_JAR,
-      output_jar=r8_notreeshaking_output,
-      debug=False,
-      build=False,
-      benchmark_name="BootstrapR8NoTreeShaking",
-      additional_args=["--no-tree-shaking"])
-    if return_code != 0:
-      sys.exit(return_code)
-
-  sys.exit(0)
diff --git a/tools/test_framework.py b/tools/test_framework.py
deleted file mode 100755
index dccb63a..0000000
--- a/tools/test_framework.py
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/usr/bin/env python3
-# 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.
-
-# Run D8 or DX on 'third_party/framework/framework_<version>.jar'.
-# Report Golem-compatible CodeSize and RunTimeRaw values:
-#
-#     <NAME>-Total(CodeSize): <size>
-#     <NAME>-Total(RunTimeRaw>: <time> ms
-#
-# and also detailed segment sizes for each dex segment:
-#
-#    <NAME>-Code(CodeSize): <size>
-#    <NAME>-AnnotationSets(CodeSize): <size>
-#    ...
-#
-# Uses the DexSegment Java tool (Gradle target).
-
-from __future__ import print_function
-from glob import glob
-import argparse
-import golem
-import jdk
-import os
-import re
-import subprocess
-import sys
-import time
-
-import utils
-
-DX_JAR = os.path.join(utils.REPO_ROOT, 'tools', 'linux', 'dx', 'framework',
-    'dx.jar')
-FRAMEWORK_JAR = os.path.join('third_party', 'framework',
-    'framework_14082017_desugared.jar')
-MIN_SDK_VERSION = '24'
-
-def parse_arguments():
-  parser = argparse.ArgumentParser(
-      description = 'Run D8 or DX'
-          ' third_party/framework/framework*.jar.'
-          ' Report Golem-compatible CodeSize and RunTimeRaw values.')
-  parser.add_argument('--tool',
-      choices = ['dx', 'd8', 'd8-release'],
-      required = True,
-      help = 'Compiler tool to use.')
-  parser.add_argument('--golem',
-      help = 'Running on golem, link in third_party resources.',
-      default = False,
-      action = 'store_true')
-  parser.add_argument('--name',
-      required = True,
-      help = 'Results will be printed using the specified benchmark name (e.g.'
-          ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported'
-          ' with <NAME>-Total(CodeSize)')
-  parser.add_argument('--print-memoryuse',
-      help = 'Prints the line \'<NAME>-Total(MemoryUse):' 
-          ' <mem>\' at the end where <mem> is the peak'
-          ' peak resident set size (VmHWM) in bytes.',
-      default = False,
-      action = 'store_true')
-  parser.add_argument('--output',
-      help = 'Output directory to keep the generated files')
-  return parser.parse_args()
-
-def Main():
-  args = parse_arguments()
-  if args.golem:
-    golem.link_third_party()
-  utils.check_java_version()
-  output_dir = args.output
-  with utils.TempDir() as temp_dir:
-
-    if not output_dir:
-      output_dir = temp_dir
-
-    xmx = None
-    if args.tool == 'dx':
-      tool_file = DX_JAR
-      tool_args = ['--dex', '--output=' + output_dir, '--multi-dex',
-                   '--min-sdk-version=' + MIN_SDK_VERSION]
-      xmx = '-Xmx1600m'
-    else:
-      tool_file = utils.D8_JAR
-      tool_args = ['--output', output_dir, '--min-api', MIN_SDK_VERSION]
-      if args.tool == 'd8-release':
-        tool_args.append('--release')
-      xmx = '-Xmx600m'
-
-    cmd = []
-
-    track_memory_file = None
-    if args.print_memoryuse:
-      track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE)
-      cmd.extend(['tools/track_memory.sh', track_memory_file])
-
-    if tool_file.endswith('.jar'):
-      assert xmx is not None
-      cmd.extend([jdk.GetJavaExecutable(), xmx, '-jar'])
-
-    cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR])
-
-    utils.PrintCmd(cmd)
-
-    t0 = time.time()
-    subprocess.check_call(cmd)
-    dt = time.time() - t0
-
-    if args.print_memoryuse:
-      print('{}-Total(MemoryUse): {}'
-          .format(args.name, utils.grep_memoryuse(track_memory_file)))
-
-    dex_files = [f for f in glob(os.path.join(output_dir, '*.dex'))]
-    code_size = 0
-    for dex_file in dex_files:
-      code_size += os.path.getsize(dex_file)
-
-    print('{}-Total(RunTimeRaw): {} ms'
-      .format(args.name, 1000.0 * dt))
-
-    print('{}-Total(CodeSize): {}'
-      .format(args.name, code_size))
-
-    utils.print_dexsegments(args.name, dex_files)
-
-if __name__ == '__main__':
-  sys.exit(Main())
diff --git a/tools/test_helloexample.py b/tools/test_helloexample.py
deleted file mode 100755
index 509351e..0000000
--- a/tools/test_helloexample.py
+++ /dev/null
@@ -1,254 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2019, 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.
-
-# Run R8 on a simple Hello World program
-# Report Golem-compatible RunTimeRaw values:
-#
-#     <NAME>-Total(RunTimeRaw): <time> ms
-#
-# where <NAME> is Hello{,Dex}{,Large}{,NoOpt}
-
-import argparse
-import os
-import subprocess
-import sys
-import time
-import zipfile
-
-import golem
-import jdk
-import proguard
-import utils
-
-HELLO_JAR = os.path.join(utils.BUILD, 'test', 'examples', 'hello.jar')
-
-EXTRA_INPUTS = [
-  os.path.join(utils.THIRD_PARTY, 'sample_libraries', lib) for lib in [
-    'animal-sniffer-annotations-1.17.jar',
-    'annotations-13.0.jar',
-    'checker-compat-qual-2.5.2.jar',
-    'collections-28.0.0.jar',
-    'common-1.1.1.jar',
-    'commons-collections4-4.3.jar',
-    'commons-compress-1.18.jar',
-    'commons-lang3-3.8.1.jar',
-    'commons-math3-3.6.1.jar',
-    'constraint-layout-solver-1.1.3.jar',
-    'converter-gson-2.5.0.jar',
-    'dagger-2.22.1.jar',
-    'error_prone_annotations-2.2.0.jar',
-    'failureaccess-1.0.1.jar',
-    'gson-2.8.2.jar',
-    'guava-27.1-android.jar',
-    'j2objc-annotations-1.1.jar',
-    'javax.inject-1.jar',
-    'jsr305-3.0.2.jar',
-    'kotlin-stdlib-1.3.21.jar',
-    'kotlin-stdlib-common-1.3.21.jar',
-    'kotlin-stdlib-jdk7-1.3.21.jar',
-    'listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar',
-    'okhttp-3.14.0.jar',
-    'okio-1.17.2.jar',
-    'play-services-ads-17.2.0-javadoc.jar',
-    'play-services-ads-base-17.2.0-javadoc.jar',
-    'play-services-ads-lite-17.2.0-javadoc.jar',
-    'play-services-analytics-16.0.8-javadoc.jar',
-    'play-services-analytics-impl-16.0.8-javadoc.jar',
-    'play-services-base-16.1.0-javadoc.jar',
-    'play-services-basement-16.2.0-javadoc.jar',
-    'play-services-cast-16.1.2-javadoc.jar',
-    'play-services-drive-16.1.0-javadoc.jar',
-    'play-services-fitness-16.0.1-javadoc.jar',
-    'play-services-games-17.0.0-javadoc.jar',
-    'play-services-gass-17.2.0-javadoc.jar',
-    'play-services-gcm-16.1.0-javadoc.jar',
-    'play-services-iid-16.0.1-javadoc.jar',
-    'play-services-measurement-16.4.0-javadoc.jar',
-    'play-services-measurement-api-16.4.0-javadoc.jar',
-    'play-services-measurement-base-16.4.0-javadoc.jar',
-    'play-services-measurement-impl-16.4.0-javadoc.jar',
-    'play-services-measurement-sdk-16.4.0-javadoc.jar',
-    'play-services-measurement-sdk-api-16.4.0-javadoc.jar',
-    'play-services-tagmanager-v4-impl-16.0.8-javadoc.jar',
-    'play-services-vision-17.0.2-javadoc.jar',
-    'play-services-vision-common-17.0.2-javadoc.jar',
-    'protobuf-lite-3.0.1.jar',
-    'reactive-streams-1.0.2.jar',
-    'retrofit-2.5.0.jar',
-    'rxjava-2.2.8.jar',
-    'support-annotations-28.0.0.jar',
-  ]
-]
-
-EXTRA_KEEP_RULES = ['-dontwarn java.lang.ClassValue']
-
-def parse_arguments():
-  parser = argparse.ArgumentParser(
-      description = 'Compile a hello world example program')
-  parser.add_argument('--tool',
-                      choices = ['d8', 'r8'] + proguard.getVersions(),
-                      required = True,
-                      help = 'Compiler tool to use.')
-  parser.add_argument('--output-mode',
-                      choices = ['dex', 'cf'],
-                      required = True,
-                      help = 'Output mode to compile to.')
-  parser.add_argument('--golem',
-                      help = 'Running on golem, link in third_party resources.',
-                      default = False,
-                      action = 'store_true')
-  parser.add_argument('--large',
-                      help = 'Add many additional program inputs.',
-                      default = False,
-                      action = 'store_true')
-  parser.add_argument('--noopt',
-                      help = 'Disable most optimizations/processing.',
-                      default = False,
-                      action = 'store_true')
-  parser.add_argument('--print-memoryuse',
-                      help = 'Prints the line \'<NAME>-Total(MemoryUse):'
-                             ' <mem>\' at the end where <mem> is the peak'
-                             ' peak resident set size (VmHWM) in bytes.',
-                      default = False,
-                      action = 'store_true')
-  parser.add_argument('--output',
-                      help = 'Output directory to keep the generated files')
-  return parser.parse_args()
-
-def GetConfRules(extra, noopt):
-  rules = ['-keep class hello.Hello { void main(java.lang.String[]); }']
-  if len(extra) > 0:
-    rules.extend(EXTRA_KEEP_RULES)
-  if noopt:
-    rules.extend([
-      '-dontoptimize',
-      '-dontshrink',
-      '-dontobfuscate',
-      '-keepattributes *',
-    ])
-  return rules
-
-def GetCompilerPrefix(tool, mode, output, input, lib, extra, noopt):
-  return [
-    jdk.GetJavaExecutable(),
-    '-jar', utils.R8_JAR if tool == 'r8' else utils.D8_JAR,
-    '--output', output,
-    '--lib', lib,
-    '--debug' if noopt else '--release',
-    input,
-  ] + ([] if mode == 'cf' else ['--min-api', '21']) + extra
-
-def Compile(tool, output_mode, lib, extra, output_dir, noopt, temp_dir):
-  output = os.path.join(output_dir, 'out.zip')
-  if tool == 'd8':
-    if output_mode != 'dex':
-      raise ValueError('Invalid output mode for D8')
-    classpath = []
-    for cp_entry in extra:
-      classpath.extend(['--classpath', cp_entry])
-    return [
-      GetCompilerPrefix(
-        tool, output_mode, output, HELLO_JAR, lib, classpath, noopt)
-    ]
-  # The compilation is either R8 or PG.
-  # Write keep rules to a temporary file.
-  rules = GetConfRules(extra, noopt)
-  rules_file = os.path.join(temp_dir, 'rules.conf')
-  open(rules_file, 'w').write('\n'.join(rules))
-  if tool == 'r8':
-    cmd = GetCompilerPrefix(
-        tool, output_mode, output, HELLO_JAR, lib, extra, noopt)
-    cmd.extend(['--pg-conf', rules_file])
-    if output_mode == 'cf':
-      cmd.append('--classfile')
-    return [cmd]
-  if proguard.isValidVersion(tool):
-    # Build PG invokation with additional rules to silence warnings.
-    pg_out = output if output_mode == 'cf' \
-      else os.path.join(output_dir, 'pgout.zip')
-    cmds = [proguard.getCmd([
-      '-injars', ':'.join([HELLO_JAR] + extra),
-      '-libraryjars', lib,
-      '-outjars', pg_out,
-      '-dontwarn **',
-      '@' + rules_file
-    ], version=tool)]
-    if output_mode == 'dex':
-      cmds.append(
-          GetCompilerPrefix('d8', 'dex', output, pg_out, lib, [], noopt))
-    return cmds
-  raise ValueError('Unknown tool: ' + tool)
-
-def ProcessInput(input, tmp_dir):
-  if not input.endswith('.aar'):
-    return input
-  out_dir = os.path.join(tmp_dir, input)
-  os.makedirs(out_dir)
-  zip = zipfile.ZipFile(input, 'r')
-  zip.extractall(out_dir)
-  zip.close()
-  return os.path.join(out_dir, 'classes.jar')
-
-def Main():
-  args = parse_arguments()
-  if args.golem:
-    golem.link_third_party()
-  utils.check_java_version()
-
-  with utils.TempDir() as temp_dir:
-    cmd_prefix = []
-    output_dir = args.output if args.output else temp_dir
-    temp_dir = os.path.join(args.output, 'tmp') if args.output else temp_dir
-
-    track_memory_file = None
-    if args.print_memoryuse:
-      track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE)
-      cmd_prefix.extend(['tools/track_memory.sh', track_memory_file])
-
-    name = 'CompileHelloExample'
-
-    tool = args.tool
-    output_mode = args.output_mode
-    lib = None
-    if output_mode == 'dex':
-      name += 'Dex'
-      lib = utils.get_android_jar(28)
-    else:
-      lib = utils.RT_JAR
-
-    extra = []
-    if args.large:
-      name += 'Large'
-      extra = EXTRA_INPUTS
-
-    if args.noopt:
-      name += 'NoOpt'
-
-    cmds = Compile(
-      tool,
-      output_mode,
-      lib,
-      extra,
-      output_dir,
-      args.noopt,
-      temp_dir,
-    )
-
-    t0 = time.time()
-    for cmd in cmds:
-      fullcmd = cmd_prefix + cmd
-      utils.PrintCmd(fullcmd)
-      subprocess.check_output(fullcmd)
-    dt = time.time() - t0
-
-    if args.print_memoryuse:
-      print('{}(MemoryUse): {}'
-            .format(name, utils.grep_memoryuse(track_memory_file)))
-
-    print('{}(RunTimeRaw): {} ms'
-          .format(name, 1000.0 * dt))
-
-if __name__ == '__main__':
-  sys.exit(Main())
