Changeset 1279 in svn


Ignore:
Timestamp:
2013-06-27T11:43:47+02:00 (2 years ago)
Author:
Xuefer
Message:

optimizer: WIP improve finally handling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/mod_optimizer/xc_optimizer.c

    r1278 r1279  
    1 #if 0
     1#if 1
    22#   define XCACHE_DEBUG
    33#endif
     
    175175#endif
    176176    case ZEND_JMP:
     177        fi->jmpout_op1 = Z_OP(opline->op1).opline_num;
     178        return SUCCESS; /* no fall */
     179
    177180#ifdef ZEND_FAST_CALL
    178181    case ZEND_FAST_CALL:
    179 #endif
    180182        fi->jmpout_op1 = Z_OP(opline->op1).opline_num;
     183        if (opline->extended_value) {
     184            fi->jmpout_op2 = Z_OP(opline->op2).opline_num;
     185        }
    181186        return SUCCESS; /* no fall */
     187#endif
    182188
    183189    case ZEND_JMPZNZ:
     
    343349            "\r\n==== #%-3d cnt:%-3d lno:%-3d"
    344350            " %c%c"
    345             " op1:%-3d op2:%-3d ext:%-3d fal:%-3d cat:%-3d %s ====\r\n"
     351            " op1:%-3d op2:%-3d ext:%-3d fal:%-3d cat:%-3d fnl:%-3d %s ====\r\n"
    346352            , bb->id, bb->count, bb->alloc ? -1 : line
    347353            , bb->used ? 'U' : ' ', bb->alloc ? 'A' : ' '
    348             , fi.jmpout_op1, fi.jmpout_op2, fi.jmpout_ext, bb->fall, catchbbid, xc_get_opcode(last->opcode)
     354            , fi.jmpout_op1, fi.jmpout_op2, fi.jmpout_ext, bb->fall, catchbbid, finallybbid, xc_get_opcode(last->opcode)
    349355            );
    350356    op_print(op_array, line, bb->opcodes, last + 1);
     
    399405{
    400406    int i, start;
    401     bb_t *pbb;
     407    bb_t *bb;
    402408    bbid_t id;
    403409    op_flowinfo_t fi;
    404410    zend_op *opline;
    405     ALLOCA_FLAG(use_heap_bbids)
    406 #ifdef ZEND_ENGINE_2
    407     ALLOCA_FLAG(use_heap_catchbbids)
    408 #endif
    409 #ifdef ZEND_ENGINE_2_5
    410     ALLOCA_FLAG(use_heap_finallybbids)
    411 #endif
    412     ALLOCA_FLAG(use_heap_markbbhead)
    413     bbid_t *bbids          = xc_do_alloca(count * sizeof(bbid_t),    use_heap_bbids);
    414 #ifdef ZEND_ENGINE_2
    415     bbid_t *catchbbids     = xc_do_alloca(count * sizeof(bbid_t),    use_heap_catchbbids);
    416 #endif
    417 #ifdef ZEND_ENGINE_2_5
    418     bbid_t *finallybbids   = xc_do_alloca(count * sizeof(bbid_t),    use_heap_finallybbids);
    419 #endif
    420     zend_bool *markbbhead  = xc_do_alloca(count * sizeof(zend_bool), use_heap_markbbhead);
     411    ALLOCA_FLAG(opline_infos_use_heap)
     412    typedef struct {
     413        zend_bool isbbhead;
     414        bbid_t bbid;
     415#ifdef ZEND_ENGINE_2
     416        bbid_t catchbbid;
     417#endif
     418#ifdef ZEND_ENGINE_2_5
     419        bbid_t finallybbid;
     420#endif
     421    } oplineinfo_t;
     422    oplineinfo_t *oplineinfos = xc_do_alloca(count * sizeof(oplineinfo_t), opline_infos_use_heap);
     423
     424    memset(oplineinfos, 0, count * sizeof(oplineinfo_t));
    421425
    422426    /* {{{ mark jmpin/jumpout */
    423     memset(markbbhead,  0, count * sizeof(zend_bool));
    424 
    425     markbbhead[0] = 1;
     427    oplineinfos[0].isbbhead = 1;
    426428    for (i = 0; i < count; i ++) {
    427429        if (op_get_flowinfo(&fi, &op_array->opcodes[i]) == SUCCESS) {
    428430            if (fi.jmpout_op1 != XC_OPNUM_INVALID) {
    429                 markbbhead[fi.jmpout_op1] = 1;
     431                oplineinfos[fi.jmpout_op1].isbbhead = 1;
    430432            }
    431433            if (fi.jmpout_op2 != XC_OPNUM_INVALID) {
    432                 markbbhead[fi.jmpout_op2] = 1;
     434                oplineinfos[fi.jmpout_op2].isbbhead = 1;
    433435            }
    434436            if (fi.jmpout_ext != XC_OPNUM_INVALID) {
    435                 markbbhead[fi.jmpout_ext] = 1;
     437                oplineinfos[fi.jmpout_ext].isbbhead = 1;
    436438            }
    437439            if (i + 1 < count) {
    438                 markbbhead[i + 1] = 1;
     440                oplineinfos[i + 1].isbbhead = 1;
    439441            }
    440442        }
     
    443445    /* mark try start */
    444446    for (i = 0; i < op_array->last_try_catch; i ++) {
    445         markbbhead[op_array->try_catch_array[i].try_op] = 1;
     447        oplineinfos[op_array->try_catch_array[i].try_op].isbbhead = 1;
    446448    }
    447449#endif
     
    449451    /* {{{ fill op lines with newly allocated id */
    450452    for (i = 0; i < count; i ++) {
    451         bbids[i] = BBID_INVALID;
     453        oplineinfos[i].bbid = BBID_INVALID;
    452454    }
    453455
    454456    id = -1;
    455457    for (i = 0; i < count; i ++) {
    456         if (markbbhead[i]) {
     458        if (oplineinfos[i].isbbhead) {
    457459            id ++;
    458460        }
    459         bbids[i] = id;
     461        oplineinfos[i].bbid = id;
    460462        TRACE("bbids[%d] = %d", i, id);
    461463    }
     
    464466    /* {{{ fill op lines with catch id */
    465467    for (i = 0; i < count; i ++) {
    466         catchbbids[i] = BBID_INVALID;
     468        oplineinfos[i].catchbbid = BBID_INVALID;
     469#   ifdef ZEND_ENGINE_2_5
     470        oplineinfos[i].finallybbid = BBID_INVALID;
     471#   endif
    467472    }
    468473
     
    471476        zend_try_catch_element *e = &op_array->try_catch_array[i];
    472477        for (j = e->try_op; j < e->catch_op; j ++) {
    473             catchbbids[j] = bbids[e->catch_op];
    474         }
     478            oplineinfos[j].catchbbid = oplineinfos[e->catch_op].bbid;
     479        }
     480#   ifdef ZEND_ENGINE_2_5
     481        for (j = e->finally_op; j < e->finally_end; j ++) {
     482            oplineinfos[j].finallybbid = oplineinfos[e->finally_op].bbid;
     483        }
     484#   endif
    475485    }
    476486#ifdef XCACHE_DEBUG
    477487    for (i = 0; i < count; i ++) {
    478         TRACE("catchbbids[%d] = %d", i, catchbbids[i]);
     488#   ifdef ZEND_ENGINE_2_5
     489        TRACE("catch/finallybbids[%d] = %d, %d", i, oplineinfos[i].catchbbid, oplineinfos[i].finallybbid);
     490#   else
     491        TRACE("catchbbids[%d] = %d", i, oplineinfos[i].catchbbid);
     492#   endif
    479493    }
    480494#endif
     
    486500    /* loop over to deal with the last block */
    487501    for (i = 1; i <= count; i ++) {
    488         if (i < count && id == bbids[i]) {
     502        if (i < count && id == oplineinfos[i].bbid) {
    489503            continue;
    490504        }
    491505
    492506        opline = op_array->opcodes + start;
    493         pbb = bbs_new_bb_ex(bbs, opline, i - start);
    494 #ifdef ZEND_ENGINE_2
    495         pbb->catch = catchbbids[start];
     507        bb = bbs_new_bb_ex(bbs, opline, i - start);
     508#ifdef ZEND_ENGINE_2
     509        bb->catch = oplineinfos[start].catchbbid;
     510#endif
     511#ifdef ZEND_ENGINE_2_5
     512        bb->finally = oplineinfos[start].finallybbid;
    496513#endif
    497514
    498515        /* last */
    499         opline = pbb->opcodes + pbb->count - 1;
     516        opline = bb->opcodes + bb->count - 1;
    500517        if (op_get_flowinfo(&fi, opline) == SUCCESS) {
    501518            if (fi.jmpout_op1 != XC_OPNUM_INVALID) {
    502                 Z_OP(opline->op1).opline_num = bbids[fi.jmpout_op1];
     519                Z_OP(opline->op1).opline_num = oplineinfos[fi.jmpout_op1].bbid;
    503520                assert(Z_OP(opline->op1).opline_num != BBID_INVALID);
    504521            }
    505522            if (fi.jmpout_op2 != XC_OPNUM_INVALID) {
    506                 Z_OP(opline->op2).opline_num = bbids[fi.jmpout_op2];
     523                Z_OP(opline->op2).opline_num = oplineinfos[fi.jmpout_op2].bbid;
    507524                assert(Z_OP(opline->op2).opline_num != BBID_INVALID);
    508525            }
    509526            if (fi.jmpout_ext != XC_OPNUM_INVALID) {
    510                 opline->extended_value = bbids[fi.jmpout_ext];
     527                opline->extended_value = oplineinfos[fi.jmpout_ext].bbid;
    511528                assert(opline->extended_value != BBID_INVALID);
    512529            }
    513530            if (fi.fall && i + 1 < count) {
    514                 pbb->fall = bbids[i + 1];
    515                 TRACE("fall %d", pbb->fall);
    516                 assert(pbb->fall != BBID_INVALID);
     531                bb->fall = oplineinfos[i + 1].bbid;
     532                TRACE("fall %d", bb->fall);
     533                assert(bb->fall != BBID_INVALID);
    517534            }
    518535        }
     
    521538        }
    522539        start = i;
    523         id = bbids[i];
     540        id = oplineinfos[i].bbid;
    524541    }
    525542    /* }}} */
    526543
    527     xc_free_alloca(markbbhead, use_heap_markbbhead);
    528 #ifdef ZEND_ENGINE_2
    529     xc_free_alloca(catchbbids, use_heap_catchbbids);
    530 #endif
    531 #ifdef ZEND_ENGINE_2_5
    532     xc_free_alloca(finallybbids, use_heap_finallybbids);
    533 #endif
    534     xc_free_alloca(bbids,      use_heap_bbids);
     544    xc_free_alloca(oplineinfos, opline_infos_use_heap);
    535545    return SUCCESS;
    536546}
     
    585595                op_array->try_catch_array[try_catch_offset].try_op = bbs_get(bbs, lasttrybbid)->opnum;
    586596                op_array->try_catch_array[try_catch_offset].catch_op = lastcatchbbid != BBID_INVALID ? bbs_get(bbs, lastcatchbbid)->opnum : 0;
     597                assert(lastcatchbbid != BBID_INVALID);
    587598#ifdef ZEND_ENGINE_2_5
    588599                op_array->try_catch_array[try_catch_offset].finally_op = lastfinallybbid != BBID_INVALID ? bbs_get(bbs, lastfinallybbid)->opnum : 0;
Note: See TracChangeset for help on using the changeset viewer.