@@ -407,40 +407,28 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
407
407
zend_call_info * call_info = func_info -> callee_info ;
408
408
409
409
do {
410
- if (call_info -> caller_call_opline
411
- && call_info -> caller_call_opline -> opcode == ZEND_DO_ICALL
410
+ zend_op * op = call_info -> caller_init_opline ;
411
+
412
+ if ((op -> opcode == ZEND_FRAMELESS_ICALL_2
413
+ || (op -> opcode == ZEND_FRAMELESS_ICALL_3 && (op + 1 )-> op1_type == IS_CONST ))
412
414
&& call_info -> callee_func
413
- && zend_string_equals_literal (call_info -> callee_func -> common .function_name , "in_array" )
414
- && (call_info -> caller_init_opline -> extended_value == 2
415
- || (call_info -> caller_init_opline -> extended_value == 3
416
- && (call_info -> caller_call_opline - 1 )-> opcode == ZEND_SEND_VAL
417
- && (call_info -> caller_call_opline - 1 )-> op1_type == IS_CONST ))) {
418
-
419
- zend_op * send_array ;
420
- zend_op * send_needly ;
415
+ && zend_string_equals_literal (call_info -> callee_func -> common .function_name , "in_array" )) {
416
+
421
417
bool strict = 0 ;
418
+ bool has_opdata = op -> opcode == ZEND_FRAMELESS_ICALL_3 ;
422
419
ZEND_ASSERT (!call_info -> is_prototype );
423
420
424
- if (call_info -> caller_init_opline -> extended_value == 2 ) {
425
- send_array = call_info -> caller_call_opline - 1 ;
426
- send_needly = call_info -> caller_call_opline - 2 ;
427
- } else {
428
- if (zend_is_true (CT_CONSTANT_EX (op_array , (call_info -> caller_call_opline - 1 )-> op1 .constant ))) {
421
+ if (has_opdata ) {
422
+ if (zend_is_true (CT_CONSTANT_EX (op_array , (op + 1 )-> op1 .constant ))) {
429
423
strict = 1 ;
430
424
}
431
- send_array = call_info -> caller_call_opline - 2 ;
432
- send_needly = call_info -> caller_call_opline - 3 ;
433
425
}
434
426
435
- if (send_array -> opcode == ZEND_SEND_VAL
436
- && send_array -> op1_type == IS_CONST
437
- && Z_TYPE_P (CT_CONSTANT_EX (op_array , send_array -> op1 .constant )) == IS_ARRAY
438
- && (send_needly -> opcode == ZEND_SEND_VAL
439
- || send_needly -> opcode == ZEND_SEND_VAR )
440
- ) {
427
+ if (op -> op2_type == IS_CONST
428
+ && Z_TYPE_P (CT_CONSTANT_EX (op_array , op -> op2 .constant )) == IS_ARRAY ) {
441
429
bool ok = 1 ;
442
430
443
- HashTable * src = Z_ARRVAL_P (CT_CONSTANT_EX (op_array , send_array -> op1 .constant ));
431
+ HashTable * src = Z_ARRVAL_P (CT_CONSTANT_EX (op_array , op -> op2 .constant ));
444
432
HashTable * dst ;
445
433
zval * val , tmp ;
446
434
zend_ulong idx ;
@@ -471,59 +459,16 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
471
459
}
472
460
473
461
if (ok ) {
474
- uint32_t op_num = send_needly - op_array -> opcodes ;
475
- zend_ssa_op * ssa_op = ssa -> ops + op_num ;
476
-
477
- if (ssa_op -> op1_use >= 0 ) {
478
- /* Reconstruct SSA */
479
- int var_num = ssa_op -> op1_use ;
480
- zend_ssa_var * var = ssa -> vars + var_num ;
481
-
482
- ZEND_ASSERT (ssa_op -> op1_def < 0 );
483
- zend_ssa_unlink_use_chain (ssa , op_num , ssa_op -> op1_use );
484
- ssa_op -> op1_use = -1 ;
485
- ssa_op -> op1_use_chain = -1 ;
486
- op_num = call_info -> caller_call_opline - op_array -> opcodes ;
487
- ssa_op = ssa -> ops + op_num ;
488
- ssa_op -> op1_use = var_num ;
489
- ssa_op -> op1_use_chain = var -> use_chain ;
490
- var -> use_chain = op_num ;
491
- }
492
-
493
462
ZVAL_ARR (& tmp , dst );
494
463
495
464
/* Update opcode */
496
- call_info -> caller_call_opline -> opcode = ZEND_IN_ARRAY ;
497
- call_info -> caller_call_opline -> extended_value = strict ;
498
- call_info -> caller_call_opline -> op1_type = send_needly -> op1_type ;
499
- call_info -> caller_call_opline -> op1 .num = send_needly -> op1 .num ;
500
- call_info -> caller_call_opline -> op2_type = IS_CONST ;
501
- call_info -> caller_call_opline -> op2 .constant = zend_optimizer_add_literal (op_array , & tmp );
502
- if (call_info -> caller_init_opline -> extended_value == 3 ) {
503
- MAKE_NOP (call_info -> caller_call_opline - 1 );
504
- }
505
- MAKE_NOP (call_info -> caller_init_opline );
506
- MAKE_NOP (send_needly );
507
- MAKE_NOP (send_array );
508
- removed_ops ++ ;
509
-
510
- op_num = call_info -> caller_call_opline - op_array -> opcodes ;
511
- ssa_op = ssa -> ops + op_num ;
512
- if (ssa_op -> result_def >= 0 ) {
513
- int var = ssa_op -> result_def ;
514
- int use = ssa -> vars [var ].use_chain ;
515
-
516
- /* If the result is used only in a JMPZ/JMPNZ, replace result type with
517
- * IS_TMP_VAR, which will enable use of smart branches. Don't do this
518
- * in other cases, as not all opcodes support both VAR and TMP. */
519
- if (ssa -> vars [var ].phi_use_chain == NULL
520
- && ssa -> ops [use ].op1_use == var
521
- && ssa -> ops [use ].op1_use_chain == -1
522
- && (op_array -> opcodes [use ].opcode == ZEND_JMPZ
523
- || op_array -> opcodes [use ].opcode == ZEND_JMPNZ )) {
524
- call_info -> caller_call_opline -> result_type = IS_TMP_VAR ;
525
- op_array -> opcodes [use ].op1_type = IS_TMP_VAR ;
526
- }
465
+ op -> opcode = ZEND_IN_ARRAY ;
466
+ op -> extended_value = strict ;
467
+ op -> op2_type = IS_CONST ;
468
+ op -> op2 .constant = zend_optimizer_add_literal (op_array , & tmp );
469
+ if (has_opdata ) {
470
+ MAKE_NOP (op + 1 );
471
+ removed_ops ++ ;
527
472
}
528
473
}
529
474
}
0 commit comments