diff --git a/src/main/java/com/android/tools/r8/dump/DumpOptions.java b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
index 55d4411..1d55987 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -118,7 +118,7 @@
     return builder.toString();
   }
 
-  private Map<String, String> getBuildProperties() {
+  public Map<String, String> getBuildProperties() {
     Map<String, String> buildProperties = new LinkedHashMap<>();
     addDumpEntry(buildProperties, TOOL_KEY, tool.name());
     // We keep the following values for backward compatibility.
diff --git a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
index 8414589..368974b 100644
--- a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
+++ b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
@@ -7,6 +7,9 @@
 import com.android.tools.r8.errors.Unreachable;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
 
 public abstract class DumpInputFlags {
 
@@ -47,7 +50,7 @@
   }
 
   public static DumpInputFlags dumpToFile(Path file) {
-    return new DumpInputFlags() {
+    return new DumpInputToFileOrDirectoryFlags() {
 
       @Override
       public Path getDumpPath() {
@@ -55,13 +58,6 @@
       }
 
       @Override
-      public boolean shouldDump(DumpOptions options) {
-        // TODO(b/236449152): Add support for dumping only with specific build properties (e.g.,
-        //  'tool=R8').
-        return true;
-      }
-
-      @Override
       public boolean shouldFailCompilation() {
         return true;
       }
@@ -69,7 +65,7 @@
   }
 
   public static DumpInputFlags dumpToDirectory(Path directory) {
-    return new DumpInputFlags() {
+    return new DumpInputToFileOrDirectoryFlags() {
 
       @Override
       public Path getDumpPath() {
@@ -77,13 +73,6 @@
       }
 
       @Override
-      public boolean shouldDump(DumpOptions options) {
-        // TODO(b/236449152): Add support for dumping only with specific build properties (e.g.,
-        //  'tool=R8').
-        return true;
-      }
-
-      @Override
       public boolean shouldFailCompilation() {
         return false;
       }
@@ -95,4 +84,20 @@
   public abstract boolean shouldDump(DumpOptions options);
 
   public abstract boolean shouldFailCompilation();
+
+  abstract static class DumpInputToFileOrDirectoryFlags extends DumpInputFlags {
+
+    @Override
+    public boolean shouldDump(DumpOptions options) {
+      Map<String, String> buildProperties = options.getBuildProperties();
+      for (Entry<String, String> entry : buildProperties.entrySet()) {
+        String valueRegExp =
+            System.getProperty("com.android.tools.r8.dump.filter.buildproperty." + entry.getKey());
+        if (valueRegExp != null && !Pattern.matches(valueRegExp, entry.getValue())) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
index 9fca511..52aafa3 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
@@ -5,6 +5,7 @@
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -14,6 +15,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.DumpInputFlags;
 import com.android.tools.r8.utils.ZipUtils;
@@ -80,6 +82,30 @@
   }
 
   @Test
+  public void testDumpToFileSystemPropertyWhenMinifying() throws Exception {
+    for (boolean minification : BooleanUtils.values()) {
+      Path dump = temp.newFolder().toPath().resolve("dump.zip");
+      try {
+        testForExternalR8(parameters.getBackend(), parameters.getRuntime())
+            .addJvmFlag("-Dcom.android.tools.r8.dumpinputtofile=" + dump)
+            .addJvmFlag("-Dcom.android.tools.r8.dump.filter.buildproperty.minification=^true$")
+            .addProgramClasses(TestClass.class)
+            .applyIf(!minification, builder -> builder.addKeepRules("-dontobfuscate"))
+            .compile();
+        // Without minification there should be no dump, and thus compilation should succeed.
+        assertFalse(minification);
+      } catch (AssertionError e) {
+        assertTrue(minification);
+      }
+      if (minification) {
+        verifyDump(dump, false, true);
+      } else {
+        assertFalse(Files.exists(dump));
+      }
+    }
+  }
+
+  @Test
   public void testDumpToFileCLI() throws Exception {
     Path dump = temp.newFolder().toPath().resolve("dump.zip");
     try {
