https://gcc.gnu.org/g:162a1ed70303a031c81b0aaac499aaf394560390
commit r15-2718-g162a1ed70303a031c81b0aaac499aaf394560390 Author: Richard Sandiford <richard.sandif...@arm.com> Date: Mon Aug 5 10:02:45 2024 +0100 Revert "Make may_trap_p_1 return false for constant pool references [PR116145]" [PR116200] This reverts commit ba730fd10934e4ca004251aa3748bf9da4d35e62. Diff: --- gcc/rtlanal.cc | 14 ++----- .../gcc.target/aarch64/sve/acle/general/pr116145.c | 46 ---------------------- 2 files changed, 4 insertions(+), 56 deletions(-) diff --git a/gcc/rtlanal.cc b/gcc/rtlanal.cc index 893a6afbbc53..4158a531bdd7 100644 --- a/gcc/rtlanal.cc +++ b/gcc/rtlanal.cc @@ -3152,16 +3152,10 @@ may_trap_p_1 (const_rtx x, unsigned flags) && MEM_VOLATILE_P (x) && XEXP (x, 0) == stack_pointer_rtx) return true; - if (/* MEM_READONLY_P means that the memory is both statically - allocated and readonly, so MEM_NOTRAP_P should remain true - even if the memory reference is moved. This is certainly - true for the important case of force_const_mem. - - Otherwise, MEM_NOTRAP_P only relates to the actual position - of the memory reference; moving it out of context such as - when moving code when optimizing, might cause its address - to become invalid. */ - (code_changed && !MEM_READONLY_P (x)) + if (/* MEM_NOTRAP_P only relates to the actual position of the memory + reference; moving it out of context such as when moving code + when optimizing, might cause its address to become invalid. */ + code_changed || !MEM_NOTRAP_P (x)) { poly_int64 size = MEM_SIZE_KNOWN_P (x) ? MEM_SIZE (x) : -1; diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr116145.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr116145.c deleted file mode 100644 index a3d93d3e1c84..000000000000 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr116145.c +++ /dev/null @@ -1,46 +0,0 @@ -// { dg-options "-O2" } - -#include <stdlib.h> -#include <arm_sve.h> - -#pragma GCC target "+sve2" - -typedef unsigned char uchar; - -const uchar * -search_line_fast (const uchar *s, const uchar *end) -{ - size_t VL = svcntb(); - svuint8_t arr1, arr2; - svbool_t pc, pg = svptrue_b8(); - - // This should not be loaded inside the loop every time. - arr2 = svreinterpret_u8(svdup_u32(0x0a0d5c3f)); - - for (; s+VL <= end; s += VL) { - arr1 = svld1_u8(pg, s); - pc = svmatch_u8(pg, arr1, arr2); - - if (svptest_any(pg, pc)) { - pc = svbrkb_z(pg, pc); - return s+svcntp_b8(pg, pc); - } - } - - // Handle remainder. - if (s < end) { - pg = svwhilelt_b8((size_t)s, (size_t)end); - - arr1 = svld1_u8(pg, s); - pc = svmatch_u8(pg, arr1, arr2); - - if (svptest_any(pg, pc)) { - pc = svbrkb_z(pg, pc); - return s+svcntp_b8(pg, pc); - } - } - - return end; -} - -// { dg-final { scan-assembler {:\n\tld1b\t[^\n]*\n\tmatch\t[^\n]*\n\tb\.} } }