Run GenericSignatureRewriter in parallel.

It's been detached from minfier for a while, hence no barrier that we
should run it in sequence.

Change-Id: Ie105a159b3181fc737a9116a50b6851617ea598b
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index e351c92..75f862e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -727,7 +727,8 @@
         // Rewrite signature annotations for applications that are not minified.
         if (appView.appInfo().hasLiveness()) {
           // TODO(b/124726014): Rewrite signature annotations in lens rewriting instead of here?
-          new GenericSignatureRewriter(appView.withLiveness()).run(appView.appInfo().classes());
+          new GenericSignatureRewriter(appView.withLiveness())
+              .run(appView.appInfo().classes(), executorService);
         }
         namingLens = NamingLens.getIdentityLens();
       }
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index 1c75720..96cd284 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
@@ -32,10 +31,11 @@
 import com.google.common.collect.Sets;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.function.Predicate;
 
 class ClassNameMinifier {
@@ -91,11 +91,14 @@
     }
   }
 
-  ClassRenaming computeRenaming(Timing timing) {
-    return computeRenaming(timing, Collections.emptyMap());
+  ClassRenaming computeRenaming(Timing timing, ExecutorService executorService)
+      throws ExecutionException {
+    return computeRenaming(timing, executorService, Collections.emptyMap());
   }
 
-  ClassRenaming computeRenaming(Timing timing, Map<DexType, DexString> syntheticClasses) {
+  ClassRenaming computeRenaming(
+      Timing timing, ExecutorService executorService, Map<DexType, DexString> syntheticClasses)
+      throws ExecutionException {
     // Externally defined synthetic classes populate an initial renaming.
     renaming.putAll(syntheticClasses);
 
@@ -139,13 +142,8 @@
     timing.begin("rename-generic");
     new GenericSignatureRewriter(appView, renaming)
         .run(
-            new Iterable<DexProgramClass>() {
-              @Override
-              public Iterator<DexProgramClass> iterator() {
-                return IteratorUtils.<DexClass, DexProgramClass>filter(
-                    classes.iterator(), DexClass::isProgramClass);
-              }
-            });
+            () -> IteratorUtils.filter(classes.iterator(), DexClass::isProgramClass),
+            executorService);
     timing.end();
 
     timing.begin("rename-arrays");
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index 359de49..f2d7c1a 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -57,7 +57,7 @@
             new MinificationPackageNamingStrategy(appView),
             // Use deterministic class order to make sure renaming is deterministic.
             appView.appInfo().classesWithDeterministicOrder());
-    ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing);
+    ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing, executorService);
     timing.end();
 
     assert new MinifiedRenaming(
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 7b6d191..471d66f 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -137,7 +137,7 @@
             new MinificationPackageNamingStrategy(appView),
             mappedClasses);
     ClassRenaming classRenaming =
-        classNameMinifier.computeRenaming(timing, syntheticCompanionClasses);
+        classNameMinifier.computeRenaming(timing, executorService, syntheticCompanionClasses);
     timing.end();
 
     ApplyMappingMemberNamingStrategy nameStrategy =
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index e891f95..b4ddb8e 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -19,9 +19,12 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
+import com.android.tools.r8.utils.ThreadUtils;
 import com.google.common.collect.Maps;
 import java.lang.reflect.GenericSignatureFormatError;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
@@ -44,39 +47,44 @@
     this.reporter = appView.options().reporter;
   }
 
-  public void run(Iterable<? extends DexProgramClass> classes) {
-    final GenericSignatureCollector genericSignatureCollector = new GenericSignatureCollector();
-    final GenericSignatureParser<DexType> genericSignatureParser =
-        new GenericSignatureParser<>(genericSignatureCollector);
+  public void run(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
+      throws ExecutionException {
     // Classes may not be the same as appInfo().classes() if applymapping is used on classpath
     // arguments. If that is the case, the ProguardMapMinifier will pass in all classes that is
     // either ProgramClass or has a mapping. This is then transitively called inside the
     // ClassNameMinifier.
-    for (DexProgramClass clazz : classes) {
-      genericSignatureCollector.setCurrentClassContext(clazz);
-      clazz.setAnnotations(
-          rewriteGenericSignatures(
-              clazz.annotations(),
-              genericSignatureParser::parseClassSignature,
-              genericSignatureCollector::getRenamedSignature,
-              (signature, e) -> parseError(clazz, clazz.getOrigin(), signature, e)));
-      clazz.forEachField(
-          field ->
-              field.setAnnotations(
-                  rewriteGenericSignatures(
-                      field.annotations(),
-                      genericSignatureParser::parseFieldSignature,
-                      genericSignatureCollector::getRenamedSignature,
-                      (signature, e) -> parseError(field, clazz.getOrigin(), signature, e))));
-      clazz.forEachMethod(
-          method ->
-              method.setAnnotations(
-                  rewriteGenericSignatures(
-                      method.annotations(),
-                      genericSignatureParser::parseMethodSignature,
-                      genericSignatureCollector::getRenamedSignature,
-                      (signature, e) -> parseError(method, clazz.getOrigin(), signature, e))));
-    }
+    ThreadUtils.processItems(
+        classes,
+        clazz -> {
+          GenericSignatureCollector genericSignatureCollector =
+              new GenericSignatureCollector(clazz);
+          GenericSignatureParser<DexType> genericSignatureParser =
+              new GenericSignatureParser<>(genericSignatureCollector);
+          clazz.setAnnotations(
+              rewriteGenericSignatures(
+                  clazz.annotations(),
+                  genericSignatureParser::parseClassSignature,
+                  genericSignatureCollector::getRenamedSignature,
+                  (signature, e) -> parseError(clazz, clazz.getOrigin(), signature, e)));
+          clazz.forEachField(
+              field ->
+                  field.setAnnotations(
+                      rewriteGenericSignatures(
+                          field.annotations(),
+                          genericSignatureParser::parseFieldSignature,
+                          genericSignatureCollector::getRenamedSignature,
+                          (signature, e) -> parseError(field, clazz.getOrigin(), signature, e))));
+          clazz.forEachMethod(
+              method ->
+                  method.setAnnotations(
+                      rewriteGenericSignatures(
+                          method.annotations(),
+                          genericSignatureParser::parseMethodSignature,
+                          genericSignatureCollector::getRenamedSignature,
+                          (signature, e) -> parseError(method, clazz.getOrigin(), signature, e))));
+        },
+        executorService
+    );
   }
 
   private DexAnnotationSet rewriteGenericSignatures(
@@ -154,17 +162,17 @@
 
   private class GenericSignatureCollector implements GenericSignatureAction<DexType> {
     private StringBuilder renamedSignature;
-    private DexProgramClass currentClassContext;
+    private final DexProgramClass currentClassContext;
     private DexType lastWrittenType = null;
 
+    GenericSignatureCollector(DexProgramClass clazz) {
+      this.currentClassContext = clazz;
+    }
+
     String getRenamedSignature() {
       return renamedSignature.toString();
     }
 
-    void setCurrentClassContext(DexProgramClass clazz) {
-      currentClassContext = clazz;
-    }
-
     @Override
     public void parsedSymbol(char symbol) {
       if (symbol == ';' && lastWrittenType == null) {