[php-src] PR #24084: JIT: Optimize array checks in comparisons
| From: | ndossche | Date: | Fri, 02 Oct 2026 19:15:30 +0000 |
| Subject: | [php-src] PR #24084: JIT: Optimize array checks in comparisons | ||
| Groups: | php.git-pulls | ||
| Request: | Send a blank email to git-pulls+get-39091@lists.php.net to get a copy of this message | ||
Pull Request: https://github.com/php/php-src/pull/24084
Author: ndossche
There are two optimizations:
1. This patch implements the JIT counterpart of the VM change 2d6b8694 to optimize comparisons
against empty arrays.
2. This patch ensures that if a type can be array, the element count check happens inline rather
than going to a slow path.
PHP demo code for #1:
```php
function f(array $a) {
if ($a) return 0;
return 1;
}
```
Before #1 (for func JIT in this case):
```asm
.L1:
movq $0x418d88c0, (%r14) ; EX(opline) = opline
leaq 0x50(%r14), %rdi ; arg = &CV0($a)
movabsq $zend_is_true, %rax
callq *%rax
testb %al, %al
je .L2
```
After #1:
```asm
.L1:
movq 0x50(%r14), %rax ; Z_ARRVAL($a)
cmpl $0, 0x1c(%rax) ; compare nNumOfElements
je .L2
```
PHP demo code for #2:
```php
function is_empty(array $a) {
if ($a === []) return 1;
return 2;
}
```
Before #2:
```asm
.L1:
leaq 0x50(%r14), %rdi ; arg1 = &CV0($a)
movl $0x418d8ad8, %esi ; arg2 = &literal []
movabsq $zend_is_identical, %rax
callq *%rax
testb %al, %al
je .L2
```
After #2:
```asm
.L1:
movq 0x50(%r14), %rax ; Z_ARRVAL($a)
cmpl $0, 0x1c(%rax) ; ->nNumOfElements
jne .L2
```
It ain't much, but it should help.
I think many small frontend improvements can make a nice change in total together.