boolean (@NotNull ControlFlow flow, final int start, final int stop, @NotNull PsiVariable variable) { if(start == stop) return false; class MyVisitor extends InstructionClientVisitor<Boolean> { // true if value the variable has at given offset maybe referenced without going through stop instruction private final boolean[] maybeReferenced = new boolean[flow.getSize() + 1]; final PsiManager psiManager = variable.getManager(); @Override public void visitInstruction(Instruction instruction, int offset, int nextOffset) { if (offset == stop) { maybeReferenced[offset] = false; return; } if(instruction instanceof WriteVariableInstruction && psiManager.areElementsEquivalent(((WriteVariableInstruction)instruction).variable, variable)) { maybeReferenced[offset] = false; return; } if (maybeReferenced[offset]) return; if (nextOffset > flow.getSize()) nextOffset = flow.getSize(); boolean nextState = maybeReferenced[nextOffset]; maybeReferenced[offset] = nextState || instruction instanceof ReadVariableInstruction && psiManager.areElementsEquivalent(((ReadVariableInstruction)instruction).variable, variable); } @Override @NotNull public Boolean getResult() { return maybeReferenced[start]; } } MyVisitor visitor = new MyVisitor(); depthFirstSearch(flow, visitor, start, flow.getSize()); return visitor.getResult().booleanValue(); }