private void recCountPostponable(BaseBlock b, List<BaseBlock> prev) {
        List<Statement> stmts = b.getStatements();
        Statement curS = stmts.get(0);

        List<Statement> before  = new LinkedList<Statement>();
        if(postponableIn.get(curS) != null)
            before.addAll(postponableIn.get(curS));
        postponableIn.put(curS, new LinkedList<Statement>());

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

        if(ifIsChanged(before, postponableIn.get(curS)))
            isChanged = true;
        before.clear();
        if(postponableOut.get(curS) != null)
            before.addAll(postponableOut.get(curS));
        postponableOut.put(curS, new LinkedList<Statement>());

        funcPostponableOut(curS);

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

        for(int i = 1; i < stmts.size(); i++) {
            Statement nextS = stmts.get(i);
            //--count-pOut-for-cur------
            before.clear();
            if(postponableIn.get(nextS) != null) {
                before.addAll(postponableIn.get(nextS));
            }
            postponableIn.put(nextS, new LinkedList<Statement>());

            if(postponableOut.get(curS) != null)
                postponableIn.get(nextS).addAll(postponableOut.get(curS));

            if(ifIsChanged(before, postponableIn.get(nextS)))
                isChanged = true;

            curS = nextS;
            //--count-pIn-for-cur-------
            before.clear();
            if(postponableOut.get(curS) != null) {
                before.addAll(postponableOut.get(curS));
                //postponableOut.get(curS).clear();
            }
            postponableOut.put(curS, new LinkedList<Statement>());

            funcPostponableOut(curS);//IN[B] -fills postponableIn for curS

            if(ifIsChanged(before, postponableOut.get(curS)))
                isChanged = true;
        }
        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;
            //System.out.println(markBB.get(c).toString()+c);
            if(!markBB.get(c))//&& !markBB.get(b)
                recCountPostponable(c, n);         //!!!если в nextBB есть с непосчитанными Statements, то не выполняем
        }
    }