Changeset 1279 for trunk


Ignore:
Timestamp:
2013-06-27T11:43:47+02:00 (14 months ago)
Author:
moo
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.