@NotNull
  public DfaResult computeHints() {
    if (PsiModificationTracker.getInstance(myProject).getModificationCount() != myModificationStamp) {
      return DfaResult.EMPTY;
    }
    var interceptor = myProvider.createListener();
    // computeHints() could be called several times in case if ReadAction is cancelled
    // So we need to copy the mutable myStartingState. Otherwise, restarted analysis will start from the wrong memory state
    DfaMemoryState memoryState = myStartingState.getMemoryState().createCopy();
    int startingIndex = myStartingState.getInstruction().getIndex();
    DfaInstructionState startingState = new DfaInstructionState(myStartingState.getInstruction(), memoryState);
    ReachabilityCountingInterpreter interpreter = new ReachabilityCountingInterpreter(myFlow, interceptor, true, false, startingIndex) {
      @Override
      protected DfaInstructionState @NotNull [] acceptInstruction(@NotNull DfaInstructionState instructionState) {
        DfaInstructionState[] states = super.acceptInstruction(instructionState);
        return StreamEx.of(states).filter(state -> state.getInstruction().getIndex() > startingIndex)
          .toArray(DfaInstructionState.EMPTY_ARRAY);
      }
    };
    if (interpreter.interpret(List.of(startingState)) != RunnerResult.OK) return DfaResult.EMPTY;
    Set<PsiElement> unreachable = interpreter.getUnreachable();
    Collection<TextRange> segments = DataFlowIRProvider.computeUnreachableSegments(myAnchor, unreachable);
    return new DfaResult(myBody.getContainingFile(), interceptor.computeHints(), segments);
  }
@NotNull
  public DfaResult computeHints()