List<ReadWriteVariableInstruction> (int variableIndex, boolean ahead, boolean writeAccessOnly, Instruction cur) { if (variableIndex == 0) { return Collections.emptyList(); } final ArrayList<ReadWriteVariableInstruction> result = new ArrayList<>(); final HashSet<Instruction> visited = new HashSet<>(); visited.add(cur); Queue<Instruction> queue = new ArrayDeque<>(); for (Instruction i : ahead ? cur.allSuccessors() : cur.allPredecessors()) { if (visited.add(i)) { queue.add(i); } } while (true) { Instruction instruction = queue.poll(); if (instruction == null) break; if (instruction instanceof ReadWriteVariableInstruction rw) { if (variableIndex == rw.getDescriptor()) { if (rw.isWrite()) { result.add(rw); continue; } if (!writeAccessOnly) { result.add(rw); } } } for (Instruction i : ahead ? instruction.allSuccessors() : instruction.allPredecessors()) { if (visited.add(i)) { queue.add(i); } } } return result; }