Hi Nikita, > Our general approach to this is to first add a VM opcode for the operation, > which will also provide a benefit if the JIT is not used. > There's already plenty of those, see ZEND_STRLEN for example. > Adding JIT support for the opcode would then be the natural second step.
I've seen those - I'd assume there'd be a long tail of functions such as preg_match() without references, spl_object_id(), substr(), etc, that are called frequently, but not often enough to have their own opcodes. What about adding a new opcode types that combines INIT_FCALL, SEND_VAR (or SEND_VAL for constants), and DO_ICALL for known internal functions? Has that been proposed before? This could be used when the arguments were inferred by opcache to have correct types. ``` Old (in function where $x is known to be a non-reference object): 0001 INIT_FCALL 1 96 string("spl_object_id") 0002 SEND_VAR CV0($x) 1 0003 V2 = DO_ICALL 0004 T1 = INIT_ARRAY 1 (packed) CV0($x) V2 0005 RETURN T1 New (after opcache): 0001 T1 = INIT_AND_DO_ICALL_1_ARG $x // op1=$x, op2 is unused, extended_value = enum value corresponding to spl_object_id() 0002 RETURN T1 ``` And fdiv() could become INIT_AND_DO_ICALL_2_ARG $x $y op1=$x, op2 is $y, extended_value = enum value corresponding to fdiv This should give opcache the information it needs to continue tracking the definitions and uses of variables, as well as function return types. - I'd hope there'd be a performance improvement, due to not needing to look up zend_function, using the native C stack for zvals instead of a dynamic stack, perform param type checks, etc. This would only accept constants and compiled variables of known good types for functions that wouldn't emit notices or cause re-entry - temporary values (e.g. spl_object_id(some_function())) wouldn't be accepted. The C implementation for the new opcode could be a switch on extended_value with enum values for dozens of commonly used functions that weren't common enough for individual opcodes. Thanks, - Tyson -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php