Skip to content

Commit

Permalink
Fix #81424: PCRE2 10.35 JIT performance regression
Browse files Browse the repository at this point in the history
We backport the respective upstream fix[1] to our bundled pcre2lib plus
the follow-up fix[2] for a functional regression.

[1] <PCRE2Project/pcre2@dc5f966>
[2] <PCRE2Project/pcre2@e7af7ef>

Closes GH-7573.
  • Loading branch information
cmb69 committed Oct 12, 2021
1 parent fcabe69 commit 788a701
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ PHP NEWS
- MySQLi:
. Fixed bug #81494 (Stopped unbuffered query does not throw error). (Nikita)

- PCRE:
. Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb)

- Streams:
. Fixed bug #54340 (Memory corruption with user_filter). (Nikita)

Expand Down
11 changes: 7 additions & 4 deletions ext/pcre/pcre2lib/pcre2_jit_compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -1249,10 +1249,13 @@ SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA);
SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0);
SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX);

next_alt = cc + GET(cc, 1);
if (*next_alt == OP_ALT)
fast_forward_allowed = FALSE;

do
{
count = start;
next_alt = cc + GET(cc, 1);
cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0);

while (TRUE)
Expand Down Expand Up @@ -1521,7 +1524,7 @@ do
{
count++;

if (fast_forward_allowed && *next_alt == OP_KET)
if (fast_forward_allowed)
{
common->fast_forward_bc_ptr = accelerated_start;
common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;
Expand Down Expand Up @@ -1569,8 +1572,8 @@ do
else if (result < count)
result = count;

fast_forward_allowed = FALSE;
cc = next_alt;
next_alt = cc + GET(cc, 1);
}
while (*cc == OP_ALT);

Expand Down Expand Up @@ -11152,7 +11155,7 @@ early_fail_type = (early_fail_ptr & 0x7);
early_fail_ptr >>= 3;

/* During recursion, these optimizations are disabled. */
if (common->early_fail_start_ptr == 0)
if (common->early_fail_start_ptr == 0 && common->fast_forward_bc_ptr == NULL)
{
early_fail_ptr = 0;
early_fail_type = type_skip;
Expand Down
18 changes: 18 additions & 0 deletions ext/pcre/tests/bug81424a.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--TEST--
Bug #81424 (PCRE2 10.35 JIT performance regression)
--DESCRIPTION--
We're testing against the functional regression which has been introduced by
fixing the performance regression.
--FILE--
<?php
var_dump(
preg_match('/(?P<size>\d+)m|M/', "4M", $m),
$m
);
?>
--EXPECT--
int(1)
array(1) {
[0]=>
string(1) "M"
}

0 comments on commit 788a701

Please sign in to comment.