php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
zend_ssa.h File Reference
#include "zend_optimizer.h"
#include "zend_cfg.h"

Go to the source code of this file.

Data Structures

struct  _zend_ssa_range
 
struct  _zend_ssa_range_constraint
 
struct  _zend_ssa_type_constraint
 
union  _zend_ssa_pi_constraint
 
struct  _zend_ssa_phi
 
struct  _zend_ssa_block
 
struct  _zend_ssa_op
 
struct  _zend_ssa_var
 
struct  _zend_ssa_var_info
 
struct  _zend_ssa
 

Macros

#define NUM_PHI_SOURCES(phi)
 
#define FOREACH_USE(var, use)
 
#define FOREACH_USE_END()
 
#define FOREACH_PHI_USE(var, phi)
 
#define FOREACH_PHI_USE_END()
 
#define FOREACH_PHI_SOURCE(phi, source)
 
#define FOREACH_PHI_SOURCE_END()
 
#define FOREACH_PHI(phi)
 
#define FOREACH_PHI_END()
 
#define FOREACH_BLOCK(block)
 
#define FOREACH_BLOCK_END()
 
#define FOREACH_INSTR_NUM(i)
 
#define FOREACH_INSTR_NUM_END()
 

Typedefs

typedef struct _zend_ssa_range zend_ssa_range
 
typedef enum _zend_ssa_negative_lat zend_ssa_negative_lat
 
typedef struct _zend_ssa_range_constraint zend_ssa_range_constraint
 
typedef struct _zend_ssa_type_constraint zend_ssa_type_constraint
 
typedef union _zend_ssa_pi_constraint zend_ssa_pi_constraint
 
typedef struct _zend_ssa_phi zend_ssa_phi
 
typedef struct _zend_ssa_block zend_ssa_block
 
typedef struct _zend_ssa_op zend_ssa_op
 
typedef enum _zend_ssa_alias_kind zend_ssa_alias_kind
 
typedef enum _zend_ssa_escape_state zend_ssa_escape_state
 
typedef struct _zend_ssa_var zend_ssa_var
 
typedef struct _zend_ssa_var_info zend_ssa_var_info
 
typedef struct _zend_ssa zend_ssa
 

Enumerations

enum  _zend_ssa_negative_lat {
  NEG_NONE = 0 , NEG_INIT = 1 , NEG_INVARIANT = 2 , NEG_USE_LT = 3 ,
  NEG_USE_GT = 4 , NEG_UNKNOWN = 5
}
 
enum  _zend_ssa_alias_kind { NO_ALIAS , SYMTABLE_ALIAS , HTTP_RESPONSE_HEADER_ALIAS }
 
enum  _zend_ssa_escape_state { ESCAPE_STATE_UNKNOWN , ESCAPE_STATE_NO_ESCAPE , ESCAPE_STATE_FUNCTION_ESCAPE , ESCAPE_STATE_GLOBAL_ESCAPE }
 

Functions

ZEND_API zend_result zend_build_ssa (zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa)
 
ZEND_API void zend_ssa_compute_use_def_chains (zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa)
 
ZEND_API int zend_ssa_rename_op (const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var)
 
void zend_ssa_unlink_use_chain (zend_ssa *ssa, int op, int var)
 
void zend_ssa_replace_use_chain (zend_ssa *ssa, int op, int new_op, int var)
 
void zend_ssa_remove_predecessor (zend_ssa *ssa, int from, int to)
 
void zend_ssa_remove_defs_of_instr (zend_ssa *ssa, zend_ssa_op *ssa_op)
 
void zend_ssa_remove_instr (zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op)
 
void zend_ssa_remove_phi (zend_ssa *ssa, zend_ssa_phi *phi)
 
void zend_ssa_remove_uses_of_var (zend_ssa *ssa, int var_num)
 
void zend_ssa_remove_block (zend_op_array *op_array, zend_ssa *ssa, int b)
 
void zend_ssa_rename_var_uses (zend_ssa *ssa, int old_var, int new_var, bool update_types)
 
void zend_ssa_remove_block_from_cfg (zend_ssa *ssa, int b)
 

Macro Definition Documentation

◆ FOREACH_BLOCK

#define FOREACH_BLOCK ( block)
Value:
do { \
int _i; \
for (_i = 0; _i < ssa->cfg.blocks_count; _i++) { \
(block) = &ssa->cfg.blocks[_i]; \
if (!((block)->flags & ZEND_BB_REACHABLE)) { \
continue; \
}
#define ZEND_BB_REACHABLE
Definition zend_cfg.h:38

Definition at line 306 of file zend_ssa.h.

◆ FOREACH_BLOCK_END

#define FOREACH_BLOCK_END ( )
Value:
} \
} while (0)

Definition at line 313 of file zend_ssa.h.

◆ FOREACH_INSTR_NUM

#define FOREACH_INSTR_NUM ( i)
Value:
do { \
zend_basic_block *_block; \
FOREACH_BLOCK(_block) { \
uint32_t _end = _block->start + _block->len; \
for ((i) = _block->start; (i) < _end; (i)++) {
uint32_t start
Definition zend_cfg.h:45
struct _zend_basic_block zend_basic_block

Definition at line 318 of file zend_ssa.h.

◆ FOREACH_INSTR_NUM_END

#define FOREACH_INSTR_NUM_END ( )
Value:
} \
} while (0)
#define FOREACH_BLOCK_END()
Definition zend_ssa.h:313

Definition at line 323 of file zend_ssa.h.

◆ FOREACH_PHI

#define FOREACH_PHI ( phi)
Value:
do { \
int _i; \
for (_i = 0; _i < ssa->cfg.blocks_count; _i++) { \
phi = ssa->blocks[_i].phis; \
for (; phi; phi = phi->next) {

Definition at line 296 of file zend_ssa.h.

◆ FOREACH_PHI_END

#define FOREACH_PHI_END ( )
Value:
} \
} \
} while (0)

Definition at line 301 of file zend_ssa.h.

◆ FOREACH_PHI_SOURCE

#define FOREACH_PHI_SOURCE ( phi,
source )
Value:
do { \
zend_ssa_phi *_phi = (phi); \
int _i, _end = NUM_PHI_SOURCES(phi); \
for (_i = 0; _i < _end; _i++) { \
ZEND_ASSERT(_phi->sources[_i] >= 0); \
source = _phi->sources[_i];
int * sources
Definition zend_ssa.h:73
struct _zend_ssa_phi zend_ssa_phi
Definition zend_ssa.h:62
#define NUM_PHI_SOURCES(phi)
Definition zend_ssa.h:264

Definition at line 286 of file zend_ssa.h.

◆ FOREACH_PHI_SOURCE_END

#define FOREACH_PHI_SOURCE_END ( )
Value:
} \
} while (0)

Definition at line 292 of file zend_ssa.h.

◆ FOREACH_PHI_USE

#define FOREACH_PHI_USE ( var,
phi )
Value:
do { \
int _var_num = (var) - ssa->vars; \
zend_ssa_phi *next_phi; \
for (phi = (var)->phi_use_chain; phi; phi = next_phi) { \
next_phi = zend_ssa_next_use_phi(ssa, _var_num, phi);

Definition at line 277 of file zend_ssa.h.

◆ FOREACH_PHI_USE_END

#define FOREACH_PHI_USE_END ( )
Value:
} \
} while (0)

Definition at line 282 of file zend_ssa.h.

◆ FOREACH_USE

#define FOREACH_USE ( var,
use )
Value:
do { \
int _var_num = (var) - ssa->vars, next; \
for (use = (var)->use_chain; use >= 0; use = next) { \
next = zend_ssa_next_use(ssa->ops, _var_num, use);
#define next(ls)
Definition minilua.c:2661

Definition at line 269 of file zend_ssa.h.

◆ FOREACH_USE_END

#define FOREACH_USE_END ( )
Value:
} \
} while (0)

Definition at line 273 of file zend_ssa.h.

◆ NUM_PHI_SOURCES

#define NUM_PHI_SOURCES ( phi)
Value:
((phi)->pi >= 0 ? 1 : (ssa->cfg.blocks[(phi)->block].predecessors_count))

Definition at line 264 of file zend_ssa.h.

Typedef Documentation

◆ zend_ssa

typedef struct _zend_ssa zend_ssa

◆ zend_ssa_alias_kind

◆ zend_ssa_block

◆ zend_ssa_escape_state

◆ zend_ssa_negative_lat

◆ zend_ssa_op

typedef struct _zend_ssa_op zend_ssa_op

◆ zend_ssa_phi

typedef struct _zend_ssa_phi zend_ssa_phi

Definition at line 62 of file zend_ssa.h.

◆ zend_ssa_pi_constraint

◆ zend_ssa_range

◆ zend_ssa_range_constraint

◆ zend_ssa_type_constraint

◆ zend_ssa_var

typedef struct _zend_ssa_var zend_ssa_var

◆ zend_ssa_var_info

Enumeration Type Documentation

◆ _zend_ssa_alias_kind

Enumerator
NO_ALIAS 
SYMTABLE_ALIAS 
HTTP_RESPONSE_HEADER_ALIAS 

Definition at line 94 of file zend_ssa.h.

◆ _zend_ssa_escape_state

Enumerator
ESCAPE_STATE_UNKNOWN 
ESCAPE_STATE_NO_ESCAPE 
ESCAPE_STATE_FUNCTION_ESCAPE 
ESCAPE_STATE_GLOBAL_ESCAPE 

Definition at line 100 of file zend_ssa.h.

◆ _zend_ssa_negative_lat

Enumerator
NEG_NONE 
NEG_INIT 
NEG_INVARIANT 
NEG_USE_LT 
NEG_USE_GT 
NEG_UNKNOWN 

Definition at line 32 of file zend_ssa.h.

Function Documentation

◆ zend_build_ssa()

ZEND_API zend_result zend_build_ssa ( zend_arena ** arena,
const zend_script * script,
const zend_op_array * op_array,
uint32_t build_flags,
zend_ssa * ssa )

Definition at line 936 of file zend_ssa.c.

◆ zend_ssa_compute_use_def_chains()

ZEND_API void zend_ssa_compute_use_def_chains ( zend_arena ** arena,
const zend_op_array * op_array,
zend_ssa * ssa )

Definition at line 1084 of file zend_ssa.c.

◆ zend_ssa_remove_block()

void zend_ssa_remove_block ( zend_op_array * op_array,
zend_ssa * ssa,
int b )

Definition at line 1501 of file zend_ssa.c.

◆ zend_ssa_remove_block_from_cfg()

void zend_ssa_remove_block_from_cfg ( zend_ssa * ssa,
int b )

Definition at line 1530 of file zend_ssa.c.

◆ zend_ssa_remove_defs_of_instr()

void zend_ssa_remove_defs_of_instr ( zend_ssa * ssa,
zend_ssa_op * ssa_op )

Definition at line 1364 of file zend_ssa.c.

◆ zend_ssa_remove_instr()

void zend_ssa_remove_instr ( zend_ssa * ssa,
zend_op * opline,
zend_ssa_op * ssa_op )

Definition at line 1281 of file zend_ssa.c.

◆ zend_ssa_remove_phi()

void zend_ssa_remove_phi ( zend_ssa * ssa,
zend_ssa_phi * phi )

Definition at line 1410 of file zend_ssa.c.

◆ zend_ssa_remove_predecessor()

void zend_ssa_remove_predecessor ( zend_ssa * ssa,
int from,
int to )

Definition at line 1455 of file zend_ssa.c.

◆ zend_ssa_remove_uses_of_var()

void zend_ssa_remove_uses_of_var ( zend_ssa * ssa,
int var_num )

Definition at line 1422 of file zend_ssa.c.

◆ zend_ssa_rename_op()

ZEND_API int zend_ssa_rename_op ( const zend_op_array * op_array,
const zend_op * opline,
uint32_t k,
uint32_t build_flags,
int ssa_vars_count,
zend_ssa_op * ssa_ops,
int * var )

Definition at line 813 of file zend_ssa.c.

◆ zend_ssa_rename_var_uses()

void zend_ssa_rename_var_uses ( zend_ssa * ssa,
int old_var,
int new_var,
bool update_types )

Definition at line 1595 of file zend_ssa.c.

◆ zend_ssa_replace_use_chain()

void zend_ssa_replace_use_chain ( zend_ssa * ssa,
int op,
int new_op,
int var )

Definition at line 1241 of file zend_ssa.c.

◆ zend_ssa_unlink_use_chain()

void zend_ssa_unlink_use_chain ( zend_ssa * ssa,
int op,
int var )

Definition at line 1202 of file zend_ssa.c.