Eliminate run-time check
authorDmitry Stogov <dmitry@zend.com>
Wed, 18 Mar 2020 18:19:31 +0000 (21:19 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 18 Mar 2020 18:19:31 +0000 (21:19 +0300)
ext/opcache/jit/zend_jit_x86.dasc

index 4cc269ba5be32eae1525080b74ac6ef315cf42db..2cb8955ff22bac6ac5358df68551b3405911f5be 100644 (file)
@@ -8015,11 +8015,18 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
 #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
                                |       mov r2, aword [r2]
 #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
-                               |       test r2, 1
-                               |       jz >1
-                               |       MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
-                               |1:
-                               |       mov     r2, aword [r2]
+                               if (func) {
+                                       if (func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) {
+                                               |       MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
+                                       }
+                                       |       mov     r2, aword [r2]
+                               } else {
+                                       |       test r2, 1
+                                       |       jz >1
+                                       |       MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
+                                       |1:
+                                       |       mov     r2, aword [r2]
+                               }
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif