Improve is_instanceof inference (#13238)

When a class is final, it may be treated as !is_instanceof.
This commit is contained in:
Ilija Tovilo 2024-01-29 12:48:55 +01:00 committed by GitHub
parent 52dba99d47
commit 34e2dc5697
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2003,10 +2003,15 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) {
#define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \ #define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \
do { \ do { \
if (var >= 0) { \ if (var >= 0) { \
if (ssa_var_info[var].ce != (_ce) || \ zend_class_entry *__ce = (_ce); \
ssa_var_info[var].is_instanceof != (_is_instanceof)) { \ bool __is_instanceof = (_is_instanceof); \
ssa_var_info[var].ce = (_ce); \ if (__ce && (__ce->ce_flags & ZEND_ACC_FINAL)) { \
ssa_var_info[var].is_instanceof = (_is_instanceof); \ __is_instanceof = false; \
} \
if (ssa_var_info[var].ce != __ce || \
ssa_var_info[var].is_instanceof != __is_instanceof) { \
ssa_var_info[var].ce = __ce; \
ssa_var_info[var].is_instanceof = __is_instanceof; \
if (update_worklist) { \ if (update_worklist) { \
add_usages(op_array, ssa, worklist, var); \ add_usages(op_array, ssa, worklist, var); \
} \ } \