From 86456574bb030bbe24adcb368ff735eebdbededd Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 2 Nov 2022 14:04:43 +0000 Subject: [PATCH] Fix performance degradation introduced in c2547ab7dc67646e287d430e44798cb9f327cf21 After discussing with someone, our current running theory is that the local variable forces the compiler to reserve an additional register for the whole lifespan of the function. Dropping it and just loading the value should restore the previous code generation. Closes GH-9876 --- Zend/zend_hash.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index aa770141cd2..9498bd3718c 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -658,15 +658,14 @@ ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosit /* Hash must be known and precomputed before */ static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, const zend_string *key) { - zend_ulong key_hash = ZSTR_H(key); uint32_t nIndex; uint32_t idx; Bucket *p, *arData; - ZEND_ASSERT(key_hash != 0 && "Hash must be known"); + ZEND_ASSERT(ZSTR_H(key) != 0 && "Hash must be known"); arData = ht->arData; - nIndex = key_hash | ht->nTableMask; + nIndex = ZSTR_H(key) | ht->nTableMask; idx = HT_HASH_EX(arData, nIndex); if (UNEXPECTED(idx == HT_INVALID_IDX)) { @@ -678,7 +677,7 @@ static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, con } while (1) { - if (p->h == key_hash && + if (p->h == ZSTR_H(key) && EXPECTED(p->key) && zend_string_equal_content(p->key, key)) { return p;