Merge "Cleanup remaining TODOs in R8InliningTest."
diff --git a/src/test/examples/inlining/A.java b/src/test/examples/inlining/A.java
index dd857c8..a7aa4d2 100644
--- a/src/test/examples/inlining/A.java
+++ b/src/test/examples/inlining/A.java
@@ -6,15 +6,21 @@
 class A {
 
   int a;
+  int b;
 
   A(int a) {
     this.a = a;
+    this.b = a + 1;
   }
 
   int a() {
     return a;
   }
 
+  int b() {
+    return b;
+  }
+
   int cannotInline(int v) {
     // Cannot inline due to recursion.
     if (v > 0) {
diff --git a/src/test/examples/inlining/Nullability.java b/src/test/examples/inlining/Nullability.java
index 74747d0..95422f0 100644
--- a/src/test/examples/inlining/Nullability.java
+++ b/src/test/examples/inlining/Nullability.java
@@ -43,8 +43,8 @@
   }
 
   int conditionalOperator(A a) {
-    // a is not null when a.a() is invoked.
-    return a != null ? a.a() : -1;
+    // a is not null when a.b() is invoked.
+    return a != null ? a.b() : -1;
   }
 
   int notInlinableOnThrow(Throwable t) throws Throwable {
@@ -97,8 +97,8 @@
     // instructions with side effects.
     if (a != null && result != 0) {
       // Thus, the invocation below is the first instruction with side effect.
-      // Also, a is not null here, hence a.a() is inlinable.
-      result *= a.a();
+      // Also, a is not null here, hence a.b() is inlinable.
+      result *= a.b();
     }
     return result;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 8e78784..7284384 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -27,6 +27,7 @@
 import com.android.tools.r8.code.Throw;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.dexinspector.ClassSubject;
@@ -55,17 +56,26 @@
   private static final String DEFAULT_DEX_FILENAME = "classes.dex";
   private static final String DEFAULT_MAP_FILENAME = "proguard.map";
 
-  @Parameters(name = "{0}")
+  @Parameters(name = "{0}, minification={1}, allowaccessmodification={2}")
   public static Collection<Object[]> data() {
-    return Arrays.asList(new Object[][]{{"Inlining"}});
+    return Arrays.asList(new Object[][]{
+        {"Inlining", false, false},
+        {"Inlining", false, true},
+        {"Inlining", true, false},
+        {"Inlining", true, true}
+    });
   }
 
   private final String name;
   private final String keepRulesFile;
+  private final boolean minification;
+  private final boolean allowAccessModification;
 
-  public R8InliningTest(String name) {
+  public R8InliningTest(String name, boolean minification, boolean allowAccessModification) {
     this.name = name.toLowerCase();
     this.keepRulesFile = ToolHelper.EXAMPLES_DIR + this.name + "/keep-rules.txt";
+    this.minification = minification;
+    this.allowAccessModification = allowAccessModification;
   }
 
   private Path getInputFile() {
@@ -81,7 +91,7 @@
   }
 
   private String getGeneratedProguardMap() throws IOException {
-    Path mapFile = Paths.get(temp.getRoot().getCanonicalPath(), DEFAULT_MAP_FILENAME);
+    Path mapFile = temp.getRoot().toPath().resolve(DEFAULT_MAP_FILENAME);
     if (Files.exists(mapFile)) {
       return mapFile.toAbsolutePath().toString();
     }
@@ -94,19 +104,23 @@
   @Before
   public void generateR8Version() throws Exception {
     Path out = temp.getRoot().toPath();
-    R8Command command =
+    Path mapFile = out.resolve(DEFAULT_MAP_FILENAME);
+    R8Command.Builder commandBuilder =
         R8Command.builder()
             .addProgramFiles(getInputFile())
             .setMinApiLevel(AndroidApiLevel.M.getLevel())
             .setOutput(out, OutputMode.DexIndexed)
-            .addProguardConfigurationFiles(Paths.get(keepRulesFile))
-            .build();
-    // TODO(62048823): Enable minification.
-    ToolHelper.runR8(command, o -> {
-      o.enableMinification = false;
+            .setProguardMapOutputPath(mapFile)
+            .addProguardConfigurationFiles(Paths.get(keepRulesFile));
+    if (allowAccessModification) {
+      commandBuilder.addProguardConfiguration(
+          ImmutableList.of("-allowaccessmodification"), Origin.unknown());
+    }
+    ToolHelper.runR8(commandBuilder.build(), o -> {
+      o.enableMinification = minification;
     });
-    String artOutput = ToolHelper.runArtNoVerificationErrors(out + "/classes.dex",
-        "inlining.Inlining");
+    String artOutput =
+        ToolHelper.runArtNoVerificationErrors(out + "/classes.dex", "inlining.Inlining");
 
     // Compare result with Java to make sure we have the same behavior.
     ProcessResult javaResult = ToolHelper.runJava(getInputFile(), "inlining.Inlining");
@@ -179,17 +193,21 @@
         new DexInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Nullability");
     MethodSubject m = clazz.method("int", "inlinable", ImmutableList.of("inlining.A"));
-    assertTrue(m.isPresent());
-    DexCode code = m.getMethod().getCode().asDexCode();
-    checkInstructions(
-        code,
-        ImmutableList.of(
-            Iget.class,
-            // TODO(b/70572176): below two could be replaced with Iget via inlining
-            InvokeVirtual.class,
-            MoveResult.class,
-            AddInt2Addr.class,
-            Return.class));
+    DexCode code;
+    if (allowAccessModification) {
+      assertFalse(m.isPresent());
+    } else {
+      assertTrue(m.isPresent());
+      code = m.getMethod().getCode().asDexCode();
+      checkInstructions(
+          code,
+          ImmutableList.of(
+              Iget.class,
+              InvokeVirtual.class,
+              MoveResult.class,
+              AddInt2Addr.class,
+              Return.class));
+    }
 
     m = clazz.method("int", "notInlinable", ImmutableList.of("inlining.A"));
     assertTrue(m.isPresent());
@@ -249,10 +267,7 @@
         code,
         ImmutableList.of(
             IfEqz.class,
-            // TODO(b/70794661): below two could be replaced with Iget via inlining if access
-            // modification is allowed.
-            InvokeVirtual.class,
-            MoveResult.class,
+            Iget.class,
             Goto.class,
             Const4.class,
             Return.class));
@@ -273,9 +288,7 @@
     builder.add(Const4.class);
     builder.add(IfEqz.class);
     builder.add(IfEqz.class);
-    // TODO(b/70794661): below two could be replaced with Iget via inlining
-    builder.add(InvokeVirtual.class);
-    builder.add(MoveResult.class);
+    builder.add(Iget.class);
     builder.add(MulInt2Addr.class);
     builder.add(Return.class);
     builder.add(PackedSwitchPayload.class);