Skip to content

Commit 3b6d385

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix register allocation on x86
2 parents f9bf5f4 + d8b0337 commit 3b6d385

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
@@ -6112,6 +6112,7 @@ static int zend_jit_simple_assign(dasm_State **Dst,
61126112
val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0);
61136113
} else {
61146114
zend_jit_addr ref_addr;
6115+
zend_reg type_reg = tmp_reg;
61156116

61166117
if (in_cold) {
61176118
| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, >1
@@ -6120,21 +6121,24 @@ static int zend_jit_simple_assign(dasm_State **Dst,
61206121
|.cold_code
61216122
|1:
61226123
}
6123-
if (Z_REG(val_addr) == ZREG_R2) {
6124-
| mov aword T1, r2 // save
6125-
}
61266124
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
61276125
| GET_ZVAL_PTR r2, val_addr
61286126
| GC_DELREF r2
61296127
| // ZVAL_COPY_VALUE(return_value, &ref->value);
61306128
ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 8);
61316129
if (!res_addr) {
6132-
| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, ZREG_R2, tmp_reg
6130+
| ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, type_reg, tmp_reg
61336131
} else {
6134-
| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, ZREG_R2, tmp_reg
6132+
| ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, type_reg, tmp_reg
61356133
}
61366134
| je >2
6137-
| IF_NOT_REFCOUNTED dh, >3
6135+
if (tmp_reg == ZREG_R0) {
6136+
| IF_NOT_REFCOUNTED ah, >3
6137+
} else {
6138+
| IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >3
6139+
}
6140+
| GET_ZVAL_PTR Ra(tmp_reg), var_addr
6141+
61386142
if (!res_addr) {
61396143
| GC_ADDREF Ra(tmp_reg)
61406144
} else {
@@ -6143,17 +6147,19 @@ static int zend_jit_simple_assign(dasm_State **Dst,
61436147
| jmp >3
61446148
|2:
61456149
if (res_addr) {
6146-
| IF_NOT_REFCOUNTED dh, >2
6150+
if (tmp_reg == ZREG_R0) {
6151+
| IF_NOT_REFCOUNTED ah, >2
6152+
} else {
6153+
| IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >2
6154+
}
6155+
| GET_ZVAL_PTR Ra(tmp_reg), var_addr
61476156
| GC_ADDREF Ra(tmp_reg)
61486157
|2:
61496158
}
6150-
if (Z_REG(val_addr) == ZREG_R2) {
6151-
| mov r2, aword T1 // restore
6152-
}
61536159
if (save_r1) {
61546160
| mov aword T1, FCARG1a // save
61556161
}
6156-
| EFREE_REFERENCE aword [Ra(Z_REG(val_addr))+Z_OFFSET(val_addr)]
6162+
| EFREE_REFERENCE r2
61576163
if (save_r1) {
61586164
| mov FCARG1a, aword T1 // restore
61596165
}

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)