Merge "Introduce IRCode#entryBlock."
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
index b4ff421..ad95b05 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
@@ -45,7 +45,7 @@
 
   public void run() {
 
-    BasicBlock firstBlock = code.blocks.get(0);
+    BasicBlock firstBlock = code.entryBlock();
     visitInstructions(firstBlock);
 
     while (!flowEdges.isEmpty() || !ssaEdges.isEmpty()) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
index 04f56f5..1ab0670 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
@@ -303,7 +303,7 @@
     for (int i = 0; i < inlinee.blocks.size(); i++) {
       blocksIterator.previous();
     }
-    assert IteratorUtils.peekNext(blocksIterator) == inlinee.blocks.getFirst();
+    assert IteratorUtils.peekNext(blocksIterator) == inlinee.entryBlock();
     // Iterate through the inlined blocks.
     for (BasicBlock inlinedBlock : inlinee.blocks) {
       BasicBlock expected = blocksIterator.next();
@@ -364,7 +364,7 @@
     List<Value> arguments = inlinee.collectArguments();
     assert invoke.inValues().size() == arguments.size();
 
-    BasicBlock entryBlock = inlinee.blocks.getFirst();
+    BasicBlock entryBlock = inlinee.entryBlock();
     InstructionListIterator entryBlockIterator;
 
     int i = 0;
@@ -425,7 +425,7 @@
     new TypeAnalysis(appInfo, inlinee.method).narrowing(argumentUsers);
 
     // The inline entry is the first block now the argument instructions are gone.
-    BasicBlock inlineEntry = inlinee.blocks.getFirst();
+    BasicBlock inlineEntry = inlinee.entryBlock();
 
     BasicBlock inlineExit = null;
     List<BasicBlock> normalExits = inlinee.computeNormalExitBlocks();
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 870ae6f..0d96f0d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -136,6 +136,10 @@
     this.hasConstString |= inlinee.hasConstString;
   }
 
+  public BasicBlock entryBlock() {
+    return blocks.getFirst();
+  }
+
   /**
    * Compute the set of live values at the entry to each block using a backwards data-flow analysis.
    */
@@ -416,7 +420,7 @@
     ArrayList<BasicBlock> reverseOrdered = new ArrayList<>(blocks.size());
     Set<BasicBlock> visitedBlocks = new HashSet<>(blocks.size());
     Deque<Object> worklist = new ArrayDeque<>(blocks.size());
-    worklist.addLast(blocks.getFirst());
+    worklist.addLast(entryBlock());
     while (!worklist.isEmpty()) {
       Object item = worklist.removeLast();
       if (item instanceof BlockMarker) {
@@ -768,7 +772,7 @@
 
   public List<Value> collectArguments(boolean ignoreReceiver) {
     final List<Value> arguments = new ArrayList<>();
-    Iterator<Instruction> iterator = blocks.get(0).iterator();
+    Iterator<Instruction> iterator = entryBlock().iterator();
     while (iterator.hasNext()) {
       Instruction instruction = iterator.next();
       if (instruction.isArgument()) {
@@ -787,7 +791,7 @@
     if (method.accessFlags.isStatic()) {
       return null;
     }
-    Instruction firstArg = blocks.getFirst().listIterator().nextUntil(Instruction::isArgument);
+    Instruction firstArg = entryBlock().listIterator().nextUntil(Instruction::isArgument);
     assert firstArg != null;
     Value thisValue = firstArg.asArgument().outValue();
     assert thisValue.isThis();
@@ -910,7 +914,7 @@
   public Set<BasicBlock> getUnreachableBlocks() {
     Set<BasicBlock> unreachableBlocks = Sets.newIdentityHashSet();
     int color = reserveMarkingColor();
-    markTransitiveSuccessors(blocks.getFirst(), color);
+    markTransitiveSuccessors(entryBlock(), color);
     for (BasicBlock block : blocks) {
       if (!block.isMarked(color)) {
         unreachableBlocks.add(block);
@@ -923,7 +927,7 @@
   public Set<Value> removeUnreachableBlocks() {
     ImmutableSet.Builder<Value> affectedValueBuilder = ImmutableSet.builder();
     int color = reserveMarkingColor();
-    markTransitiveSuccessors(blocks.getFirst(), color);
+    markTransitiveSuccessors(entryBlock(), color);
     ListIterator<BasicBlock> blockIterator = listIterator();
     while (blockIterator.hasNext()) {
       BasicBlock current = blockIterator.next();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index b1bb84e..b5f3a2d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -201,7 +201,7 @@
       BasicBlock blk = block;  // Additional local for lambda below.
       assert !block.isTrivialGoto()
           || block.exit().asGoto().getTarget() == block
-          || code.blocks.get(0) == block
+          || code.entryBlock() == block
           || block.getPredecessors().stream().anyMatch((b) -> b.exit().fallthroughBlock() == blk);
       // Trivial goto blocks never target the next block (in that case there should just be a
       // fallthrough).
@@ -242,7 +242,7 @@
       // Not targeting the fallthrough block, determine if we need this goto. We need it if
       // a fallthrough can hit this block. That is the case if the block is the entry block
       // or if one of the predecessors fall through to the block.
-      needed = code.blocks.get(0) == block || isFallthroughBlock(block);
+      needed = code.entryBlock() == block || isFallthroughBlock(block);
     }
 
     if (!needed) {
@@ -1535,7 +1535,7 @@
     final int color = code.reserveMarkingColor();
     try {
       ArrayDeque<BasicBlock> worklist = new ArrayDeque<>();
-      final BasicBlock entry = code.blocks.getFirst();
+      final BasicBlock entry = code.entryBlock();
       worklist.add(entry);
       entry.mark(color);
 
@@ -2032,7 +2032,7 @@
       Set<StaticPut> puts, Map<DexField, StaticPut> finalFieldPut) {
     final int color = code.reserveMarkingColor();
     try {
-      BasicBlock block = code.blocks.getFirst();
+      BasicBlock block = code.entryBlock();
       while (!block.isMarked(color) && block.getPredecessors().size() <= 1) {
         block.mark(color);
         InstructionListIterator it = block.listIterator();
@@ -3897,7 +3897,7 @@
    */
   public void logArgumentTypes(DexEncodedMethod method, IRCode code) {
     List<Value> arguments = code.collectArguments();
-    BasicBlock block = code.blocks.getFirst();
+    BasicBlock block = code.entryBlock();
     InstructionListIterator iterator = block.listIterator();
 
     // Attach some synthetic position to all inserted code.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index 4c437bd..53da564 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -90,7 +90,7 @@
 
     // Double-check the entry block does not have catch handlers.
     // Otherwise, we need to split it before moving canonicalized const-string, which may throw.
-    assert !code.blocks.getFirst().hasCatchHandlers();
+    assert !code.entryBlock().hasCatchHandlers();
     Position firstNonNonePosition = findFirstNonNonePosition(code);
     FastSortedEntrySet<ConstInstruction, List<Value>> entries =
         valuesDefinedByConstant.object2ObjectEntrySet();
@@ -124,7 +124,7 @@
 
   private static void insertCanonicalizedConstant(
       IRCode code, ConstInstruction canonicalizedConstant) {
-    BasicBlock entryBlock = code.blocks.get(0);
+    BasicBlock entryBlock = code.entryBlock();
     // Insert the constant instruction at the start of the block right after the argument
     // instructions. It is important that the const instruction is put before any instruction
     // that can throw exceptions (since the value could be used on the exceptional edge).
@@ -139,7 +139,7 @@
   }
 
   private static Position findFirstNonNonePosition(IRCode code) {
-    BasicBlock entryBlock = code.blocks.get(0);
+    BasicBlock entryBlock = code.entryBlock();
     Instruction rightAfterArguments =
         entryBlock.listIterator().nextUntil(instr -> !instr.isArgument());
     Position firstNonArgumentPosition = rightAfterArguments.getPosition();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
index 229611d..2e31219 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
@@ -183,7 +183,7 @@
   }
 
   private static void insertCanonicalizedInvoke(IRCode code, Invoke canonicalizedInvoke) {
-    BasicBlock entryBlock = code.blocks.get(0);
+    BasicBlock entryBlock = code.entryBlock();
     // Insert the canonicalized invoke after in values.
     int numberOfInValuePassed = 0;
     InstructionListIterator it = entryBlock.listIterator();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
index cbdeaac..dd84122 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
@@ -422,8 +422,7 @@
       // Stop traversing upwards if we hit the entry block: if the entry block has an non-null,
       // this case should be handled already by A) because the entry block surely dominates all
       // normal exits.
-      // TODO(b/120787963): code.entryBlock()
-      if (uncoveredPath == code.blocks.getFirst()) {
+      if (uncoveredPath == code.entryBlock()) {
         return false;
       }
       // Make sure we're not visiting the same block over and over again.
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 170c39e..51f9de0 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -189,7 +189,7 @@
     this.code = code;
     this.options = options;
     int argumentRegisters = 0;
-    for (Instruction instruction : code.blocks.getFirst().getInstructions()) {
+    for (Instruction instruction : code.entryBlock().getInstructions()) {
       if (instruction.isArgument()) {
         argumentRegisters += instruction.outValue().requiredRegisters();
       }
@@ -2506,7 +2506,7 @@
     // VMs we block the receiver register throughout the method.
     if ((options.canHaveThisTypeVerifierBug() || options.canHaveThisJitCodeDebuggingBug())
         && !code.method.accessFlags.isStatic()) {
-      for (Instruction instruction : code.blocks.get(0).getInstructions()) {
+      for (Instruction instruction : code.entryBlock().getInstructions()) {
         if (instruction.isArgument() && instruction.outValue().isThis()) {
           Value thisValue = instruction.outValue();
           LiveIntervals thisIntervals = thisValue.getLiveIntervals();
@@ -2674,8 +2674,8 @@
   // be original, consecutive arguments of the enclosing method (and importantly, not values that
   // have been defined by a check-cast instruction).
   private void transformBridgeMethod() {
-    assert implementationIsBridge(this.code);
-    BasicBlock entry = this.code.blocks.getFirst();
+    assert implementationIsBridge(code);
+    BasicBlock entry = code.entryBlock();
     InstructionListIterator iterator = entry.listIterator();
     // Create a mapping from argument values to their index, while scanning over the arguments.
     Reference2IntMap<Value> argumentIndices = new Reference2IntArrayMap<>();
@@ -2733,7 +2733,7 @@
     if (code.blocks.size() > 1) {
       return false;
     }
-    InstructionListIterator iterator = code.blocks.getFirst().listIterator();
+    InstructionListIterator iterator = code.entryBlock().listIterator();
     // Move forward to the first instruction after the definition of the arguments.
     while (iterator.hasNext() && iterator.peekNext().isArgument()) {
       iterator.next();
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
index 8489866..0d25746 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
@@ -166,7 +166,7 @@
   public int scheduleAndInsertMoves(int tempRegister) {
     for (BasicBlock block : code.blocks) {
       InstructionListIterator insertAt = block.listIterator();
-      if (block == code.blocks.getFirst()) {
+      if (block == code.entryBlock()) {
         // Move insertAt iterator to the first non-argument, such that moves for the arguments will
         // be inserted after the last argument.
         while (insertAt.hasNext() && insertAt.peekNext().isArgument()) {
diff --git a/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java b/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java
index 926a22d..b730618 100644
--- a/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java
@@ -91,7 +91,7 @@
     if (!code.method.qualifiedName().equals(TryRangeTestLimitRange.class.getName() + ".main")) {
       return;
     }
-    BasicBlock entryBlock = code.blocks.get(0);
+    BasicBlock entryBlock = code.entryBlock();
     BasicBlock tryBlock = code.blocks.get(1);
     assertTrue(tryBlock.hasCatchHandlers());
     ListIterator<Instruction> it = entryBlock.getInstructions().listIterator();
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index a459a9c..68b466a 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -101,7 +101,7 @@
 
     // Run code inlining a.
     test = codeForMethodReplaceTest(a, b);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(instruction -> instruction.isInvoke());
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(0));
@@ -110,7 +110,7 @@
 
     // Run code inlining b (where a is actually called).
     test = codeForMethodReplaceTest(a, b);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(instruction -> instruction.isInvoke());
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(1));
@@ -183,7 +183,7 @@
 
     // Run code inlining a.
     test = codeForMethodReplaceReturnVoidTest(1, 2);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(instruction -> instruction.isInvoke());
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(0));
@@ -519,7 +519,7 @@
 
     // Run code inlining a.
     test = codeForInlineCanThrow(a, b, twoGuards);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(instruction -> instruction.isInvoke());
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(0));
@@ -528,7 +528,7 @@
 
     // Run code inlining b (where a is actually called).
     test = codeForInlineCanThrow(a, b, twoGuards);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(instruction -> instruction.isInvoke());
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(1));
@@ -633,7 +633,7 @@
 
     // Run code inlining a.
     test = codeForInlineAlwaysThrows(twoGuards);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(Instruction::isInvoke);
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(0));
@@ -643,7 +643,7 @@
 
     // Run code inlining b (where a is actually called).
     test = codeForInlineAlwaysThrows(twoGuards);
-    iterator = test.code.blocks.get(0).listIterator();
+    iterator = test.code.entryBlock().listIterator();
     iterator.nextUntil(Instruction::isInvoke);
     iterator.previous();
     iterator.inlineInvoke(test.appInfo, test.code, test.additionalCode.get(1));
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index 1152903..066c51a 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -104,7 +104,7 @@
 
     public int countArgumentInstructions() {
       int count = 0;
-      ListIterator<Instruction> iterator = code.blocks.get(0).listIterator();
+      ListIterator<Instruction> iterator = code.entryBlock().listIterator();
       while (iterator.next().isArgument()) {
         count++;
       }
diff --git a/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java b/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java
index 3001b98..0a11f41 100644
--- a/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java
@@ -107,7 +107,7 @@
   @Test
   public void hasNextWillCheckNextBlock() throws Exception {
     IRCode code = simpleCode();
-    InstructionListIterator it = new LinearFlowInstructionIterator(code.blocks.get(0));
+    InstructionListIterator it = new LinearFlowInstructionIterator(code.entryBlock());
     Instruction current = it.next();
     current = it.next();
     assert it.hasNext();
@@ -116,7 +116,7 @@
   @Test
   public void nextWillContinueThroughGotoBlocks() throws Exception {
     IRCode code = simpleCode();
-    InstructionListIterator it = new LinearFlowInstructionIterator(code.blocks.get(0));
+    InstructionListIterator it = new LinearFlowInstructionIterator(code.entryBlock());
     Instruction current = it.next();
     current = it.next();
     current = it.next();
@@ -142,7 +142,7 @@
   public void GoToFrontAndBackIsSameAmountOfInstructions() throws Exception {
     IRCode code = simpleCode();
     int moves = 0;
-    InstructionListIterator it = new LinearFlowInstructionIterator(code.blocks.get(0));
+    InstructionListIterator it = new LinearFlowInstructionIterator(code.entryBlock());
     while (it.hasNext()) {
       it.next();
       moves++;
@@ -169,7 +169,7 @@
   @Test
   public void doNotChangeToNextBlockWhenNotLinearFlow() throws Exception {
     IRCode code = branchingCode();
-    InstructionListIterator it = new LinearFlowInstructionIterator(code.blocks.get(0));
+    InstructionListIterator it = new LinearFlowInstructionIterator(code.entryBlock());
     it.nextUntil((i) -> !i.isArgument());
     Instruction current = it.next();
     assert !it.hasNext();
diff --git a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
index c416c6e..2a6e8c8 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -83,7 +83,7 @@
       IRCode code = test.code;
       assertEquals(initialBlockCount, code.blocks.size());
 
-      BasicBlock block = code.blocks.get(0);
+      BasicBlock block = code.entryBlock();
       int instructionCount = block.getInstructions().size();
       assertEquals(firstBlockInstructions, instructionCount);
 
@@ -96,7 +96,7 @@
       assertTrue(code.isConsistentSSA());
 
       assertEquals(initialBlockCount + 1, code.blocks.size());
-      assertEquals(i + 1, code.blocks.get(0).getInstructions().size());
+      assertEquals(i + 1, code.entryBlock().getInstructions().size());
       assertEquals(instructionCount - i, code.blocks.get(1).getInstructions().size());
       assertSame(newBlock, code.blocks.get(1));
 
@@ -117,7 +117,7 @@
       IRCode code = test.code;
       assertEquals(initialBlockCount, code.blocks.size());
 
-      BasicBlock block = code.blocks.get(0);
+      BasicBlock block = code.entryBlock();
       int instructionCount = block.getInstructions().size();
       assertEquals(firstBlockInstructions, instructionCount);
 
@@ -130,7 +130,7 @@
       assertTrue(code.isConsistentSSA());
 
       assertEquals(initialBlockCount + 2, code.blocks.size());
-      assertEquals(i + 1, code.blocks.get(0).getInstructions().size());
+      assertEquals(i + 1, code.entryBlock().getInstructions().size());
       assertEquals(2, code.blocks.get(1).getInstructions().size());
       assertEquals(instructionCount - i - 1, code.blocks.get(2).getInstructions().size());
       assertSame(newBlock, code.blocks.get(1));
@@ -329,7 +329,7 @@
       IRCode code = test.code;
       assertEquals(initialBlockCount, code.blocks.size());
 
-      BasicBlock block = code.blocks.get(0);
+      BasicBlock block = code.entryBlock();
       int instructionCount = block.getInstructions().size();
       assertEquals(firstBlockInstructions, instructionCount);
 
@@ -342,7 +342,7 @@
       assertTrue(code.isConsistentSSA());
 
       assertEquals(initialBlockCount + 1, code.blocks.size());
-      assertEquals(i + 1, code.blocks.get(0).getInstructions().size());
+      assertEquals(i + 1, code.entryBlock().getInstructions().size());
       assertEquals(instructionCount - i, newBlock.getInstructions().size());
       assertSame(newBlock, code.blocks.get(1));
 
@@ -457,7 +457,7 @@
       IRCode code = test.code;
       assertEquals(initialBlockCount, code.blocks.size());
 
-      BasicBlock block = code.blocks.get(0);
+      BasicBlock block = code.entryBlock();
       int instructionCount = block.getInstructions().size();
       assertEquals(firstBlockInstructions, instructionCount);
 
@@ -470,7 +470,7 @@
       assertTrue(code.isConsistentSSA());
 
       assertEquals(initialBlockCount + 1, code.blocks.size());
-      assertEquals(i + 1, code.blocks.get(0).getInstructions().size());
+      assertEquals(i + 1, code.entryBlock().getInstructions().size());
       assertEquals(instructionCount - i, newBlock.getInstructions().size());
       assertSame(newBlock, code.blocks.get(1));
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
index 927bff2..0df0f97 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
@@ -145,6 +145,6 @@
     // Check that all four constant number instructions remain.
     assertEquals(
         4,
-        code.blocks.get(0).getInstructions().stream().filter(Instruction::isConstNumber).count());
+        code.entryBlock().getInstructions().stream().filter(Instruction::isConstNumber).count());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java
index 6b281cb..e2f47cd 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java
@@ -102,7 +102,7 @@
       // Only a single basic block.
       assertEquals(1, code.blocks.size());
       // The block only has three instructions.
-      BasicBlock entryBlock = code.blocks.get(0);
+      BasicBlock entryBlock = code.entryBlock();
       assertEquals(3, entryBlock.getInstructions().size());
       // The first one is the `argument` instruction.
       Instruction argument = entryBlock.getInstructions().getFirst();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
index 3582403..a9e2157 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -83,7 +83,7 @@
             false,
             Origin.unknown());
     CodeRewriter.collapseTrivialGotos(null, code);
-    assertTrue(code.blocks.get(0).isTrivialGoto());
+    assertTrue(code.entryBlock().isTrivialGoto());
     assertTrue(blocks.contains(block0));
     assertTrue(blocks.contains(block1));
     assertTrue(blocks.contains(block2));