https://gcc.gnu.org/g:3ec0b7cd7ce7b64b58cb0ee52fb95fb0875c805c
commit r15-5492-g3ec0b7cd7ce7b64b58cb0ee52fb95fb0875c805c Author: Andre Vieira <andre.simoesdiasvie...@arm.com> Date: Wed Nov 20 09:23:50 2024 +0000 arm, mve: Fix arm_mve_dlstp_check_dec_counter's use of single_pred Call 'single_pred_p' before 'single_pred' to verify it is safe to do so. gcc/ChangeLog: * config/arm/arm.cc (arm_mve_dlstp_check_dec_counter): Call single_pred_p to verify it's safe to call single_pred. gcc/testsuite/ChangeLog: * gcc.target/arm/mve/dlstp-loop-form.c: Add loop that triggered ICE. Diff: --- gcc/config/arm/arm.cc | 5 +++-- gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc index 17d762be527f..fd7b4dc14beb 100644 --- a/gcc/config/arm/arm.cc +++ b/gcc/config/arm/arm.cc @@ -35379,9 +35379,10 @@ arm_mve_dlstp_check_dec_counter (loop *loop, rtx_insn* vctp_insn, return NULL; else if (REG_P (condconst)) { - basic_block pre_loop_bb = single_pred (loop_preheader_edge (loop)->src); - if (!pre_loop_bb) + basic_block preheader_b = loop_preheader_edge (loop)->src; + if (!single_pred_p (preheader_b)) return NULL; + basic_block pre_loop_bb = single_pred (preheader_b); rtx initial_compare = NULL_RTX; if (!(prev_nonnote_nondebug_insn_bb (BB_END (pre_loop_bb)) diff --git a/gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c b/gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c index a1b26873d790..08811cef5687 100644 --- a/gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c +++ b/gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c @@ -25,3 +25,15 @@ void n() { } } +int a; +void g2() { + long b; + while (a) { + char *c; + for (long d = b; d > 0; d -= 4) { + mve_pred16_t e = vctp32q(d); + int32x4_t f; + vstrbq_p_s32(c, f, e); + } + } +}