https://gcc.gnu.org/g:925aa834e2bdc8a562601628a3d4fe16f5c6b94c

commit 925aa834e2bdc8a562601628a3d4fe16f5c6b94c
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.
    
    (cherry picked from commit 3ec0b7cd7ce7b64b58cb0ee52fb95fb0875c805c)

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 6515f3434ac1..be75cd05037f 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -35418,9 +35418,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 2dc9c4f8bfe1..ca46bcb499a8 100644
--- a/gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c
+++ b/gcc/testsuite/gcc.target/arm/mve/dlstp-loop-form.c
@@ -24,3 +24,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);
+    }
+  }
+}

Reply via email to