diff --git a/tools/run_benchmark.py b/tools/run_benchmark.py
index 0d1e4fd..f98c8b7 100755
--- a/tools/run_benchmark.py
+++ b/tools/run_benchmark.py
@@ -19,117 +19,134 @@
 ]
 GOLEM_BUILD_TARGETS = [utils.GRADLE_TASK_R8LIB] + GOLEM_BUILD_TARGETS_TESTS
 
+
 def get_golem_resource_path(benchmark):
-  return os.path.join('benchmarks', benchmark)
+    return os.path.join('benchmarks', benchmark)
+
 
 def get_jdk_home(options, benchmark):
-  if options.golem:
-    return os.path.join(get_golem_resource_path(benchmark), 'linux')
-  return None
+    if options.golem:
+        return os.path.join(get_golem_resource_path(benchmark), 'linux')
+    return None
+
 
 def parse_options(argv):
-  result = argparse.ArgumentParser(description = 'Run test-based benchmarks.')
-  result.add_argument('--golem',
-                      help='Indicate this as a run on golem',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--benchmark',
-                      help='The test benchmark to run',
-                      required=True)
-  result.add_argument('--target',
-                      help='The test target to run',
-                      required=True,
-                      # These should 1:1 with benchmarks/BenchmarkTarget.java
-                      choices=['d8', 'r8-full', 'r8-force', 'r8-compat'])
-  result.add_argument('--nolib', '--no-lib', '--no-r8lib',
-                      help='Run the non-lib R8 build (default false)',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--no-build', '--no_build',
-                      help='Run without building first (default false)',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--enable-assertions', '--enable_assertions', '-ea',
-                      help='Enable assertions when running',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--print-times',
-                      help='Print timing information from r8',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--version', '-v',
-                      help='Use R8 version/hash for the run (default local build)',
-                      default=None)
-  result.add_argument('--temp',
-                      help='A directory to use for temporaries and outputs.',
-                      default=None)
-  return result.parse_known_args(argv)
+    result = argparse.ArgumentParser(description='Run test-based benchmarks.')
+    result.add_argument('--golem',
+                        help='Indicate this as a run on golem',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--benchmark',
+                        help='The test benchmark to run',
+                        required=True)
+    result.add_argument(
+        '--target',
+        help='The test target to run',
+        required=True,
+        # These should 1:1 with benchmarks/BenchmarkTarget.java
+        choices=['d8', 'r8-full', 'r8-force', 'r8-compat'])
+    result.add_argument('--nolib',
+                        '--no-lib',
+                        '--no-r8lib',
+                        help='Run the non-lib R8 build (default false)',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--no-build',
+                        '--no_build',
+                        help='Run without building first (default false)',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--enable-assertions',
+                        '--enable_assertions',
+                        '-ea',
+                        help='Enable assertions when running',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--print-times',
+                        help='Print timing information from r8',
+                        default=False,
+                        action='store_true')
+    result.add_argument(
+        '--version',
+        '-v',
+        help='Use R8 version/hash for the run (default local build)',
+        default=None)
+    result.add_argument('--temp',
+                        help='A directory to use for temporaries and outputs.',
+                        default=None)
+    return result.parse_known_args(argv)
+
 
 def main(argv, temp):
-  (options, args) = parse_options(argv)
+    (options, args) = parse_options(argv)
 
-  if options.temp:
-    temp = options.temp
+    if options.temp:
+        temp = options.temp
 
-  if options.golem:
-    options.no_build = True
+    if options.golem:
+        options.no_build = True
+        if options.nolib:
+            print("Error: golem should always run r8lib")
+            return 1
+
     if options.nolib:
-      print("Error: golem should always run r8lib")
-      return 1
+        testBuildTargets = [
+            utils.GRADLE_TASK_TEST_JAR, utils.GRADLE_TASK_TEST_DEPS_JAR
+        ]
+        buildTargets = [utils.GRADLE_TASK_R8] + testBuildTargets
+        r8jar = utils.R8_JAR
+        testjars = [utils.R8_TESTS_JAR, utils.R8_TESTS_DEPS_JAR]
+    else:
+        testBuildTargets = GOLEM_BUILD_TARGETS_TESTS
+        buildTargets = GOLEM_BUILD_TARGETS
+        r8jar = utils.R8LIB_JAR
+        testjars = [
+            os.path.join(utils.R8LIB_TESTS_JAR),
+            os.path.join(utils.R8LIB_TESTS_DEPS_JAR)
+        ]
 
-  if options.nolib:
-    testBuildTargets = [utils.GRADLE_TASK_TEST_JAR, utils.GRADLE_TASK_TEST_DEPS_JAR]
-    buildTargets = [utils.GRADLE_TASK_R8] + testBuildTargets
-    r8jar = utils.R8_JAR
-    testjars = [utils.R8_TESTS_JAR, utils.R8_TESTS_DEPS_JAR]
-  else:
-    testBuildTargets = GOLEM_BUILD_TARGETS_TESTS
-    buildTargets = GOLEM_BUILD_TARGETS
-    r8jar = utils.R8LIB_JAR
-    testjars = [
-        os.path.join(utils.R8LIB_TESTS_JAR),
-        os.path.join(utils.R8LIB_TESTS_DEPS_JAR)
-    ]
+    if options.version:
+        # r8 is downloaded so only test jar needs to be built.
+        buildTargets = testBuildTargets
+        r8jar = compiledump.download_distribution(options.version,
+                                                  options.nolib, temp)
 
-  if options.version:
-    # r8 is downloaded so only test jar needs to be built.
-    buildTargets = testBuildTargets
-    r8jar = compiledump.download_distribution(options.version, options.nolib, temp)
+    if not options.no_build:
+        gradle.RunGradle(buildTargets + ['-Pno_internal'])
 
-  if not options.no_build:
-    gradle.RunGradle(buildTargets + ['-Pno_internal'])
+    if not options.golem:
+        # When running locally, change the working directory to be in 'temp'.
+        # This is hard to do properly within the JVM so we do it here.
+        with utils.ChangedWorkingDirectory(temp):
+            return run(options, r8jar, testjars)
+    else:
+        return run(options, r8jar, testjars)
 
-  if not options.golem:
-    # When running locally, change the working directory to be in 'temp'.
-    # This is hard to do properly within the JVM so we do it here.
-    with utils.ChangedWorkingDirectory(temp):
-      return run(options, r8jar, testjars)
-  else:
-    return run(options, r8jar, testjars)
 
 def run(options, r8jar, testjars):
-  jdkhome = get_jdk_home(options, options.benchmark)
-  cmd = [jdk.GetJavaExecutable(jdkhome)]
-  if options.enable_assertions:
-    cmd.append('-ea')
-  if options.print_times:
-    cmd.append('-Dcom.android.tools.r8.printtimes=1')
-  if not options.golem:
+    jdkhome = get_jdk_home(options, options.benchmark)
+    cmd = [jdk.GetJavaExecutable(jdkhome)]
+    if options.enable_assertions:
+        cmd.append('-ea')
+    if options.print_times:
+        cmd.append('-Dcom.android.tools.r8.printtimes=1')
+    if not options.golem:
+        cmd.extend([
+            '-DUSE_NEW_GRADLE_SETUP=true',
+            f'-DTEST_DATA_LOCATION={utils.REPO_ROOT}/d8_r8/test_modules/tests_java_8/build/classes/java/test'
+        ])
+    cmd.extend(['-cp', ':'.join([r8jar] + testjars)])
     cmd.extend([
-      '-DUSE_NEW_GRADLE_SETUP=true',
-      f'-DTEST_DATA_LOCATION={utils.REPO_ROOT}/d8_r8/test_modules/tests_java_8/build/classes/java/test'
-  ])
-  cmd.extend(['-cp', ':'.join([r8jar] + testjars)])
-  cmd.extend([
-    'com.android.tools.r8.benchmarks.BenchmarkMainEntryRunner',
-    options.benchmark,
-    options.target,
-    # When running locally the working directory is moved and we pass the
-    # repository root as an argument. The runner can then setup dependencies.
-    'golem' if options.golem else utils.REPO_ROOT,
+        'com.android.tools.r8.benchmarks.BenchmarkMainEntryRunner',
+        options.benchmark,
+        options.target,
+        # When running locally the working directory is moved and we pass the
+        # repository root as an argument. The runner can then setup dependencies.
+        'golem' if options.golem else utils.REPO_ROOT,
     ])
-  return subprocess.check_call(cmd)
+    return subprocess.check_call(cmd)
+
 
 if __name__ == '__main__':
-  with utils.TempDir() as temp:
-    sys.exit(main(sys.argv[1:], temp))
+    with utils.TempDir() as temp:
+        sys.exit(main(sys.argv[1:], temp))
