diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index f1e1b89..9a30ef1 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "2.1.57";
+  public static final String LABEL = "2.1.58";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ff06397..08d6abf 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2307,6 +2307,10 @@
     return liveFields.contains(field);
   }
 
+  public boolean isFieldLive(DexEncodedField field) {
+    return liveFields.contains(field);
+  }
+
   public boolean isFieldRead(ProgramField field) {
     FieldAccessInfoImpl info = fieldAccessInfoCollection.get(field.getReference());
     return info != null && info.isRead();
diff --git a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
index d8fbb6d..33aabd4 100644
--- a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
+++ b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
@@ -228,7 +228,11 @@
         filteredMembers,
         targetClass.fields(
             f ->
-                (enqueuer.isFieldReferenced(f) || f.getOptimizationInfo().valueHasBeenPropagated())
+                // Fields referenced only by -keep may not be referenced, we therefore have to
+                // filter on both live and referenced.
+                (enqueuer.isFieldLive(f)
+                        || enqueuer.isFieldReferenced(f)
+                        || f.getOptimizationInfo().valueHasBeenPropagated())
                     && appView.graphLense().getOriginalFieldSignature(f.field).holder
                         == sourceClass.type));
     Iterables.addAll(
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationWithWildcardTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationWithWildcardTest.java
new file mode 100644
index 0000000..3bb240a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationWithWildcardTest.java
@@ -0,0 +1,87 @@
+// 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.
+
+package com.android.tools.r8.shaking.ifrule;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class IfOnAnnotationWithWildcardTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  public IfOnAnnotationWithWildcardTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testR8WithTripleStars() throws Exception {
+    runTest(
+        "-if class ** { @"
+            + MyAnnotation.class.getTypeName()
+            + " *** *; }\n"
+            + "-keep class <1> { *; }");
+  }
+
+  @Test
+  public void testR8WithFields() throws Exception {
+    runTest(
+        "-if class ** { @"
+            + MyAnnotation.class.getTypeName()
+            + " <fields>; }\n"
+            + "-keep class <1> { *; }");
+  }
+
+  @Test
+  public void testR8WithAny() throws Exception {
+    runTest(
+        "-if class ** { @"
+            + MyAnnotation.class.getTypeName()
+            + " *; }\n"
+            + "-keep class <1> { *; }");
+  }
+
+  private void runTest(String ifRule) throws Exception {
+    testForR8Compat(parameters.getBackend())
+        .addProgramClasses(MyClass.class, MyAnnotation.class)
+        .setMinApi(parameters.getApiLevel())
+        .addKeepClassAndMembersRules(MyAnnotation.class)
+        .addKeepRules("-keep class * { @" + MyAnnotation.class.getTypeName() + " <fields>; }")
+        .addKeepRules(ifRule)
+        .addRunClasspathFiles(buildOnDexRuntime(parameters, Main.class))
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("Hello World = 42");
+  }
+
+  public static class MyClass {
+    @MyAnnotation int x;
+    int y;
+
+    public void foo() {
+      System.out.println("Hello World = " + y);
+    }
+  }
+
+  public @interface MyAnnotation {}
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      final MyClass myClass = new MyClass();
+      myClass.y = 42;
+      myClass.foo();
+    }
+  }
+}
