php-src/ext/opcache/Optimizer/zend_cfg.h

129 lines
5.3 KiB
C
Raw Normal View History

Refactored CFG based optimization using new CFG representation. Squashed commit of the following: commit 907533390678f58eac738040ef62a40788048bef Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:25:28 2015 +0300 cleanup commit 82f7e6f5bb434f12e9fdf45f597be351527f383c Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:22:01 2015 +0300 Update build system commit 8fd83d843fde3f486692de4e2c6b7d64d4192704 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 20:50:32 2015 +0300 Reachable blocks can't be empty commit 5822a36269833930a35cb3547222357118b11310 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:11:02 2015 +0300 added missing constraints commit 2d0c00b243479924de0260ae8d80d624c36994a3 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:03:12 2015 +0300 optimization commit 29d1e5eb210c51b052cac4d6c232aaa2c724dbbb Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 18:34:11 2015 +0300 Added missing optimization patterns commit 38dd3b3f2459f5193c742633213f41d78326ea28 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 17:47:06 2015 +0300 zend_optimize_block() refactoring commit 3dc97bd1f6d433dff0617338382347b6d0c08f84 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:30:32 2015 +0300 We don't use CFG back-references anymore commit 2242c9e0aa741d287146ad43179650796f199f2d Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:16:03 2015 +0300 Consistent naming commit 64f2856716069390ed7703ac88905cebf5e04023 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 13:29:32 2015 +0300 Optimization and separate building of direct CFG from predecessrs calculation commit 9389be4869b13ec45df5dbd443015d2ac539a347 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 10:44:19 2015 +0300 Use CFG without back references (incomplete, but works) commit 3d3ecd4b883959cf7b86c33622183295f913924e Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 00:50:09 2015 +0300 Fixed iteration in reverse order commit 52f7fde0c3dfa4b4591519828ebdb238c2377936 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 18:35:09 2015 +0300 Separate debugging code into zend_dump.c commit 4193a039ea96bae41baf97c6e458f419e8dbf9c5 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:22:04 2015 +0300 Remove unused code commit 4228fdc57d8d120e1dad4e4d44045fa1a6f06fe0 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:21:20 2015 +0300 Remove dead live-ranges only on assembling basic blocks commit 9a4a7966edf19b92678876f85565700694205598 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 15:26:29 2015 +0300 New CFG representation (incomplete)
2015-11-20 19:06:36 +00:00
/*
+----------------------------------------------------------------------+
| Zend Engine, CFG - Control Flow Graph |
+----------------------------------------------------------------------+
| Copyright (c) 1998-2015 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Dmitry Stogov <dmitry@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef ZEND_CFG_H
#define ZEND_CFG_H
/* zend_basic_bloc.flags */
#define ZEND_BB_START (1<<0) /* fist block */
#define ZEND_BB_FOLLOW (1<<1) /* follows the next block */
#define ZEND_BB_TARGET (1<<2) /* jump taget */
#define ZEND_BB_EXIT (1<<3) /* without successors */
#define ZEND_BB_ENTRY (1<<4) /* stackless entry */
#define ZEND_BB_TRY (1<<5) /* start of try block */
#define ZEND_BB_CATCH (1<<6) /* start of catch block */
#define ZEND_BB_FINALLY (1<<7) /* start of finally block */
#define ZEND_BB_FINALLY_END (1<<8) /* end of finally block */
#define ZEND_BB_GEN_VAR (1<<9) /* start of live range */
#define ZEND_BB_KILL_VAR (1<<10) /* end of live range */
#define ZEND_BB_EMPTY (1<<11)
Refactored CFG based optimization using new CFG representation. Squashed commit of the following: commit 907533390678f58eac738040ef62a40788048bef Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:25:28 2015 +0300 cleanup commit 82f7e6f5bb434f12e9fdf45f597be351527f383c Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:22:01 2015 +0300 Update build system commit 8fd83d843fde3f486692de4e2c6b7d64d4192704 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 20:50:32 2015 +0300 Reachable blocks can't be empty commit 5822a36269833930a35cb3547222357118b11310 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:11:02 2015 +0300 added missing constraints commit 2d0c00b243479924de0260ae8d80d624c36994a3 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:03:12 2015 +0300 optimization commit 29d1e5eb210c51b052cac4d6c232aaa2c724dbbb Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 18:34:11 2015 +0300 Added missing optimization patterns commit 38dd3b3f2459f5193c742633213f41d78326ea28 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 17:47:06 2015 +0300 zend_optimize_block() refactoring commit 3dc97bd1f6d433dff0617338382347b6d0c08f84 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:30:32 2015 +0300 We don't use CFG back-references anymore commit 2242c9e0aa741d287146ad43179650796f199f2d Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:16:03 2015 +0300 Consistent naming commit 64f2856716069390ed7703ac88905cebf5e04023 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 13:29:32 2015 +0300 Optimization and separate building of direct CFG from predecessrs calculation commit 9389be4869b13ec45df5dbd443015d2ac539a347 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 10:44:19 2015 +0300 Use CFG without back references (incomplete, but works) commit 3d3ecd4b883959cf7b86c33622183295f913924e Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 00:50:09 2015 +0300 Fixed iteration in reverse order commit 52f7fde0c3dfa4b4591519828ebdb238c2377936 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 18:35:09 2015 +0300 Separate debugging code into zend_dump.c commit 4193a039ea96bae41baf97c6e458f419e8dbf9c5 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:22:04 2015 +0300 Remove unused code commit 4228fdc57d8d120e1dad4e4d44045fa1a6f06fe0 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:21:20 2015 +0300 Remove dead live-ranges only on assembling basic blocks commit 9a4a7966edf19b92678876f85565700694205598 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 15:26:29 2015 +0300 New CFG representation (incomplete)
2015-11-20 19:06:36 +00:00
#define ZEND_BB_LOOP_HEADER (1<<16)
#define ZEND_BB_IRREDUCIBLE_LOOP (1<<17)
#define ZEND_BB_REACHABLE (1<<31)
#define ZEND_BB_PROTECTED (ZEND_BB_ENTRY|ZEND_BB_TRY|ZEND_BB_CATCH|ZEND_BB_FINALLY|ZEND_BB_FINALLY_END|ZEND_BB_GEN_VAR|ZEND_BB_KILL_VAR)
typedef struct _zend_basic_block {
uint32_t flags;
uint32_t start; /* first opcode number */
uint32_t end; /* last opcode number */
int successors[2]; /* up to 2 successor blocks */
int predecessors_count; /* number of predecessors */
int predecessor_offset; /* offset of 1-st predecessor */
int idom; /* immediate dominator block */
int loop_header; /* closest loop header, or -1 */
int level; /* steps away from the entry in the dom. tree */
int children; /* list of dominated blocks */
int next_child; /* next dominated block */
} zend_basic_block;
/*
+------------+---+---+---+---+---+
| |OP1|OP2|EXT| 0 | 1 |
+------------+---+---+---+---+---+
|JMP |ADR| | |OP1| - |
|JMPZ | |ADR| |OP2|FOL|
|JMPNZ | |ADR| |OP2|FOL|
|JMPZNZ | |ADR|ADR|OP2|EXT|
|JMPZ_EX | |ADR| |OP2|FOL|
|JMPNZ_EX | |ADR| |OP2|FOL|
|JMP_SET | |ADR| |OP2|FOL|
|COALESCE | |ADR| |OP2|FOL|
|ASSERT_CHK | |ADR| |OP2|FOL|
|NEW | |ADR| |OP2|FOL|
|DCL_ANON* |ADR| | |OP1|FOL|
|FE_RESET_* | |ADR| |OP2|FOL|
|FE_FETCH_* | | |ADR|EXT|FOL|
|CATCH | | |ADR|EXT|FOL|
|FAST_CALL |ADR| | |OP1|FOL|
|FAST_RET | | | | - | - |
|RETURN* | | | | - | - |
|EXIT | | | | - | - |
|THROW | | | | - | - |
|* | | | |FOL| - |
+------------+---+---+---+---+---+
*/
2015-11-20 22:19:45 +00:00
typedef struct _zend_cfg {
Refactored CFG based optimization using new CFG representation. Squashed commit of the following: commit 907533390678f58eac738040ef62a40788048bef Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:25:28 2015 +0300 cleanup commit 82f7e6f5bb434f12e9fdf45f597be351527f383c Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:22:01 2015 +0300 Update build system commit 8fd83d843fde3f486692de4e2c6b7d64d4192704 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 20:50:32 2015 +0300 Reachable blocks can't be empty commit 5822a36269833930a35cb3547222357118b11310 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:11:02 2015 +0300 added missing constraints commit 2d0c00b243479924de0260ae8d80d624c36994a3 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:03:12 2015 +0300 optimization commit 29d1e5eb210c51b052cac4d6c232aaa2c724dbbb Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 18:34:11 2015 +0300 Added missing optimization patterns commit 38dd3b3f2459f5193c742633213f41d78326ea28 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 17:47:06 2015 +0300 zend_optimize_block() refactoring commit 3dc97bd1f6d433dff0617338382347b6d0c08f84 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:30:32 2015 +0300 We don't use CFG back-references anymore commit 2242c9e0aa741d287146ad43179650796f199f2d Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:16:03 2015 +0300 Consistent naming commit 64f2856716069390ed7703ac88905cebf5e04023 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 13:29:32 2015 +0300 Optimization and separate building of direct CFG from predecessrs calculation commit 9389be4869b13ec45df5dbd443015d2ac539a347 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 10:44:19 2015 +0300 Use CFG without back references (incomplete, but works) commit 3d3ecd4b883959cf7b86c33622183295f913924e Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 00:50:09 2015 +0300 Fixed iteration in reverse order commit 52f7fde0c3dfa4b4591519828ebdb238c2377936 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 18:35:09 2015 +0300 Separate debugging code into zend_dump.c commit 4193a039ea96bae41baf97c6e458f419e8dbf9c5 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:22:04 2015 +0300 Remove unused code commit 4228fdc57d8d120e1dad4e4d44045fa1a6f06fe0 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:21:20 2015 +0300 Remove dead live-ranges only on assembling basic blocks commit 9a4a7966edf19b92678876f85565700694205598 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 15:26:29 2015 +0300 New CFG representation (incomplete)
2015-11-20 19:06:36 +00:00
int blocks_count; /* number of basic blocks */
zend_basic_block *blocks; /* array of basic blocks */
int *predecessors;
uint32_t *map;
} zend_cfg;
/* Build Flags */
#define ZEND_RT_CONSTANTS (1<<31)
#define ZEND_CFG_STACKLESS (1<<30)
#define ZEND_SSA_DEBUG_LIVENESS (1<<29)
#define ZEND_SSA_DEBUG_PHI_PLACEMENT (1<<28)
#define CRT_CONSTANT_EX(op_array, node, rt_constants) \
((rt_constants) ? \
RT_CONSTANT(op_array, (node)) \
: \
CT_CONSTANT_EX(op_array, (node).constant) \
)
#define CRT_CONSTANT(node) \
CRT_CONSTANT_EX(op_array, node, (build_flags & ZEND_RT_CONSTANTS))
#define RETURN_VALUE_USED(opline) \
(!((opline)->result_type & EXT_TYPE_UNUSED))
Refactored CFG based optimization using new CFG representation. Squashed commit of the following: commit 907533390678f58eac738040ef62a40788048bef Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:25:28 2015 +0300 cleanup commit 82f7e6f5bb434f12e9fdf45f597be351527f383c Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:22:01 2015 +0300 Update build system commit 8fd83d843fde3f486692de4e2c6b7d64d4192704 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 20:50:32 2015 +0300 Reachable blocks can't be empty commit 5822a36269833930a35cb3547222357118b11310 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:11:02 2015 +0300 added missing constraints commit 2d0c00b243479924de0260ae8d80d624c36994a3 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:03:12 2015 +0300 optimization commit 29d1e5eb210c51b052cac4d6c232aaa2c724dbbb Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 18:34:11 2015 +0300 Added missing optimization patterns commit 38dd3b3f2459f5193c742633213f41d78326ea28 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 17:47:06 2015 +0300 zend_optimize_block() refactoring commit 3dc97bd1f6d433dff0617338382347b6d0c08f84 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:30:32 2015 +0300 We don't use CFG back-references anymore commit 2242c9e0aa741d287146ad43179650796f199f2d Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:16:03 2015 +0300 Consistent naming commit 64f2856716069390ed7703ac88905cebf5e04023 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 13:29:32 2015 +0300 Optimization and separate building of direct CFG from predecessrs calculation commit 9389be4869b13ec45df5dbd443015d2ac539a347 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 10:44:19 2015 +0300 Use CFG without back references (incomplete, but works) commit 3d3ecd4b883959cf7b86c33622183295f913924e Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 00:50:09 2015 +0300 Fixed iteration in reverse order commit 52f7fde0c3dfa4b4591519828ebdb238c2377936 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 18:35:09 2015 +0300 Separate debugging code into zend_dump.c commit 4193a039ea96bae41baf97c6e458f419e8dbf9c5 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:22:04 2015 +0300 Remove unused code commit 4228fdc57d8d120e1dad4e4d44045fa1a6f06fe0 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:21:20 2015 +0300 Remove dead live-ranges only on assembling basic blocks commit 9a4a7966edf19b92678876f85565700694205598 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 15:26:29 2015 +0300 New CFG representation (incomplete)
2015-11-20 19:06:36 +00:00
BEGIN_EXTERN_C()
int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg, uint32_t *func_flags);
void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg);
int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg);
int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg);
int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg, uint32_t *flags);
Refactored CFG based optimization using new CFG representation. Squashed commit of the following: commit 907533390678f58eac738040ef62a40788048bef Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:25:28 2015 +0300 cleanup commit 82f7e6f5bb434f12e9fdf45f597be351527f383c Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 21:22:01 2015 +0300 Update build system commit 8fd83d843fde3f486692de4e2c6b7d64d4192704 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 20:50:32 2015 +0300 Reachable blocks can't be empty commit 5822a36269833930a35cb3547222357118b11310 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:11:02 2015 +0300 added missing constraints commit 2d0c00b243479924de0260ae8d80d624c36994a3 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 19:03:12 2015 +0300 optimization commit 29d1e5eb210c51b052cac4d6c232aaa2c724dbbb Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 18:34:11 2015 +0300 Added missing optimization patterns commit 38dd3b3f2459f5193c742633213f41d78326ea28 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 17:47:06 2015 +0300 zend_optimize_block() refactoring commit 3dc97bd1f6d433dff0617338382347b6d0c08f84 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:30:32 2015 +0300 We don't use CFG back-references anymore commit 2242c9e0aa741d287146ad43179650796f199f2d Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 14:16:03 2015 +0300 Consistent naming commit 64f2856716069390ed7703ac88905cebf5e04023 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 13:29:32 2015 +0300 Optimization and separate building of direct CFG from predecessrs calculation commit 9389be4869b13ec45df5dbd443015d2ac539a347 Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 10:44:19 2015 +0300 Use CFG without back references (incomplete, but works) commit 3d3ecd4b883959cf7b86c33622183295f913924e Author: Dmitry Stogov <dmitry@zend.com> Date: Fri Nov 20 00:50:09 2015 +0300 Fixed iteration in reverse order commit 52f7fde0c3dfa4b4591519828ebdb238c2377936 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 18:35:09 2015 +0300 Separate debugging code into zend_dump.c commit 4193a039ea96bae41baf97c6e458f419e8dbf9c5 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:22:04 2015 +0300 Remove unused code commit 4228fdc57d8d120e1dad4e4d44045fa1a6f06fe0 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 17:21:20 2015 +0300 Remove dead live-ranges only on assembling basic blocks commit 9a4a7966edf19b92678876f85565700694205598 Author: Dmitry Stogov <dmitry@zend.com> Date: Thu Nov 19 15:26:29 2015 +0300 New CFG representation (incomplete)
2015-11-20 19:06:36 +00:00
END_EXTERN_C()
#endif /* ZEND_CFG_H */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* indent-tabs-mode: t
* End:
*/