From 2a69208b43bac3353e1d91ded6be10c2a1a8dc02 Mon Sep 17 00:00:00 2001 From: Ping Zhao Date: Fri, 6 May 2022 21:25:04 -0400 Subject: [PATCH 1/2] Fix the BOLT problem with GCC10 BOLT requires adding GCC option "-fno-reorder-blocks-and-partition". In some codes, it will be omitted because "GCC push_options". This patch is to handle this case correctly. --- Zend/zend_vm_execute.h | 1 + Zend/zend_vm_execute.skl | 1 + ext/hash/xxhash/xxhash.h | 1 + ext/standard/crc32.c | 1 + 4 files changed, 4 insertions(+) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1b27785470062..879acd27f9a51 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -52134,6 +52134,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDL # pragma GCC push_options # pragma GCC optimize("no-gcse") # pragma GCC optimize("no-ivopts") +# pragma GCC optimize("no-reorder-blocks-and-partition") #endif ZEND_API void execute_ex(zend_execute_data *ex) { diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index 582ec490e2d77..9005af989ef49 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -4,6 +4,7 @@ # pragma GCC push_options # pragma GCC optimize("no-gcse") # pragma GCC optimize("no-ivopts") +# pragma GCC optimize("no-reorder-blocks-and-partition") #endif ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex) { diff --git a/ext/hash/xxhash/xxhash.h b/ext/hash/xxhash/xxhash.h index 08ab79457233e..a9753a6c278fa 100644 --- a/ext/hash/xxhash/xxhash.h +++ b/ext/hash/xxhash/xxhash.h @@ -2934,6 +2934,7 @@ enum XXH_VECTOR_TYPE /* fake enum */ { && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ # pragma GCC push_options # pragma GCC optimize("-O2") +# pragma GCC optimize("no-reorder-blocks-and-partition") #endif diff --git a/ext/standard/crc32.c b/ext/standard/crc32.c index d13eee14fbe9d..c698328fb787c 100644 --- a/ext/standard/crc32.c +++ b/ext/standard/crc32.c @@ -62,6 +62,7 @@ static inline int has_crc32_insn() { # if defined(__GNUC__) && !defined(__clang__) # pragma GCC push_options # pragma GCC target ("+nothing+crc") +# pragma GCC optimize("no-reorder-blocks-and-partition") # endif static uint32_t crc32_aarch64(uint32_t crc, const char *p, size_t nr) { while (nr >= sizeof(uint64_t)) { From 69561b2ab9e2db4eb19aae2e3901120764398e3f Mon Sep 17 00:00:00 2001 From: Ping Zhao Date: Mon, 16 Oct 2023 01:36:05 -0700 Subject: [PATCH 2/2] Use -DHAVE_BOLT to enable no-reorder-blocks-and-partition CFLAGS since it's for BOLT only. You can use EXTRA_CFLAGS="-DHAVE_BOLT ..." make -j to enable this. Signed-off-by: Ping Zhao --- Zend/zend_vm_execute.h | 2 ++ Zend/zend_vm_execute.skl | 2 ++ ext/hash/xxhash/xxhash.h | 3 ++- ext/standard/crc32.c | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 879acd27f9a51..76aa55ba32387 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -52134,8 +52134,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDL # pragma GCC push_options # pragma GCC optimize("no-gcse") # pragma GCC optimize("no-ivopts") +#ifdef HAVE_BOLT # pragma GCC optimize("no-reorder-blocks-and-partition") #endif +#endif ZEND_API void execute_ex(zend_execute_data *ex) { DCL_OPLINE diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index 9005af989ef49..4a7a799ae0fe8 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -4,8 +4,10 @@ # pragma GCC push_options # pragma GCC optimize("no-gcse") # pragma GCC optimize("no-ivopts") +#ifdef HAVE_BOLT # pragma GCC optimize("no-reorder-blocks-and-partition") #endif +#endif ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex) { DCL_OPLINE diff --git a/ext/hash/xxhash/xxhash.h b/ext/hash/xxhash/xxhash.h index a9753a6c278fa..eb34e4189dc5b 100644 --- a/ext/hash/xxhash/xxhash.h +++ b/ext/hash/xxhash/xxhash.h @@ -2934,9 +2934,10 @@ enum XXH_VECTOR_TYPE /* fake enum */ { && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ # pragma GCC push_options # pragma GCC optimize("-O2") +#ifdef HAVE_BOLT # pragma GCC optimize("no-reorder-blocks-and-partition") #endif - +#endif #if XXH_VECTOR == XXH_NEON /* diff --git a/ext/standard/crc32.c b/ext/standard/crc32.c index c698328fb787c..d377bfeb73b18 100644 --- a/ext/standard/crc32.c +++ b/ext/standard/crc32.c @@ -62,8 +62,10 @@ static inline int has_crc32_insn() { # if defined(__GNUC__) && !defined(__clang__) # pragma GCC push_options # pragma GCC target ("+nothing+crc") +#ifdef HAVE_BOLT # pragma GCC optimize("no-reorder-blocks-and-partition") # endif +# endif static uint32_t crc32_aarch64(uint32_t crc, const char *p, size_t nr) { while (nr >= sizeof(uint64_t)) { crc = __crc32d(crc, *(uint64_t *)p);