Skip to content

Commit cc29cbe

Browse files
committed
cleanup
1 parent cdc2c74 commit cc29cbe

File tree

1 file changed

+129
-154
lines changed

1 file changed

+129
-154
lines changed

ext/opcache/Optimizer/zend_ssa.c

Lines changed: 129 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
522522
zend_ssa_op *ssa_ops = ssa->ops;
523523
int ssa_vars_count = ssa->vars_count;
524524
int i, j;
525-
zend_op *opline, *end;
525+
zend_op *opline, *end, *next;
526526
int *tmp = NULL;
527527
ALLOCA_FLAG(use_heap = 0);
528528

@@ -552,40 +552,27 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
552552
for (; opline < end; opline++) {
553553
uint32_t k = opline - op_array->opcodes;
554554
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+
572556
if (opline->op1_type & (IS_CV|IS_VAR|IS_TMP_VAR)) {
573557
ssa_ops[k].op1_use = var[EX_VAR_TO_NUM(opline->op1.var)];
574558
//USE_SSA_VAR(op_array->last_var + opline->op1.var)
575559
}
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)) {
585561
ssa_ops[k].op2_use = var[EX_VAR_TO_NUM(opline->op2.var)];
586562
//USE_SSA_VAR(op_array->last_var + opline->op2.var)
587563
}
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+
588571
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;
589576
case ZEND_ASSIGN:
590577
if ((build_flags & ZEND_SSA_RC_INFERENCE) && opline->op2_type == IS_CV) {
591578
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,
594581
//NEW_SSA_VAR(opline->op2.var)
595582
}
596583
if (opline->op1_type == IS_CV) {
584+
add_op1_def:
597585
ssa_ops[k].op1_def = ssa_vars_count;
598586
var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count;
599587
ssa_vars_count++;
600588
//NEW_SSA_VAR(opline->op1.var)
601589
}
602590
break;
603591
case ZEND_ASSIGN_REF:
604-
//TODO: ???
605592
if (opline->op2_type == IS_CV) {
606593
ssa_ops[k].op2_def = ssa_vars_count;
607594
var[EX_VAR_TO_NUM(opline->op2.var)] = ssa_vars_count;
608595
ssa_vars_count++;
609596
//NEW_SSA_VAR(opline->op2.var)
610597
}
611598
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;
625600
}
626601
break;
627602
case ZEND_ASSIGN_DIM:
628603
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+
}
634614
}
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;
640617
}
641618
break;
642619
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+
}
648630
}
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;
656633
}
657634
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
667648
}
668649
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+
}
679661
}
680662
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+
}
683669
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;
694679
}
695680
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:
696688
case ZEND_SEND_VAR_NO_REF:
697689
case ZEND_SEND_VAR_NO_REF_EX:
698690
case ZEND_SEND_VAR_EX:
@@ -701,41 +693,10 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
701693
case ZEND_SEND_UNPACK:
702694
case ZEND_FE_RESET_RW:
703695
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:
739700
case ZEND_UNSET_DIM:
740701
case ZEND_UNSET_OBJ:
741702
case ZEND_FETCH_DIM_W:
@@ -744,49 +705,63 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
744705
case ZEND_FETCH_DIM_UNSET:
745706
case ZEND_FETCH_LIST_W:
746707
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;
751709
}
752710
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;
758726
}
759727
break;
760728
case ZEND_YIELD:
761729
if (opline->op1_type == IS_CV
762730
&& ((op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE)
763731
|| (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;
767733
}
768734
break;
735+
case ZEND_UNSET_CV:
736+
goto add_op1_def;
769737
case ZEND_VERIFY_RETURN_TYPE:
770738
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;
773756
ssa_vars_count++;
774-
//NEW_SSA_VAR(opline->op1.var)
757+
//NEW_SSA_VAR(opline->op2.var)
775758
}
776759
break;
777760
default:
778761
break;
779762
}
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)) {
790765
ssa_ops[k].result_def = ssa_vars_count;
791766
var[EX_VAR_TO_NUM(opline->result.var)] = ssa_vars_count;
792767
ssa_vars_count++;

0 commit comments

Comments
 (0)