Extend RootSet pruning to conditional keep info
Change-Id: I6d864c12656fb619102e5905850f01b574feae42
diff --git a/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java
index 9e9cdc3..7d812b2 100644
--- a/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/DependentMinimumKeepInfoCollection.java
@@ -27,6 +27,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
import java.util.function.Function;
+import java.util.function.Predicate;
public abstract class DependentMinimumKeepInfoCollection {
@@ -159,6 +160,10 @@
return internalRemove(preconditionEvent, minimumKeepInfo -> minimumKeepInfo.remove(method));
}
+ public void removeIf(Predicate<? super MinimumKeepInfoCollection> predicate) {
+ dependentMinimumKeepInfo.values().removeIf(predicate);
+ }
+
private <J extends Joiner<?, ?, ?>> J internalRemove(
EnqueuerEvent preconditionEvent, Function<MinimumKeepInfoCollection, J> fn) {
MinimumKeepInfoCollection minimumKeepInfo = get(preconditionEvent);
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index b22bea5..626dc9a 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -1985,14 +1985,12 @@
public void pruneItems(PrunedItems prunedItems, Timing timing) {
timing.begin("Prune RootSet");
- MinimumKeepInfoCollection unconditionalMinimumKeepInfo =
- getDependentMinimumKeepInfo().getUnconditionalMinimumKeepInfoOrDefault(null);
- if (unconditionalMinimumKeepInfo != null) {
- unconditionalMinimumKeepInfo.pruneItems(prunedItems);
- if (unconditionalMinimumKeepInfo.isEmpty()) {
- getDependentMinimumKeepInfo().remove(UnconditionalKeepInfoEvent.get());
- }
- }
+ getDependentMinimumKeepInfo()
+ .removeIf(
+ minimumKeepInfo -> {
+ minimumKeepInfo.pruneItems(prunedItems);
+ return minimumKeepInfo.isEmpty();
+ });
timing.end();
}