Lines Matching refs:ssa_op

456 	CHECK_OP_TRACE_TYPE(opline->op1.var, ssa_op->op1_use, op1_info, op1_type)
458 CHECK_OP_TRACE_TYPE(opline->op2.var, ssa_op->op2_use, op2_info, op2_type)
460 CHECK_OP_TRACE_TYPE((opline+1)->op1.var, (ssa_op+1)->op1_use, op1_data_info, op3_type)
985 static int find_return_ssa_var(zend_jit_trace_rec *p, zend_ssa_op *ssa_op) in find_return_ssa_var() argument
993 return ssa_op->result_def; in find_return_ssa_var()
2696 const zend_ssa_op *ssa_op; in zend_jit_trace_allocate_registers() local
2797 ssa_op = ssa->ops; in zend_jit_trace_allocate_registers()
2806 zend_jit_opline_supports_reg(op_array, ssa, opline, ssa_op, p); in zend_jit_trace_allocate_registers()
2811 && ssa_op->op1_def >= 0 in zend_jit_trace_allocate_registers()
2812 && ssa->vars[ssa_op->op1_def].alias != NO_ALIAS) { in zend_jit_trace_allocate_registers()
2817 if (ssa_op->op1_use >= 0 in zend_jit_trace_allocate_registers()
2818 && start[ssa_op->op1_use] >= 0 in zend_jit_trace_allocate_registers()
2819 && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)) { in zend_jit_trace_allocate_registers()
2821 …zend_jit_trace_use_var(idx, ssa_op->op1_use, ssa_op->op1_def, ssa_op->op1_use_chain, start, end, f… in zend_jit_trace_allocate_registers()
2837 flags[ssa_op->op1_use] |= ZREG_STORE; in zend_jit_trace_allocate_registers()
2839 flags[ssa_op->op1_use] |= ZREG_LAST_USE; in zend_jit_trace_allocate_registers()
2843 start[ssa_op->op1_use] = -1; in zend_jit_trace_allocate_registers()
2844 end[ssa_op->op1_use] = -1; in zend_jit_trace_allocate_registers()
2848 if (ssa_op->op2_use >= 0 in zend_jit_trace_allocate_registers()
2849 && ssa_op->op2_use != ssa_op->op1_use in zend_jit_trace_allocate_registers()
2850 && start[ssa_op->op2_use] >= 0 in zend_jit_trace_allocate_registers()
2851 && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op2_use)) { in zend_jit_trace_allocate_registers()
2853 …zend_jit_trace_use_var(idx, ssa_op->op2_use, ssa_op->op2_def, ssa_op->op2_use_chain, start, end, f… in zend_jit_trace_allocate_registers()
2855 flags[ssa_op->op2_use] |= ZREG_LAST_USE; in zend_jit_trace_allocate_registers()
2858 start[ssa_op->op2_use] = -1; in zend_jit_trace_allocate_registers()
2859 end[ssa_op->op2_use] = -1; in zend_jit_trace_allocate_registers()
2863 if (ssa_op->result_use >= 0 in zend_jit_trace_allocate_registers()
2864 && ssa_op->result_use != ssa_op->op1_use in zend_jit_trace_allocate_registers()
2865 && ssa_op->result_use != ssa_op->op2_use in zend_jit_trace_allocate_registers()
2866 && start[ssa_op->result_use] >= 0 in zend_jit_trace_allocate_registers()
2867 && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->result_use)) { in zend_jit_trace_allocate_registers()
2869 …zend_jit_trace_use_var(idx, ssa_op->result_use, ssa_op->result_def, ssa_op->res_use_chain, start, … in zend_jit_trace_allocate_registers()
2871 start[ssa_op->result_use] = -1; in zend_jit_trace_allocate_registers()
2872 end[ssa_op->result_use] = -1; in zend_jit_trace_allocate_registers()
2877 if (ssa_op->op1_def >= 0) { in zend_jit_trace_allocate_registers()
2879 SET_STACK_VAR(stack, EX_VAR_TO_NUM(opline->op1.var), ssa_op->op1_def); in zend_jit_trace_allocate_registers()
2881 if (ssa_op->op2_def >= 0) { in zend_jit_trace_allocate_registers()
2883 SET_STACK_VAR(stack, EX_VAR_TO_NUM(opline->op2.var), ssa_op->op2_def); in zend_jit_trace_allocate_registers()
2885 if (ssa_op->result_def >= 0) { in zend_jit_trace_allocate_registers()
2887 SET_STACK_VAR(stack, EX_VAR_TO_NUM(opline->result.var), ssa_op->result_def); in zend_jit_trace_allocate_registers()
2891 if (ssa_op->result_def >= 0 in zend_jit_trace_allocate_registers()
2892 && (ssa->vars[ssa_op->result_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2893 || ssa->vars[ssa_op->result_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2894 && ssa->vars[ssa_op->result_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2895 && zend_jit_var_supports_reg(ssa, ssa_op->result_def)) { in zend_jit_trace_allocate_registers()
2896 if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD) in zend_jit_trace_allocate_registers()
2906 if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_DOUBLE) in zend_jit_trace_allocate_registers()
2908 start[ssa_op->result_def] = idx; in zend_jit_trace_allocate_registers()
2909 vars_op_array[ssa_op->result_def] = op_array; in zend_jit_trace_allocate_registers()
2914 if (ssa_op->op1_def >= 0 in zend_jit_trace_allocate_registers()
2915 && (ssa->vars[ssa_op->op1_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2916 || ssa->vars[ssa_op->op1_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2917 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2918 && zend_jit_var_supports_reg(ssa, ssa_op->op1_def)) { in zend_jit_trace_allocate_registers()
2919 start[ssa_op->op1_def] = idx; in zend_jit_trace_allocate_registers()
2920 vars_op_array[ssa_op->op1_def] = op_array; in zend_jit_trace_allocate_registers()
2923 if (ssa_op->op2_def >= 0 in zend_jit_trace_allocate_registers()
2924 && (ssa->vars[ssa_op->op2_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2925 || ssa->vars[ssa_op->op2_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2926 && ssa->vars[ssa_op->op2_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2927 && zend_jit_var_supports_reg(ssa, ssa_op->op2_def)) { in zend_jit_trace_allocate_registers()
2928 start[ssa_op->op2_def] = idx; in zend_jit_trace_allocate_registers()
2929 vars_op_array[ssa_op->op2_def] = op_array; in zend_jit_trace_allocate_registers()
2945 ssa_op++; in zend_jit_trace_allocate_registers()
2947 if (ssa_op->op1_use >= 0 in zend_jit_trace_allocate_registers()
2948 && start[ssa_op->op1_use] >= 0 in zend_jit_trace_allocate_registers()
2949 && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)) { in zend_jit_trace_allocate_registers()
2951 …zend_jit_trace_use_var(idx, ssa_op->op1_use, ssa_op->op1_def, ssa_op->op1_use_chain, start, end, f… in zend_jit_trace_allocate_registers()
2953 flags[ssa_op->op1_use] |= ZREG_LAST_USE; in zend_jit_trace_allocate_registers()
2956 start[ssa_op->op1_use] = -1; in zend_jit_trace_allocate_registers()
2957 end[ssa_op->op1_use] = -1; in zend_jit_trace_allocate_registers()
2961 if (ssa_op->op1_def >= 0) { in zend_jit_trace_allocate_registers()
2963 SET_STACK_VAR(stack, EX_VAR_TO_NUM(opline->op1.var), ssa_op->op1_def); in zend_jit_trace_allocate_registers()
2965 && (ssa->vars[ssa_op->op1_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2966 || ssa->vars[ssa_op->op1_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2967 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2968 && zend_jit_var_supports_reg(ssa, ssa_op->op1_def)) { in zend_jit_trace_allocate_registers()
2969 start[ssa_op->op1_def] = idx; in zend_jit_trace_allocate_registers()
2970 vars_op_array[ssa_op->op1_def] = op_array; in zend_jit_trace_allocate_registers()
2974 ssa_op++; in zend_jit_trace_allocate_registers()
2979 ssa_op++; in zend_jit_trace_allocate_registers()
2984 if (ssa_op->result_def >= 0) { in zend_jit_trace_allocate_registers()
2986 SET_STACK_VAR(stack, EX_VAR_TO_NUM(opline->result.var), ssa_op->result_def); in zend_jit_trace_allocate_registers()
2988 ssa_op++; in zend_jit_trace_allocate_registers()
2994 ssa_op++; in zend_jit_trace_allocate_registers()
2999 if (ssa_op->op1_def >= 0) { in zend_jit_trace_allocate_registers()
3001 SET_STACK_VAR(stack, EX_VAR_TO_NUM(opline->op1.var), ssa_op->op1_def); in zend_jit_trace_allocate_registers()
3003 ssa_op++; in zend_jit_trace_allocate_registers()
3009 ssa_op += len; in zend_jit_trace_allocate_registers()
3446 …k(zend_jit_trace_stack *stack, const zend_op *opline, const zend_ssa_op *ssa_op, const zend_ssa *s… in zend_jit_trace_clenup_stack() argument
3448 uint32_t line = ssa_op - ssa->ops; in zend_jit_trace_clenup_stack()
3450 if (ssa_op->op1_use >= 0 in zend_jit_trace_clenup_stack()
3451 && ra[ssa_op->op1_use] in zend_jit_trace_clenup_stack()
3452 && ra[ssa_op->op1_use]->range.end == line) { in zend_jit_trace_clenup_stack()
3455 if (ssa_op->op2_use >= 0 in zend_jit_trace_clenup_stack()
3456 && ra[ssa_op->op2_use] in zend_jit_trace_clenup_stack()
3457 && ra[ssa_op->op2_use]->range.end == line) { in zend_jit_trace_clenup_stack()
3460 if (ssa_op->result_use >= 0 in zend_jit_trace_clenup_stack()
3461 && ra[ssa_op->result_use] in zend_jit_trace_clenup_stack()
3462 && ra[ssa_op->result_use]->range.end == line) { in zend_jit_trace_clenup_stack()
3483 …nst zend_op_array *op_array, zend_ssa *ssa, const zend_op **ssa_opcodes, const zend_ssa_op *ssa_op) in zend_jit_may_delay_fetch_this() argument
3485 int var = ssa_op->result_def; in zend_jit_may_delay_fetch_this()
3729 static void zend_jit_trace_update_condition_ranges(const zend_op *opline, const zend_ssa_op *ssa_op in zend_jit_trace_update_condition_ranges() argument
3751 if (ssa_op->op1_use >= 0) { in zend_jit_trace_update_condition_ranges()
3753 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3757 if (ssa_op->op2_use >= 0) { in zend_jit_trace_update_condition_ranges()
3759 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3768 if (ssa_op->op1_use >= 0) { in zend_jit_trace_update_condition_ranges()
3770 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3774 if (ssa_op->op2_use >= 0) { in zend_jit_trace_update_condition_ranges()
3776 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3785 if (ssa_op->op1_use >= 0) { in zend_jit_trace_update_condition_ranges()
3787 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3791 if (ssa_op->op2_use >= 0) { in zend_jit_trace_update_condition_ranges()
3793 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3799 if (ssa_op->op1_use >= 0) { in zend_jit_trace_update_condition_ranges()
3801 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3805 if (ssa_op->op2_use >= 0) { in zend_jit_trace_update_condition_ranges()
3807 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3816 if (ssa_op->op1_use >= 0) { in zend_jit_trace_update_condition_ranges()
3818 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3822 if (ssa_op->op2_use >= 0) { in zend_jit_trace_update_condition_ranges()
3824 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3830 if (ssa_op->op1_use >= 0) { in zend_jit_trace_update_condition_ranges()
3832 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3836 if (ssa_op->op2_use >= 0) { in zend_jit_trace_update_condition_ranges()
3838 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3847 static bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_ssa_op *ssa_op, const ze… in zend_jit_may_skip_comparison() argument
3854 if (ssa_op->op2_use >= 0) { in zend_jit_may_skip_comparison()
3855 if ((ssa_op-1)->op1_def == ssa_op->op2_use) { in zend_jit_may_skip_comparison()
3856 ssa_op--; in zend_jit_may_skip_comparison()
3857 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3865 } else if ((ssa_op-1)->result_def == ssa_op->op2_use) { in zend_jit_may_skip_comparison()
3866 ssa_op--; in zend_jit_may_skip_comparison()
3867 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3879 if (ssa_op->op1_use >= 0) { in zend_jit_may_skip_comparison()
3880 if ((ssa_op-1)->op1_def == ssa_op->op1_use) { in zend_jit_may_skip_comparison()
3881 ssa_op--; in zend_jit_may_skip_comparison()
3882 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3890 } else if ((ssa_op-1)->result_def == ssa_op->op1_use) { in zend_jit_may_skip_comparison()
3891 ssa_op--; in zend_jit_may_skip_comparison()
3892 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3902 const zend_ssa_op *prev_ssa_op = ssa_op - 1; in zend_jit_may_skip_comparison()
3913 if (ssa_op->op1_use == prev_ssa_op->op1_use in zend_jit_may_skip_comparison()
3914 && ssa_op->op2_use == prev_ssa_op->op2_use) { in zend_jit_may_skip_comparison()
3923 if (ssa_op->op1_use < 0) { in zend_jit_may_skip_comparison()
3928 if (ssa_op->op2_use < 0) { in zend_jit_may_skip_comparison()
4004 const zend_ssa_op *ssa_op, *orig_ssa_op; in zend_jit_trace() local
4276 ssa_op = (JIT_G(opt_level) >= ZEND_JIT_LEVEL_INLINE) ? ssa->ops : NULL; in zend_jit_trace()
4367 … (op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit_trace()
4368 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4373 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4375 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4381 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4420 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4438 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4441 if (ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
4442 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
4453 !ssa->var_info[ssa_op->op2_use].guarded_reference, 1)) { in zend_jit_trace()
4456 if (ssa->vars[ssa_op->op2_use].alias == NO_ALIAS) { in zend_jit_trace()
4457 ssa->var_info[ssa_op->op2_use].guarded_reference = 1; in zend_jit_trace()
4499 …) && (res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit_trace()
4500 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4507 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4534 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4558 … (op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit_trace()
4559 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4565 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4567 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4591 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4601 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4605 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4606 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4619 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { in zend_jit_trace()
4643 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
4644 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
4656 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4664 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4668 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4669 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4678 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
4679 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
4688 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
4689 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
4697 if (!zend_jit_incdec_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
4734 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
4735 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
4747 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4755 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4759 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4760 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4769 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
4770 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
4779 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
4780 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
4790 if (!zend_jit_assign_obj_op(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
4814 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
4815 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
4827 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4835 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4839 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4840 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4849 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
4850 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
4859 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
4860 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
4870 if (!zend_jit_assign_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
4874 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4878 && (ssa_op+1)->op1_def >= 0 in zend_jit_trace()
4879 && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4880 …ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_… in zend_jit_trace()
4897 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4907 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4911 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4912 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4923 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { in zend_jit_trace()
4927 && (ssa_op+1)->op1_def >= 0 in zend_jit_trace()
4928 && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4929 …ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_… in zend_jit_trace()
4939 … if (ssa_op->op2_def < 0 || (Z_MODE(op2_addr) == IS_REG && ssa->vars[ssa_op->op2_def].no_val)) { in zend_jit_trace()
4969 !ssa->var_info[ssa_op->op1_use].guarded_reference, 0)) { in zend_jit_trace()
4973 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4974 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5022 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { in zend_jit_trace()
5025 if (ssa_op->op2_def > 0 in zend_jit_trace()
5027 && ssa->vars[ssa_op->op2_def].no_val) { in zend_jit_trace()
5032 && ssa->vars[ssa_op->op2_def].use_chain < 0 in zend_jit_trace()
5033 && !ssa->vars[ssa_op->op2_def].phi_use_chain) { in zend_jit_trace()
5041 && ssa_op->op2_def >= 0 in zend_jit_trace()
5042 && ssa->vars[ssa_op->op2_def].alias == NO_ALIAS) { in zend_jit_trace()
5043 …ssa->var_info[ssa_op->op2_def].guarded_reference = ssa->var_info[ssa_op->op2_use].guarded_referenc… in zend_jit_trace()
5053 … if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) { in zend_jit_trace()
5076 if (ssa_op->op1_def > 0 in zend_jit_trace()
5078 && ssa->vars[ssa_op->op1_def].no_val) { in zend_jit_trace()
5083 && ssa->vars[ssa_op->op1_def].use_chain < 0 in zend_jit_trace()
5084 && !ssa->vars[ssa_op->op1_def].phi_use_chain) { in zend_jit_trace()
5092 && ssa_op->op1_def >= 0 in zend_jit_trace()
5093 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5094 …ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_referenc… in zend_jit_trace()
5101 …? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->call_level… in zend_jit_trace()
5143 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5144 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5162 … if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) { in zend_jit_trace()
5173 if (ssa_op->op1_def > 0 in zend_jit_trace()
5175 && ssa->vars[ssa_op->op1_def].no_val) { in zend_jit_trace()
5180 && ssa->vars[ssa_op->op1_def].use_chain < 0 in zend_jit_trace()
5181 && !ssa->vars[ssa_op->op1_def].phi_use_chain) { in zend_jit_trace()
5189 && ssa_op->op1_def >= 0 in zend_jit_trace()
5190 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5191 …ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_referenc… in zend_jit_trace()
5248 ssa_op != ssa->ops && in zend_jit_trace()
5251 zend_jit_may_skip_comparison(opline, ssa_op, ssa, ssa_opcodes, op_array); in zend_jit_trace()
5260 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5272 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5276 zend_jit_trace_update_condition_ranges(opline, ssa_op, op_array, ssa, exit_if_true); in zend_jit_trace()
5284 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5296 ssa_op != ssa->ops && in zend_jit_trace()
5299 zend_jit_may_skip_comparison(opline, ssa_op, ssa, ssa_opcodes, op_array); in zend_jit_trace()
5308 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5323 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5327 zend_jit_trace_update_condition_ranges(opline, ssa_op, op_array, ssa, exit_if_true); in zend_jit_trace()
5335 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5373 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5402 …if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array… in zend_jit_trace()
5471 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5513 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5549 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5564 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5568 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5569 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5640 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5644 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5645 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5646 if (ssa_op->op1_def >= 0) { in zend_jit_trace()
5647 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5657 ssa_op->op1_use >= 0 && in zend_jit_trace()
5658 ssa->var_info[ssa_op->op1_use].avoid_refcounting; in zend_jit_trace()
5660 ssa->var_info[ssa_op->op1_use].type &= ~MAY_BE_PACKED_GUARD; in zend_jit_trace()
5670 … ssa->var_info[ssa_op->op1_use].type &= ~(MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE_ARRAY_STRING_HASH); in zend_jit_trace()
5675 ssa->var_info[ssa_op->op1_use].type &= ~MAY_BE_ARRAY_PACKED; in zend_jit_trace()
5679 if (!zend_jit_fetch_dim_read(&dasm_state, opline, ssa, ssa_op, in zend_jit_trace()
5684 if (ssa_op->op1_def >= 0 && op1_type != IS_UNKNOWN) { in zend_jit_trace()
5685 ssa->var_info[ssa_op->op1_def].type = ssa->var_info[ssa_op->op1_use].type; in zend_jit_trace()
5703 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
5713 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5717 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5718 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5730 if (ssa_op->result_def > 0 in zend_jit_trace()
5734 ssa->var_info[ssa_op->result_def].indirect_reference = 1; in zend_jit_trace()
5747 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5751 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5752 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5765 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5767 if (ssa_op->op1_use >= 0 in zend_jit_trace()
5768 && ssa->var_info[ssa_op->op1_use].avoid_refcounting) { in zend_jit_trace()
5789 ssa_op->op1_use >= 0 && in zend_jit_trace()
5790 ssa->var_info[ssa_op->op1_use].avoid_refcounting; in zend_jit_trace()
5792 ssa->var_info[ssa_op->op1_use].type &= ~MAY_BE_PACKED_GUARD; in zend_jit_trace()
5808 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info), in zend_jit_trace()
5853 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
5861 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5865 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5866 … ssa->var_info[ssa_op->op1_def >= 0 ? ssa_op->op1_def : ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5875 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
5876 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
5883 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
5884 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
5885 avoid_refcounting = ssa->var_info[ssa_op->op1_use].avoid_refcounting; in zend_jit_trace()
5889 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
5890 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
5898 if (!zend_jit_fetch_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
5901 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, MAY_BE_STRING))) { in zend_jit_trace()
5907 orig_ssa_op = ssa_op; in zend_jit_trace()
5914 if (ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5915 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5922 ssa_op++; in zend_jit_trace()
5928 ssa_op = orig_ssa_op; in zend_jit_trace()
5937 orig_ssa_op = ssa_op; in zend_jit_trace()
5941 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
5946 ssa_op++; in zend_jit_trace()
5952 ssa_op = orig_ssa_op; in zend_jit_trace()
5958 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
5977 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5981 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5982 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5999 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
6003 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
6004 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
6012 …tate, opline, op1_info, op1_addr, RES_REG_ADDR(), zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
6018 if (ssa_op->result_def >= 0 && opline->result_type != IS_CV) { in zend_jit_trace()
6019 if (zend_jit_may_delay_fetch_this(op_array, ssa, ssa_opcodes, ssa_op)) { in zend_jit_trace()
6020 ssa->var_info[ssa_op->result_def].delayed_fetch_this = 1; in zend_jit_trace()
6102 if (!zend_jit_fetch_constant(&dasm_state, opline, op_array, ssa, ssa_op, RES_REG_ADDR())) { in zend_jit_trace()
6129 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
6133 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
6134 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
6140 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
6141 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
6148 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
6149 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
6153 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
6154 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
6165 op_array, ssa, ssa_op, frame->call_level, in zend_jit_trace()
6178 …? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->call_level… in zend_jit_trace()
6184 …if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array… in zend_jit_trace()
6198 …if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array… in zend_jit_trace()
6210 …if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array… in zend_jit_trace()
6257 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info), p + 1)) { in zend_jit_trace()
6274 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
6295 if (ssa_op) { in zend_jit_trace()
6299 if (ssa_op->result_def >= 0) { in zend_jit_trace()
6306 } else if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD) in zend_jit_trace()
6307 && has_concrete_type(ssa->var_info[ssa_op->result_def].type)) { in zend_jit_trace()
6308 type = concrete_type(ssa->var_info[ssa_op->result_def].type); in zend_jit_trace()
6316 && ssa_op->op1_use >= 0 in zend_jit_trace()
6318 && (ssa->var_info[ssa_op->op1_use].type & MAY_BE_REF) == 0) { in zend_jit_trace()
6337 (gen_handler || type == IS_UNKNOWN || !ra || !ra[ssa_op->result_def])); in zend_jit_trace()
6338 if (ssa->var_info[ssa_op->result_def].type & MAY_BE_INDIRECT) { in zend_jit_trace()
6342 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6346 } else if (ssa->var_info[ssa_op->result_def].avoid_refcounting) { in zend_jit_trace()
6348 } else if (ra && ra[ssa_op->result_def]) { in zend_jit_trace()
6349 SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->result.var), ra[ssa_op->result_def]->reg, in zend_jit_trace()
6350 ra[ssa_op->result_def]->flags & ZREG_STORE); in zend_jit_trace()
6356 …rence_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->result_def, &… in zend_jit_trace()
6357 ssa->var_info[ssa_op->result_def].range.min = tmp.min; in zend_jit_trace()
6358 ssa->var_info[ssa_op->result_def].range.max = tmp.max; in zend_jit_trace()
6359 ssa->var_info[ssa_op->result_def].range.underflow = 0; in zend_jit_trace()
6360 ssa->var_info[ssa_op->result_def].range.overflow = 0; in zend_jit_trace()
6361 ssa->var_info[ssa_op->result_def].has_range = 1; in zend_jit_trace()
6364 if (ssa_op->op1_def >= 0 in zend_jit_trace()
6370 if (!(ssa->var_info[ssa_op->op1_def].type & MAY_BE_GUARD) in zend_jit_trace()
6371 && has_concrete_type(ssa->var_info[ssa_op->op1_def].type)) { in zend_jit_trace()
6372 type = concrete_type(ssa->var_info[ssa_op->op1_def].type); in zend_jit_trace()
6393 (!ra[ssa_op->op1_def] && in zend_jit_trace()
6394 !(ssa->vars[ssa_op->op1_def].no_val && in zend_jit_trace()
6403 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6404 if (ra && ra[ssa_op->op1_def]) { in zend_jit_trace()
6405 uint8_t flags = ra[ssa_op->op1_def]->flags & ZREG_STORE; in zend_jit_trace()
6407 if (ssa_op->op1_use >= 0) { in zend_jit_trace()
6415 if (!ra[ssa_op->op1_use]) { in zend_jit_trace()
6420 SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op1.var), ra[ssa_op->op1_def]->reg, flags); in zend_jit_trace()
6424 …rence_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->op1_def, &tmp… in zend_jit_trace()
6425 ssa->var_info[ssa_op->op1_def].range.min = tmp.min; in zend_jit_trace()
6426 ssa->var_info[ssa_op->op1_def].range.max = tmp.max; in zend_jit_trace()
6427 ssa->var_info[ssa_op->op1_def].range.underflow = 0; in zend_jit_trace()
6428 ssa->var_info[ssa_op->op1_def].range.overflow = 0; in zend_jit_trace()
6429 ssa->var_info[ssa_op->op1_def].has_range = 1; in zend_jit_trace()
6432 if (ssa_op->op2_def >= 0 in zend_jit_trace()
6438 if (!(ssa->var_info[ssa_op->op2_def].type & MAY_BE_GUARD) in zend_jit_trace()
6439 && has_concrete_type(ssa->var_info[ssa_op->op2_def].type)) { in zend_jit_trace()
6440 type = concrete_type(ssa->var_info[ssa_op->op2_def].type); in zend_jit_trace()
6447 (!ra[ssa_op->op2_def] && in zend_jit_trace()
6448 !(ssa->vars[ssa_op->op2_def].no_val && in zend_jit_trace()
6452 ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6453 if (ra && ra[ssa_op->op2_def]) { in zend_jit_trace()
6454 uint8_t flags = ra[ssa_op->op2_def]->flags & ZREG_STORE; in zend_jit_trace()
6456 if (ssa_op->op2_use >= 0) { in zend_jit_trace()
6458 if (!ra[ssa_op->op2_use] in zend_jit_trace()
6459 || ra[ssa_op->op2_use]->reg != ra[ssa_op->op2_def]->reg) { in zend_jit_trace()
6464 SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op2.var), ra[ssa_op->op2_def]->reg, flags); in zend_jit_trace()
6468 …rence_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->op2_def, &tmp… in zend_jit_trace()
6469 ssa->var_info[ssa_op->op2_def].range.min = tmp.min; in zend_jit_trace()
6470 ssa->var_info[ssa_op->op2_def].range.max = tmp.max; in zend_jit_trace()
6471 ssa->var_info[ssa_op->op2_def].range.underflow = 0; in zend_jit_trace()
6472 ssa->var_info[ssa_op->op2_def].range.overflow = 0; in zend_jit_trace()
6473 ssa->var_info[ssa_op->op2_def].has_range = 1; in zend_jit_trace()
6487 ssa_op++; in zend_jit_trace()
6489 if (ssa_op->op1_def >= 0) { in zend_jit_trace()
6492 if (!(ssa->var_info[ssa_op->op1_def].type & MAY_BE_GUARD) in zend_jit_trace()
6493 && has_concrete_type(ssa->var_info[ssa_op->op1_def].type)) { in zend_jit_trace()
6494 type = concrete_type(ssa->var_info[ssa_op->op1_def].type); in zend_jit_trace()
6502 (gen_handler || type == IS_UNKNOWN || !ra || !ra[ssa_op->op1_def])); in zend_jit_trace()
6504 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6505 if (ra && ra[ssa_op->op1_def]) { in zend_jit_trace()
6506 SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op1.var), ra[ssa_op->op1_def]->reg, in zend_jit_trace()
6507 ra[ssa_op->op1_def]->flags & ZREG_STORE); in zend_jit_trace()
6511 …rence_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->op1_def, &tmp… in zend_jit_trace()
6512 ssa->var_info[ssa_op->op1_def].range.min = tmp.min; in zend_jit_trace()
6513 ssa->var_info[ssa_op->op1_def].range.max = tmp.max; in zend_jit_trace()
6514 ssa->var_info[ssa_op->op1_def].range.underflow = 0; in zend_jit_trace()
6515 ssa->var_info[ssa_op->op1_def].range.overflow = 0; in zend_jit_trace()
6516 ssa->var_info[ssa_op->op1_def].has_range = 1; in zend_jit_trace()
6519 ssa_op++; in zend_jit_trace()
6522 ssa_op++; in zend_jit_trace()
6525 if (ssa_op->result_def >= 0) { in zend_jit_trace()
6528 if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD) in zend_jit_trace()
6529 && has_concrete_type(ssa->var_info[ssa_op->result_def].type)) { in zend_jit_trace()
6530 type = concrete_type(ssa->var_info[ssa_op->result_def].type); in zend_jit_trace()
6533 (gen_handler || !ra || !ra[ssa_op->result_def])); in zend_jit_trace()
6534 if (ra && ra[ssa_op->result_def]) { in zend_jit_trace()
6535 SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->result.var), ra[ssa_op->result_def]->reg, in zend_jit_trace()
6536 ra[ssa_op->result_def]->flags & ZREG_STORE); in zend_jit_trace()
6539 ssa_op++; in zend_jit_trace()
6544 ssa_op++; in zend_jit_trace()
6547 if (ssa_op->op1_def >= 0) { in zend_jit_trace()
6550 if (!(ssa->var_info[ssa_op->op1_def].type & MAY_BE_GUARD) in zend_jit_trace()
6551 && has_concrete_type(ssa->var_info[ssa_op->op1_def].type)) { in zend_jit_trace()
6552 type = concrete_type(ssa->var_info[ssa_op->op1_def].type); in zend_jit_trace()
6555 (gen_handler || !ra || !ra[ssa_op->op1_def])); in zend_jit_trace()
6556 if (ra && ra[ssa_op->op1_def]) { in zend_jit_trace()
6557 SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op1.var), ra[ssa_op->op1_def]->reg, in zend_jit_trace()
6558 ra[ssa_op->op1_def]->flags & ZREG_STORE); in zend_jit_trace()
6561 ssa_op++; in zend_jit_trace()
6566 ssa_op += zend_jit_trace_op_len(opline); in zend_jit_trace()
6571 ssa_op++; in zend_jit_trace()