diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java
new file mode 100644
index 0000000..32d6962
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java
@@ -0,0 +1,112 @@
+// 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.ir.optimize.membervaluepropagation;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class AssumeInstanceFieldValueTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  public AssumeInstanceFieldValueTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(AssumeInstanceFieldValueTest.class)
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules(
+            "-assumevalues class " + Config.class.getTypeName() + " {",
+            "  boolean alwaysTrue return true;",
+            "}",
+            "-assumenosideeffects class " + Config.class.getTypeName() + " {",
+            "  boolean alwaysTrueNoSideEffects return true;",
+            "}")
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspect(this::inspect)
+        .run(parameters.getRuntime(), TestClass.class)
+        // TODO(b/147835946): Should be "Hello world!".
+        .assertSuccessWithOutput("");
+  }
+
+  private void inspect(CodeInspector inspector) {
+    ClassSubject configClassSubject = inspector.clazz(Config.class);
+    assertThat(configClassSubject, isPresent());
+
+    FieldSubject alwaysTrueFieldSubject = configClassSubject.uniqueFieldWithName("alwaysTrue");
+    assertThat(alwaysTrueFieldSubject, isPresent());
+
+    FieldSubject alwaysTrueNoSideEffectsFieldSubject =
+        configClassSubject.uniqueFieldWithName("alwaysTrueNoSideEffects");
+    assertThat(alwaysTrueNoSideEffectsFieldSubject, isPresent());
+
+    ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+    assertThat(testClassSubject, isPresent());
+
+    MethodSubject mainMethodSubject = testClassSubject.mainMethod();
+    assertThat(mainMethodSubject, isPresent());
+    assertEquals(
+        1,
+        mainMethodSubject
+            .streamInstructions()
+            .filter(InstructionSubject::isInstanceGet)
+            .map(InstructionSubject::getField)
+            .filter(alwaysTrueFieldSubject.getField().field::equals)
+            .count());
+    // TODO(b/147835946): Should be true.
+    assertFalse(
+        mainMethodSubject
+            .streamInstructions()
+            .filter(InstructionSubject::isInstanceGet)
+            .map(InstructionSubject::getField)
+            .noneMatch(alwaysTrueNoSideEffectsFieldSubject.getField().field::equals));
+  }
+
+  static class TestClass {
+
+    public static void main(String[] args) {
+      if (new Config().alwaysTrue) {
+        System.out.print("Hello");
+      }
+      Config nullableConfig = System.currentTimeMillis() >= 0 ? new Config() : null;
+      if (nullableConfig.alwaysTrue) {
+        System.out.print(" world");
+      }
+      if (nullableConfig.alwaysTrueNoSideEffects) {
+        System.out.println("!");
+      }
+    }
+  }
+
+  static class Config {
+
+    boolean alwaysTrue;
+    boolean alwaysTrueNoSideEffects;
+  }
+}
