Skip to content

Commit 72cdb0a

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix register allocation on x86
2 parents e1782c0 + 3b6d385 commit 72cdb0a

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6107,6 +6107,7 @@ static int zend_jit_simple_assign(dasm_State **Dst,
61076107
val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0);
61086108
} else {
61096109
zend_jit_addr ref_addr;
6110+
zend_reg type_reg = tmp_reg;
61106111

61116112
if (in_cold) {
61126113
| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, >1
@@ -6115,21 +6116,24 @@ static int zend_jit_simple_assign(dasm_State **Dst,
61156116
|.cold_code
61166117
|1:
61176118
}
6118-
if (Z_REG(val_addr) == ZREG_R2) {
6119-
| mov aword T1, r2 // save
6120-
}
61216119
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
61226120
| GET_ZVAL_PTR r2, val_addr
61236121
| GC_DELREF r2
61246122
| // ZVAL_COPY_VALUE(return_value, &ref->value);
61256123
ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 8);
61266124
if (!res_addr) {
6127-
| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, ZREG_R2, tmp_reg
6125+
| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, type_reg, tmp_reg
61286126
} else {
6129-
| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, ZREG_R2, tmp_reg
6127+
| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, type_reg, tmp_reg
61306128
}
61316129
| je >2
6132-
| IF_NOT_REFCOUNTED dh, >3
6130+
if (tmp_reg == ZREG_R0) {
6131+
| IF_NOT_REFCOUNTED ah, >3
6132+
} else {
6133+
| IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >3
6134+
}
6135+
| GET_ZVAL_PTR Ra(tmp_reg), var_addr
6136+
61336137
if (!res_addr) {
61346138
| GC_ADDREF Ra(tmp_reg)
61356139
} else {
@@ -6138,17 +6142,19 @@ static int zend_jit_simple_assign(dasm_State **Dst,
61386142
| jmp >3
61396143
|2:
61406144
if (res_addr) {
6141-
| IF_NOT_REFCOUNTED dh, >2
6145+
if (tmp_reg == ZREG_R0) {
6146+
| IF_NOT_REFCOUNTED ah, >2
6147+
} else {
6148+
| IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >2
6149+
}
6150+
| GET_ZVAL_PTR Ra(tmp_reg), var_addr
61426151
| GC_ADDREF Ra(tmp_reg)
61436152
|2:
61446153
}
6145-
if (Z_REG(val_addr) == ZREG_R2) {
6146-
| mov r2, aword T1 // restore
6147-
}
61486154
if (save_r1) {
61496155
| mov aword T1, FCARG1a // save
61506156
}
6151-
| EFREE_REFERENCE aword [Ra(Z_REG(val_addr))+Z_OFFSET(val_addr)]
6157+
| EFREE_REFERENCE r2
61526158
if (save_r1) {
61536159
| mov FCARG1a, aword T1 // restore
61546160
}

ext/opcache/tests/jit/assign_049.phpt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--TEST--
2+
JIT ASSIGN: register allocation on x86
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
function &a($i) {
12+
$a = "str". $i;
13+
return $a;
14+
}
15+
16+
class A {
17+
public $a;
18+
public function test() {
19+
$this->a = a(1);
20+
}
21+
}
22+
23+
$a = new A;
24+
$a->test();
25+
$a->test();
26+
?>
27+
DONE
28+
--EXPECT--
29+
DONE

0 commit comments

Comments
 (0)