Commit Graph

361 Commits

Author SHA1 Message Date
Dmitry Stogov
6579e48417 Introduced BIND_STATIC opcode instead of FETCH_R/FETCH_W(static)+ASSIGN/ASSIGN_REF (similar to BIND_GLOBAL).
In the future we may refer to static variable by index instead of name, to eliminate hash lookup.
2016-01-12 12:20:35 +03:00
Nikita Popov
0e936db801 Make PI construction human-readable
Also makes it easy to add PIs for TI.
2016-01-11 21:53:22 +01:00
Nikita Popov
c817ac4d52 Use worklist for DFG construction
About 40x faster.
2016-01-11 21:53:10 +01:00
Nikita Popov
bb357e0617 Fix bitset initialization 2016-01-07 23:49:42 +01:00
Nikita Popov
c602ac60b9 Fix CE fetching for NEW object type inference
Create a common function for getting a class entry.
2016-01-07 18:53:10 +01:00
Nikita Popov
04dc5d7420 Range&type inference for JMP_SET 2016-01-07 18:53:02 +01:00
Lior Kaplan
71c1980025 Happy new year (Update copyright to 2016) 2016-01-01 20:06:12 +02:00
Lior Kaplan
3d5438bf7b Merge branch 'PHP-7.0'
* PHP-7.0:
  Update header to PHP Version 7
  Happy new year (Update copyright to 2016)
  Happy new year (Update copyright to 2016)
2016-01-01 20:04:31 +02:00
Lior Kaplan
2eb1f38d24 Happy new year (Update copyright to 2016) 2016-01-01 20:03:16 +02:00
Lior Kaplan
ed35de784f Merge branch 'PHP-5.6' into PHP-7.0
* PHP-5.6:
  Happy new year (Update copyright to 2016)
2016-01-01 19:48:25 +02:00
Lior Kaplan
49493a2dcf Happy new year (Update copyright to 2016) 2016-01-01 19:21:47 +02:00
Nikita Popov
83c4417330 Mark uses of scope functions in namespaces as TOO_DYNAMIC
Of course they are not necessarily, but it's very likely and we have
to be conservative anyway.

Also use zend_string_equals_literal().
2015-12-30 23:38:03 +01:00
Nikita Popov
65e456f364 Introduce BIND_LEXICAL
This opcodes inserts a local CV into the closure static variable
table. This replaces the previous mechanism of having static
variables marked as LEXICAL, which perform a symtable lookup
during copying.

This means a) functions which contain closures no longer have to
rebuild their symtable (better performance) and b) we can now track
used variables in SSA.
2015-12-29 23:14:53 +01:00
Nikita Popov
d77b74a1f3 Use ZEND_HASH_FOREACH 2015-12-26 23:43:33 +01:00
Nikita Popov
33870c525a Don't reuse SSA var in UNSET_VAR
Instead use the SSA var that UNSET_VAR actually defines. Otherwise
we get issues trying to DCE unsets.
2015-12-26 23:33:58 +01:00
Dmitry Stogov
b3d0178915 Rearrange code to enable inner precedure inference 2015-12-24 19:05:27 +03:00
Dmitry Stogov
b4def0ee88 Added call-graph analyses 2015-12-24 14:30:41 +03:00
Dmitry Stogov
3d88a64e0c Add another DFA optimization pattern (ASSIGN -> QM_ASSING) 2015-12-24 11:06:02 +03:00
Dmitry Stogov
28a016a6dc Fixed SSA construction for CFG with unreachable BB 2015-12-23 03:52:38 +03:00
Dmitry Stogov
e82a73573b Remove live-range if the corresponding definition is deleted 2015-12-23 03:46:40 +03:00
Dmitry Stogov
dd3cb33ef0 Support for incompletely constructed SSA 2015-12-23 03:20:28 +03:00
Nikita Popov
fdfbeeb296 Always create ARRAY_ELEM ssa var for ELEM_REF 2015-12-22 23:08:26 +01:00
Dmitry Stogov
5c1c8f1dec Merge branch 'PHP-7.0'
* PHP-7.0:
  Fixed incorrect setting on 32-bit systems
2015-12-22 21:33:07 +03:00
Dmitry Stogov
f3bf95eb81 Merge branch 'PHP-5.6' into PHP-7.0
* PHP-5.6:
  Fixed incorrect setting on 32-bit systems
2015-12-22 21:32:45 +03:00
Dmitry Stogov
a57a08e791 Fixed incorrect setting on 32-bit systems 2015-12-22 21:31:28 +03:00
Dmitry Stogov
a75c6d5fb2 Skip "useless" SSA variables for INIT_ARRAY, ADD_ARRAY_ELEMENT, FE_RESET_R 2015-12-22 17:35:08 +03:00
Dmitry Stogov
b4b6d58990 Add ability to prevent "useless" SSA variable creation for "refcounting inference". 2015-12-22 16:43:37 +03:00
Dmitry Stogov
83cd828469 Make RC1/RCN inference more accurate (it's probably not 100% correct anyway) 2015-12-22 15:35:17 +03:00
Dmitry Stogov
d952eb753c Get rid of MAY_BE_DEF 2015-12-21 19:46:55 +03:00
Dmitry Stogov
ae303cf82f Split MAY_BE_NULL from MAY_BE_UNDEF 2015-12-21 18:39:24 +03:00
Nikita Popov
88eae43ff9 Remove uses of VARs in extended_value
The DECLARE_(ANON_)INHERITED_CLASS(_DELAYED) opcodes were
referencing the parent ce VAR through extended_value. This is
hacky and we can't track the def-use chain in SSA.

To avoid this, the layout of declaration opcodes is changed
as follows: op1 points to the lcname and rtd_key literals, in
that order. (For anon/lambda declarations only one of lcname or
rtd_key is present.) This frees up op2, which is now used to
reference the parent ce VAR in inheriting declarations. The
jmp offset for anon class declarations is moved frop op2 to
extended_value.

The changes were applied both to class and function declarations
to keep everything symmetric.
2015-12-21 14:44:42 +01:00
Nikita Popov
420ff42bc0 Protect against overflows in pi constraints 2015-12-20 12:56:05 +01:00
Nikita Popov
0da1378a88 long -> zend_long in range inference 2015-12-20 00:06:12 +01:00
Nikita Popov
549d7d4876 Fix Pi constraint for -LONG_MIN adjustments
-LONG_MIN == LONG_MIN so bad things will happen.
Example of JIT miscompile:

    function test($n) {
	if ($n + PHP_INT_MIN == 0) {
	    $n2 = (int) ($n + PHP_INT_MAX);
	    var_dump($n2);
	}
    }
    test(PHP_INT_MAX + 1);
2015-12-20 00:06:12 +01:00
Nikita Popov
c9ea8fef96 Extrace find_adjusted_tmp_var() function
This code was duplicated for op1 and op2
2015-12-20 00:06:12 +01:00
Nikita Popov
fc68094497 Simplify bf/bt computation in pi placement
The meaning of the successors is well-defined, no need to check it.
2015-12-20 00:03:52 +01:00
Nikita Popov
d7424a5b04 Fix typo in pi placement 2015-12-20 00:03:52 +01:00
Nikita Popov
7cc3089d8f Clone cannot return reference 2015-12-18 17:37:13 +01:00
Nikita Popov
8ca21876e1 Fix zend_get_func_info() 2015-12-18 17:37:13 +01:00
Dmitry Stogov
8136e4572e Fixed dump format 2015-12-18 17:18:13 +03:00
Dmitry Stogov
f9b5345a98 Fixed compilation 2015-12-18 16:53:31 +03:00
Xinchen Hui
af871f61dc Merge branch 'PHP-7.0'
* PHP-7.0:
  Improved fix for #71127
2015-12-18 17:42:11 +08:00
Xinchen Hui
2f47e9872e Merge branch 'PHP-5.6' into PHP-7.0
* PHP-5.6:
  Improved fix for #71127

Conflicts:
	ext/opcache/Optimizer/pass1_5.c
2015-12-18 17:41:42 +08:00
Xinchen Hui
40702799b5 Improved fix for #71127 2015-12-18 17:37:40 +08:00
Xinchen Hui
d8fc37693a Merge branch 'PHP-7.0' 2015-12-17 14:32:17 +08:00
Xinchen Hui
9374977d21 Merge branch 'PHP-5.6' into PHP-7.0
Conflicts:
	ext/opcache/Optimizer/pass1_5.c
2015-12-17 14:30:00 +08:00
Xinchen Hui
940c68b55d Fixed bug #71127 (Define in auto_prepend_file is overwrite) 2015-12-17 14:27:33 +08:00
Dmitry Stogov
74daa98974 Added simple DFA optimisation pattern (just to prove the concept) 2015-12-16 13:14:31 +03:00
Dmitry Stogov
9044f491cc Use do_alloca() instead of alloca() 2015-12-16 04:59:05 +03:00
Dmitry Stogov
e797871319 Fallbuck to simple dump format if CFG wasn't constructed 2015-12-16 04:57:51 +03:00