diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2006-10-14 21:33:38 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2006-10-14 21:33:38 (GMT) |
commit | cbeb687c687e6edebd3afdb63be0a623294e744c (patch) | |
tree | 273d96ffef6560a4991173538ec512cdabf2cd79 /Python/peephole.c | |
parent | 5a72372329e0c6a47d226cdc33f7a22e424bb0d0 (diff) | |
download | cpython-cbeb687c687e6edebd3afdb63be0a623294e744c.zip cpython-cbeb687c687e6edebd3afdb63be0a623294e744c.tar.gz cpython-cbeb687c687e6edebd3afdb63be0a623294e744c.tar.bz2 |
Update the peephole optimizer to remove more dead code (jumps after returns)
and inline jumps to returns.
Diffstat (limited to 'Python/peephole.c')
-rw-r--r-- | Python/peephole.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/Python/peephole.c b/Python/peephole.c index 1d94319..f2fe6ce 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -523,6 +523,13 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case SETUP_EXCEPT: case SETUP_FINALLY: tgt = GETJUMPTGT(codestr, i); + /* Replace JUMP_* to a RETURN into just a RETURN */ + if (UNCONDITIONAL_JUMP(opcode) && + codestr[tgt] == RETURN_VALUE) { + codestr[i] = RETURN_VALUE; + memset(codestr+i+1, NOP, 2); + continue; + } if (!UNCONDITIONAL_JUMP(codestr[tgt])) continue; tgttgt = GETJUMPTGT(codestr, tgt); @@ -540,12 +547,16 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, goto exitUnchanged; /* Replace RETURN LOAD_CONST None RETURN with just RETURN */ + /* Remove unreachable JUMPs after RETURN */ case RETURN_VALUE: - if (i+4 >= codelen || - codestr[i+4] != RETURN_VALUE || - !ISBASICBLOCK(blocks,i,5)) + if (i+4 >= codelen) continue; - memset(codestr+i+1, NOP, 4); + if (codestr[i+4] == RETURN_VALUE && + ISBASICBLOCK(blocks,i,5)) + memset(codestr+i+1, NOP, 4); + else if (UNCONDITIONAL_JUMP(codestr[i+1]) && + ISBASICBLOCK(blocks,i,4)) + memset(codestr+i+1, NOP, 3); break; } } |