Hey: On Sat, Jan 17, 2015 at 2:14 AM, Benjamin Coutu <ben.co...@zeyos.com> wrote: > Hi Dimitry, > > Thank you for the acknowledgment. I am a big fan of your work. > > I think adding the suggested changes to foreach will be a good improvement. > With foreach one cold actually merge the jump-into-opcode (line 0 in the > while-loop example) with FE_RESET. > > On another note, I think there are many simple compiler optimizations > (without the need for real code analysis) that should now be possible, > especially in light of AST. The following samples of common patterns come to > mind: > > if/while (! ...) > BOOL_NOT+JMPZ -> JMPNZ > > if/while ( ... &&/|| ... ) > BOOL+JMPZ -> JMPZ (BOOL is obsolete) > > case (...) > CASE+JMPZ -> CASE (add JMPZ functionality to CASE operation) > > I understand that these aren't huge improvements per se, but they are very > common and could at least help reduce the generated bytecode size (thinking > OpCache).
I believe some of these works already be done in opcache/Optimizer/block_pass.c based on CFG thanks > > Cheers, > > Ben > > ========== Original ========== > From: Dmitry Stogov <dmi...@zend.com> > To: Benjamin Coutu <ben.co...@zeyos.com> > Date: Fri, 16 Jan 2015 17:12:34 +0100 > Subject: Re: [PHP-DEV] Generating more efficient code for while-loop > > Hi Benjamin, > > Thanks for idea. > With PHP7 AST compiler, it's quite easy to implement this (it took us 15 > minutes to try :) > However, it doesn't make big improvement on our benchmarks. > We will take a look into possibilities to apply your idea to other patterns > (e.g. for and foreach loops). > > Anyway, it makes full sense to include this optimization into PHP7. > I just like to try other opportunities first. > > Thanks. Dmitry. > > On Fri, Jan 16, 2015 at 10:56 AM, Benjamin Coutu <ben.co...@zeyos.com> > wrote: > >> Hello, >> >> Please consider the following PHP code: >> >> while ( <CONDITION> ) { >> <STATEMENT> >> } >> >> It currently compiles to something like this for the Zend Engine: >> >> 0: <CONDITION> >> 1: JMPZ -> 4 >> 2: <STATEMENT> >> 3: JMP -> 0 >> 4: ... >> >> This can easily be rewritten in an equivalent but much more efficient form: >> >> 0: JMP -> 2 >> 1: <STATEMENT> >> 2: <CONDITION> >> 3: JMPNZ -> 1 >> >> The trick is to jump to the conditional expression before the first >> iteration and then only having to continue with just on conditional jump on >> every subsequent cycle. >> >> This would result in only 1 jump per loop iteration compared to >> effectively 2 jumps needed per iteration with the current implementation. >> >> It would also make the loop tighter as upon entering the loop (after first >> conditional evaluation), one less opcode remains relevant to the loop. >> >> An analogous approach can be taken for the for-loop. >> >> Thanks, >> >> Ben >> >> PS: This is my first post on a PHP mailinglist - I am very excited! :) >> >> -- >> >> Benjamin Coutu >> Zeyon Technologies Inc. >> http://www.zeyos.com >> >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >> >> > -- Xinchen Hui @Laruence http://www.laruence.com/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php