@@ -522,7 +522,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
522
522
zend_ssa_op * ssa_ops = ssa -> ops ;
523
523
int ssa_vars_count = ssa -> vars_count ;
524
524
int i , j ;
525
- zend_op * opline , * end ;
525
+ zend_op * opline , * end , * next ;
526
526
int * tmp = NULL ;
527
527
ALLOCA_FLAG (use_heap = 0 );
528
528
@@ -552,40 +552,27 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
552
552
for (; opline < end ; opline ++ ) {
553
553
uint32_t k = opline - op_array -> opcodes ;
554
554
if (opline -> opcode != ZEND_OP_DATA ) {
555
- zend_op * next = opline + 1 ;
556
- if (next < end && next -> opcode == ZEND_OP_DATA ) {
557
- if (next -> op1_type == IS_CV ) {
558
- ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
559
- //USE_SSA_VAR(next->op1.var);
560
- } else if (next -> op1_type & (IS_VAR |IS_TMP_VAR )) {
561
- ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
562
- //USE_SSA_VAR(op_array->last_var + next->op1.var);
563
- }
564
- if (next -> op2_type == IS_CV ) {
565
- ssa_ops [k + 1 ].op2_use = var [EX_VAR_TO_NUM (next -> op2 .var )];
566
- //USE_SSA_VAR(next->op2.var);
567
- } else if (next -> op2_type & (IS_VAR |IS_TMP_VAR )) {
568
- ssa_ops [k + 1 ].op2_use = var [EX_VAR_TO_NUM (next -> op2 .var )];
569
- //USE_SSA_VAR(op_array->last_var + next->op2.var);
570
- }
571
- }
555
+
572
556
if (opline -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
573
557
ssa_ops [k ].op1_use = var [EX_VAR_TO_NUM (opline -> op1 .var )];
574
558
//USE_SSA_VAR(op_array->last_var + opline->op1.var)
575
559
}
576
- if (opline -> opcode == ZEND_FE_FETCH_R || opline -> opcode == ZEND_FE_FETCH_RW ) {
577
- if (opline -> op2_type == IS_CV ) {
578
- ssa_ops [k ].op2_use = var [EX_VAR_TO_NUM (opline -> op2 .var )];
579
- }
580
- ssa_ops [k ].op2_def = ssa_vars_count ;
581
- var [EX_VAR_TO_NUM (opline -> op2 .var )] = ssa_vars_count ;
582
- ssa_vars_count ++ ;
583
- //NEW_SSA_VAR(opline->op2.var)
584
- } else if (opline -> op2_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
560
+ if (opline -> op2_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
585
561
ssa_ops [k ].op2_use = var [EX_VAR_TO_NUM (opline -> op2 .var )];
586
562
//USE_SSA_VAR(op_array->last_var + opline->op2.var)
587
563
}
564
+ if ((build_flags & ZEND_SSA_USE_CV_RESULTS )
565
+ && opline -> result_type == IS_CV
566
+ && opline -> opcode != ZEND_RECV ) {
567
+ ssa_ops [k ].result_use = var [EX_VAR_TO_NUM (opline -> result .var )];
568
+ //USE_SSA_VAR(op_array->last_var + opline->result.var)
569
+ }
570
+
588
571
switch (opline -> opcode ) {
572
+ case ZEND_ADD_ARRAY_UNPACK :
573
+ case ZEND_ADD_ARRAY_ELEMENT :
574
+ ssa_ops [k ].result_use = var [EX_VAR_TO_NUM (opline -> result .var )];
575
+ break ;
589
576
case ZEND_ASSIGN :
590
577
if ((build_flags & ZEND_SSA_RC_INFERENCE ) && opline -> op2_type == IS_CV ) {
591
578
ssa_ops [k ].op2_def = ssa_vars_count ;
@@ -594,105 +581,110 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
594
581
//NEW_SSA_VAR(opline->op2.var)
595
582
}
596
583
if (opline -> op1_type == IS_CV ) {
584
+ add_op1_def :
597
585
ssa_ops [k ].op1_def = ssa_vars_count ;
598
586
var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
599
587
ssa_vars_count ++ ;
600
588
//NEW_SSA_VAR(opline->op1.var)
601
589
}
602
590
break ;
603
591
case ZEND_ASSIGN_REF :
604
- //TODO: ???
605
592
if (opline -> op2_type == IS_CV ) {
606
593
ssa_ops [k ].op2_def = ssa_vars_count ;
607
594
var [EX_VAR_TO_NUM (opline -> op2 .var )] = ssa_vars_count ;
608
595
ssa_vars_count ++ ;
609
596
//NEW_SSA_VAR(opline->op2.var)
610
597
}
611
598
if (opline -> op1_type == IS_CV ) {
612
- ssa_ops [k ].op1_def = ssa_vars_count ;
613
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
614
- ssa_vars_count ++ ;
615
- //NEW_SSA_VAR(opline->op1.var)
616
- }
617
- break ;
618
- case ZEND_BIND_GLOBAL :
619
- case ZEND_BIND_STATIC :
620
- if (opline -> op1_type == IS_CV ) {
621
- ssa_ops [k ].op1_def = ssa_vars_count ;
622
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
623
- ssa_vars_count ++ ;
624
- //NEW_SSA_VAR(opline->op1.var)
599
+ goto add_op1_def ;
625
600
}
626
601
break ;
627
602
case ZEND_ASSIGN_DIM :
628
603
case ZEND_ASSIGN_OBJ :
629
- if (opline -> op1_type == IS_CV ) {
630
- ssa_ops [k ].op1_def = ssa_vars_count ;
631
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
632
- ssa_vars_count ++ ;
633
- //NEW_SSA_VAR(opline->op1.var)
604
+ next = opline + 1 ;
605
+ if (next -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
606
+ ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
607
+ //USE_SSA_VAR(op_array->last_var + next->op1.var);
608
+ if (build_flags & ZEND_SSA_RC_INFERENCE && next -> op1_type == IS_CV ) {
609
+ ssa_ops [k + 1 ].op1_def = ssa_vars_count ;
610
+ var [EX_VAR_TO_NUM (next -> op1 .var )] = ssa_vars_count ;
611
+ ssa_vars_count ++ ;
612
+ //NEW_SSA_VAR(next->op1.var)
613
+ }
634
614
}
635
- if ((build_flags & ZEND_SSA_RC_INFERENCE ) && next -> op1_type == IS_CV ) {
636
- ssa_ops [k + 1 ].op1_def = ssa_vars_count ;
637
- var [EX_VAR_TO_NUM (next -> op1 .var )] = ssa_vars_count ;
638
- ssa_vars_count ++ ;
639
- //NEW_SSA_VAR(next->op1.var)
615
+ if (opline -> op1_type == IS_CV ) {
616
+ goto add_op1_def ;
640
617
}
641
618
break ;
642
619
case ZEND_ASSIGN_OBJ_REF :
643
- if (opline -> op1_type == IS_CV ) {
644
- ssa_ops [k ].op1_def = ssa_vars_count ;
645
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
646
- ssa_vars_count ++ ;
647
- //NEW_SSA_VAR(opline->op1.var)
620
+ next = opline + 1 ;
621
+ if (next -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
622
+ ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
623
+ //USE_SSA_VAR(op_array->last_var + next->op1.var);
624
+ if (next -> op1_type == IS_CV ) {
625
+ ssa_ops [k + 1 ].op1_def = ssa_vars_count ;
626
+ var [EX_VAR_TO_NUM (next -> op1 .var )] = ssa_vars_count ;
627
+ ssa_vars_count ++ ;
628
+ //NEW_SSA_VAR(next->op1.var)
629
+ }
648
630
}
649
- /* break missing intentionally */
650
- case ZEND_ASSIGN_STATIC_PROP_REF :
651
- if (next -> op1_type == IS_CV ) {
652
- ssa_ops [k + 1 ].op1_def = ssa_vars_count ;
653
- var [EX_VAR_TO_NUM (next -> op1 .var )] = ssa_vars_count ;
654
- ssa_vars_count ++ ;
655
- //NEW_SSA_VAR(next->op1.var)
631
+ if (opline -> op1_type == IS_CV ) {
632
+ goto add_op1_def ;
656
633
}
657
634
break ;
658
- case ZEND_PRE_INC_OBJ :
659
- case ZEND_PRE_DEC_OBJ :
660
- case ZEND_POST_INC_OBJ :
661
- case ZEND_POST_DEC_OBJ :
662
- if (opline -> op1_type == IS_CV ) {
663
- ssa_ops [k ].op1_def = ssa_vars_count ;
664
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
665
- ssa_vars_count ++ ;
666
- //NEW_SSA_VAR(opline->op1.var)
635
+ case ZEND_ASSIGN_STATIC_PROP :
636
+ next = opline + 1 ;
637
+ if (next -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
638
+ ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
639
+ //USE_SSA_VAR(op_array->last_var + next->op1.var);
640
+ #if 0
641
+ if ((build_flags & ZEND_SSA_RC_INFERENCE ) && next -> op1_type == IS_CV ) {
642
+ ssa_ops [k + 1 ].op1_def = ssa_vars_count ;
643
+ var [EX_VAR_TO_NUM (next -> op1 .var )] = ssa_vars_count ;
644
+ ssa_vars_count ++ ;
645
+ //NEW_SSA_VAR(next->op1.var)
646
+ }
647
+ #endif
667
648
}
668
649
break ;
669
- case ZEND_ADD_ARRAY_ELEMENT :
670
- ssa_ops [k ].result_use = var [EX_VAR_TO_NUM (opline -> result .var )];
671
- case ZEND_INIT_ARRAY :
672
- if (((build_flags & ZEND_SSA_RC_INFERENCE )
673
- || (opline -> extended_value & ZEND_ARRAY_ELEMENT_REF ))
674
- && opline -> op1_type == IS_CV ) {
675
- ssa_ops [k ].op1_def = ssa_vars_count ;
676
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
677
- ssa_vars_count ++ ;
678
- //NEW_SSA_VAR(opline+->op1.var)
650
+ case ZEND_ASSIGN_STATIC_PROP_REF :
651
+ next = opline + 1 ;
652
+ if (next -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
653
+ ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
654
+ //USE_SSA_VAR(op_array->last_var + next->op1.var);
655
+ if (next -> op1_type == IS_CV ) {
656
+ ssa_ops [k + 1 ].op1_def = ssa_vars_count ;
657
+ var [EX_VAR_TO_NUM (next -> op1 .var )] = ssa_vars_count ;
658
+ ssa_vars_count ++ ;
659
+ //NEW_SSA_VAR(next->op1.var)
660
+ }
679
661
}
680
662
break ;
681
- case ZEND_ADD_ARRAY_UNPACK :
682
- ssa_ops [k ].result_use = var [EX_VAR_TO_NUM (opline -> result .var )];
663
+ case ZEND_ASSIGN_STATIC_PROP_OP :
664
+ next = opline + 1 ;
665
+ if (next -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
666
+ ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
667
+ //USE_SSA_VAR(op_array->last_var + next->op1.var);
668
+ }
683
669
break ;
684
- case ZEND_SEND_VAR :
685
- case ZEND_CAST :
686
- case ZEND_QM_ASSIGN :
687
- case ZEND_JMP_SET :
688
- case ZEND_COALESCE :
689
- if ((build_flags & ZEND_SSA_RC_INFERENCE ) && opline -> op1_type == IS_CV ) {
690
- ssa_ops [k ].op1_def = ssa_vars_count ;
691
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
692
- ssa_vars_count ++ ;
693
- //NEW_SSA_VAR(opline->op1.var)
670
+ case ZEND_ASSIGN_DIM_OP :
671
+ case ZEND_ASSIGN_OBJ_OP :
672
+ next = opline + 1 ;
673
+ if (next -> op1_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
674
+ ssa_ops [k + 1 ].op1_use = var [EX_VAR_TO_NUM (next -> op1 .var )];
675
+ //USE_SSA_VAR(op_array->last_var + next->op1.var);
676
+ }
677
+ if (opline -> op1_type == IS_CV ) {
678
+ goto add_op1_def ;
694
679
}
695
680
break ;
681
+ case ZEND_ASSIGN_OP :
682
+ case ZEND_PRE_INC :
683
+ case ZEND_PRE_DEC :
684
+ case ZEND_POST_INC :
685
+ case ZEND_POST_DEC :
686
+ case ZEND_BIND_GLOBAL :
687
+ case ZEND_BIND_STATIC :
696
688
case ZEND_SEND_VAR_NO_REF :
697
689
case ZEND_SEND_VAR_NO_REF_EX :
698
690
case ZEND_SEND_VAR_EX :
@@ -701,41 +693,10 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
701
693
case ZEND_SEND_UNPACK :
702
694
case ZEND_FE_RESET_RW :
703
695
case ZEND_MAKE_REF :
704
- if (opline -> op1_type == IS_CV ) {
705
- ssa_ops [k ].op1_def = ssa_vars_count ;
706
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
707
- ssa_vars_count ++ ;
708
- //NEW_SSA_VAR(opline->op1.var)
709
- }
710
- break ;
711
- case ZEND_FE_RESET_R :
712
- if ((build_flags & ZEND_SSA_RC_INFERENCE ) && opline -> op1_type == IS_CV ) {
713
- ssa_ops [k ].op1_def = ssa_vars_count ;
714
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
715
- ssa_vars_count ++ ;
716
- //NEW_SSA_VAR(opline->op1.var)
717
- }
718
- break ;
719
- case ZEND_ASSIGN_OP :
720
- case ZEND_ASSIGN_DIM_OP :
721
- case ZEND_ASSIGN_OBJ_OP :
722
- case ZEND_ASSIGN_STATIC_PROP_OP :
723
- case ZEND_PRE_INC :
724
- case ZEND_PRE_DEC :
725
- case ZEND_POST_INC :
726
- case ZEND_POST_DEC :
727
- if (opline -> op1_type == IS_CV ) {
728
- ssa_ops [k ].op1_def = ssa_vars_count ;
729
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
730
- ssa_vars_count ++ ;
731
- //NEW_SSA_VAR(opline->op1.var)
732
- }
733
- break ;
734
- case ZEND_UNSET_CV :
735
- ssa_ops [k ].op1_def = ssa_vars_count ;
736
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
737
- ssa_vars_count ++ ;
738
- break ;
696
+ case ZEND_PRE_INC_OBJ :
697
+ case ZEND_PRE_DEC_OBJ :
698
+ case ZEND_POST_INC_OBJ :
699
+ case ZEND_POST_DEC_OBJ :
739
700
case ZEND_UNSET_DIM :
740
701
case ZEND_UNSET_OBJ :
741
702
case ZEND_FETCH_DIM_W :
@@ -744,49 +705,63 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
744
705
case ZEND_FETCH_DIM_UNSET :
745
706
case ZEND_FETCH_LIST_W :
746
707
if (opline -> op1_type == IS_CV ) {
747
- ssa_ops [k ].op1_def = ssa_vars_count ;
748
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
749
- ssa_vars_count ++ ;
750
- //NEW_SSA_VAR(opline->op1.var)
708
+ goto add_op1_def ;
751
709
}
752
710
break ;
753
- case ZEND_BIND_LEXICAL :
754
- if ((opline -> extended_value & ZEND_BIND_REF ) || (build_flags & ZEND_SSA_RC_INFERENCE )) {
755
- ssa_ops [k ].op2_def = ssa_vars_count ;
756
- var [EX_VAR_TO_NUM (opline -> op2 .var )] = ssa_vars_count ;
757
- ssa_vars_count ++ ;
711
+ case ZEND_SEND_VAR :
712
+ case ZEND_CAST :
713
+ case ZEND_QM_ASSIGN :
714
+ case ZEND_JMP_SET :
715
+ case ZEND_COALESCE :
716
+ case ZEND_FE_RESET_R :
717
+ if ((build_flags & ZEND_SSA_RC_INFERENCE ) && opline -> op1_type == IS_CV ) {
718
+ goto add_op1_def ;
719
+ }
720
+ break ;
721
+ case ZEND_INIT_ARRAY :
722
+ if (((build_flags & ZEND_SSA_RC_INFERENCE )
723
+ || (opline -> extended_value & ZEND_ARRAY_ELEMENT_REF ))
724
+ && opline -> op1_type == IS_CV ) {
725
+ goto add_op1_def ;
758
726
}
759
727
break ;
760
728
case ZEND_YIELD :
761
729
if (opline -> op1_type == IS_CV
762
730
&& ((op_array -> fn_flags & ZEND_ACC_RETURN_REFERENCE )
763
731
|| (build_flags & ZEND_SSA_RC_INFERENCE ))) {
764
- ssa_ops [k ].op1_def = ssa_vars_count ;
765
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
766
- ssa_vars_count ++ ;
732
+ goto add_op1_def ;
767
733
}
768
734
break ;
735
+ case ZEND_UNSET_CV :
736
+ goto add_op1_def ;
769
737
case ZEND_VERIFY_RETURN_TYPE :
770
738
if (opline -> op1_type & (IS_TMP_VAR |IS_VAR |IS_CV )) {
771
- ssa_ops [k ].op1_def = ssa_vars_count ;
772
- var [EX_VAR_TO_NUM (opline -> op1 .var )] = ssa_vars_count ;
739
+ goto add_op1_def ;
740
+ }
741
+ break ;
742
+ case ZEND_FE_FETCH_R :
743
+ case ZEND_FE_FETCH_RW :
744
+ if (opline -> op2_type != IS_CV ) {
745
+ ssa_ops [k ].op2_use = -1 ; /* not used */
746
+ }
747
+ ssa_ops [k ].op2_def = ssa_vars_count ;
748
+ var [EX_VAR_TO_NUM (opline -> op2 .var )] = ssa_vars_count ;
749
+ ssa_vars_count ++ ;
750
+ //NEW_SSA_VAR(opline->op2.var)
751
+ break ;
752
+ case ZEND_BIND_LEXICAL :
753
+ if ((opline -> extended_value & ZEND_BIND_REF ) || (build_flags & ZEND_SSA_RC_INFERENCE )) {
754
+ ssa_ops [k ].op2_def = ssa_vars_count ;
755
+ var [EX_VAR_TO_NUM (opline -> op2 .var )] = ssa_vars_count ;
773
756
ssa_vars_count ++ ;
774
- //NEW_SSA_VAR(opline->op1 .var)
757
+ //NEW_SSA_VAR(opline->op2 .var)
775
758
}
776
759
break ;
777
760
default :
778
761
break ;
779
762
}
780
- if (opline -> result_type == IS_CV ) {
781
- if ((build_flags & ZEND_SSA_USE_CV_RESULTS )
782
- && opline -> opcode != ZEND_RECV ) {
783
- ssa_ops [k ].result_use = var [EX_VAR_TO_NUM (opline -> result .var )];
784
- }
785
- ssa_ops [k ].result_def = ssa_vars_count ;
786
- var [EX_VAR_TO_NUM (opline -> result .var )] = ssa_vars_count ;
787
- ssa_vars_count ++ ;
788
- //NEW_SSA_VAR(opline->result.var)
789
- } else if (opline -> result_type & (IS_VAR |IS_TMP_VAR )) {
763
+
764
+ if (opline -> result_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
790
765
ssa_ops [k ].result_def = ssa_vars_count ;
791
766
var [EX_VAR_TO_NUM (opline -> result .var )] = ssa_vars_count ;
792
767
ssa_vars_count ++ ;
0 commit comments