Fix invalid attempt to remove caller

Change-Id: Ie390eb3bf0b3678b7b1095a817f841c441b836c3
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
index e4b22ba..48656ec 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
@@ -424,7 +424,7 @@
     // Subset of the DFS stack, where the nodes on the stack are class initializers.
     //
     // This stack is used to efficiently compute if there is a class initializer on the stack.
-    private Deque<Node> clinitStack = new ArrayDeque<>();
+    private Deque<Node> clinitCallStack = new ArrayDeque<>();
 
     // Subset of the DFS stack, where the nodes on the stack satisfy that the edge from the
     // predecessor to the node itself is a field read edge.
@@ -471,7 +471,7 @@
 
     private void prepareForNewTraversal() {
       assert calleesToBeRemoved.isEmpty();
-      assert clinitStack.isEmpty();
+      assert clinitCallStack.isEmpty();
       assert stack.isEmpty();
       assert stackEntryInfo.isEmpty();
       assert writersToBeRemoved.isEmpty();
@@ -481,7 +481,7 @@
     }
 
     private void reset() {
-      assert clinitStack.isEmpty();
+      assert clinitCallStack.isEmpty();
       assert marked.isEmpty();
       assert revisit.isEmpty();
       assert stack.isEmpty();
@@ -646,9 +646,9 @@
 
         // Otherwise, check if there is a call edge to a <clinit> method in the cycle, and if so,
         // remove that edge.
-        if (!clinitStack.isEmpty()
+        if (!clinitCallStack.isEmpty()
             && removeIncomingEdgeOnStack(
-                clinitStack.peek(),
+                clinitCallStack.peek(),
                 calleeOrWriter,
                 calleeOrWriterStackEntryInfo,
                 this::removeCallEdge)) {
@@ -693,8 +693,8 @@
       assert !stackEntryInfo.containsKey(node);
       stackEntryInfo.put(node, new StackEntryInfo(stack.size() - 1, predecessor));
       if (predecessor != null) {
-        if (node.getMethod().isClassInitializer()) {
-          clinitStack.push(node);
+        if (node.getMethod().isClassInitializer() && node.hasCaller(predecessor)) {
+          clinitCallStack.push(node);
         } else if (predecessor.getWritersWithDeterministicOrder().contains(node)) {
           writerStack.push(node);
         }
@@ -706,9 +706,9 @@
       assert popped == node;
       assert stackEntryInfo.containsKey(node);
       stackEntryInfo.remove(node);
-      if (clinitStack.peek() == popped) {
+      if (clinitCallStack.peek() == popped) {
         assert writerStack.peek() != popped;
-        clinitStack.pop();
+        clinitCallStack.pop();
       } else if (writerStack.peek() == popped) {
         writerStack.pop();
       }