private void recCountAvailible(BaseBlock b, List<BaseBlock> prev) {
        List<Statement> stmts = b.getStatements();
        Statement curS = stmts.get(0);
        numOfSt += stmts.size();
        //stmts.remove(0);
        //availibleIn.put(curS, new LinkedList<Statement>());
        List<Statement> before  = new LinkedList<Statement>();
        if(availibleIn.get(curS) != null)
            before.addAll(availibleIn.get(curS));

        if(prev != null) {
            List<Statement> prevS = new LinkedList<Statement>();
            for (BaseBlock bb : prev)
                prevS.add(bb.getStatements().get(bb.getStatements().size()-1));
            funcAvailibleIn(curS, prevS);
        } else funcAvailibleIn(curS, null);       //intersect of null lists is null

        if(ifIsChanged(before, availibleIn.get(curS)))
            isChanged = true;
        before.clear();
        if(availibleOut.get(curS) != null)
            before.addAll(availibleOut.get(curS));

        //System.out.println("recavOut: curs=" + curS.toString());
        funcAvailibleOut(curS);

        if(ifIsChanged(before, availibleOut.get(curS)))
            isChanged = true;

        for(int i = 1; i < stmts.size(); i++) {
        //for(Statement st: stmts) {
            Statement nextS = stmts.get(i);
            //--count-avOut-for-cur------
    //added
            before.clear();
            if(availibleIn.get(nextS) == null)
                availibleIn.put(nextS, new LinkedList<Statement>());
            else
                before.addAll(availibleIn.get(nextS));

            if(availibleOut.get(curS) != null) {
                availibleIn.get(nextS).addAll(availibleOut.get(curS));
                if (ifIsChanged(before, availibleIn.get(nextS)))
                    isChanged = true;
            }
            //System.out.println("afterAOut: result=" + availibleOut.get(curS) + "\n\t" + availibleIn.get(nextS));
            curS = nextS;
            //--count-avIn-for-cur-------
            before.clear();
            if(availibleOut.get(curS) != null)
                before.addAll(availibleOut.get(curS));
            funcAvailibleOut(curS);//IN[B] -fills expectedIn for curS
            if(ifIsChanged(before, availibleOut.get(curS)))
                isChanged = true;
        }
        //for(int i = 0; i < stmts.size(); i++)
        //    System.out.println("afterAOut: result=" + availibleOut.get(stmts.get(i)) + " " + availibleIn.get(stmts.get(i)));
        markBB.remove(b); markBB.put(b, true);
        for(BaseBlock c: cfg.nextBB(b)) {
            boolean count = true;

            List<BaseBlock> n = cfg.prevBB(c);
            for(BaseBlock nn: n)
                if(!markBB.get(nn))
                    count = false;

            //if(count)//&& !markBB.get(b)
            if(!markBB.get(c))
                recCountAvailible(c, n);         //!!!если в nextBB есть с непосчитанными Statements, то не выполняем
        }
    }