public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-8840] middle-end: fix ICE when destination BB for stores starts with a label [PR113750]
@ 2024-02-07 10:59 Tamar Christina
  0 siblings, 0 replies; only message in thread
From: Tamar Christina @ 2024-02-07 10:59 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:5c3ba60024fedc6b3d374ebb071bcf5b3e27cd62

commit r14-8840-g5c3ba60024fedc6b3d374ebb071bcf5b3e27cd62
Author: Tamar Christina <tamar.christina@arm.com>
Date:   Wed Feb 7 10:59:32 2024 +0000

    middle-end: fix ICE when destination BB for stores starts with a label [PR113750]
    
    The report shows that if the FE leaves a label as the first thing in the dest
    BB then we ICE because we move the stores before the label.
    
    This is easy to fix if we know that there's still only one way into the BB.
    We would have already rejected the loop if there was multiple paths into the BB
    however I added an additional check just for early break in case the other
    constraints are relaxed later with an explanation.
    
    After that we fix the issue just by getting the GSI after the labels and I add
    a bunch of testcases for different positions the label can be added.  Only the
    vect-early-break_112-pr113750.c one results in the label being kept.
    
    gcc/ChangeLog:
    
            PR tree-optimization/113750
            * tree-vect-data-refs.cc (vect_analyze_early_break_dependences): Check
            for single predecessor when doing early break vect.
            * tree-vect-loop.cc (move_early_exit_stmts): Get gsi at the start but
            after labels.
    
    gcc/testsuite/ChangeLog:
    
            PR tree-optimization/113750
            * gcc.dg/vect/vect-early-break_112-pr113750.c: New test.
            * gcc.dg/vect/vect-early-break_113-pr113750.c: New test.
            * gcc.dg/vect/vect-early-break_114-pr113750.c: New test.
            * gcc.dg/vect/vect-early-break_115-pr113750.c: New test.
            * gcc.dg/vect/vect-early-break_116-pr113750.c: New test.

Diff:
---
 .../gcc.dg/vect/vect-early-break_112-pr113750.c    | 26 ++++++++++++++++++++++
 .../gcc.dg/vect/vect-early-break_113-pr113750.c    | 26 ++++++++++++++++++++++
 .../gcc.dg/vect/vect-early-break_114-pr113750.c    | 26 ++++++++++++++++++++++
 .../gcc.dg/vect/vect-early-break_115-pr113750.c    | 26 ++++++++++++++++++++++
 .../gcc.dg/vect/vect-early-break_116-pr113750.c    | 26 ++++++++++++++++++++++
 gcc/tree-vect-data-refs.cc                         | 12 ++++++++++
 gcc/tree-vect-loop.cc                              |  2 +-
 7 files changed, 143 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_112-pr113750.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_112-pr113750.c
new file mode 100644
index 000000000000..559ebd84d5c3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_112-pr113750.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-add-options vect_early_break } */
+/* { dg-require-effective-target vect_early_break } */
+/* { dg-require-effective-target vect_int } */
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+
+#ifndef N
+#define N 800
+#endif
+unsigned vect_a[N];
+unsigned vect_b[N];
+
+unsigned test4(unsigned x)
+{
+ unsigned ret = 0;
+ for (int i = 0; i < N; i++)
+ {
+   vect_b[i] = x + i;
+   if (vect_a[i] != x)
+     break;
+foo:
+   vect_a[i] = x;
+ }
+ return ret;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_113-pr113750.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_113-pr113750.c
new file mode 100644
index 000000000000..ba85780a46b1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_113-pr113750.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-add-options vect_early_break } */
+/* { dg-require-effective-target vect_early_break } */
+/* { dg-require-effective-target vect_int } */
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+
+#ifndef N
+#define N 800
+#endif
+unsigned vect_a[N];
+unsigned vect_b[N];
+
+unsigned test4(unsigned x)
+{
+ unsigned ret = 0;
+ for (int i = 0; i < N; i++)
+ {
+   vect_b[i] = x + i;
+   if (vect_a[i] != x)
+     break;
+   vect_a[i] = x;
+foo:
+ }
+ return ret;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_114-pr113750.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_114-pr113750.c
new file mode 100644
index 000000000000..37af2998688f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_114-pr113750.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-add-options vect_early_break } */
+/* { dg-require-effective-target vect_early_break } */
+/* { dg-require-effective-target vect_int } */
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+
+#ifndef N
+#define N 800
+#endif
+unsigned vect_a[N];
+unsigned vect_b[N];
+
+unsigned test4(unsigned x)
+{
+ unsigned ret = 0;
+ for (int i = 0; i < N; i++)
+ {
+   vect_b[i] = x + i;
+foo:
+   if (vect_a[i] != x)
+     break;
+   vect_a[i] = x;
+ }
+ return ret;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_115-pr113750.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_115-pr113750.c
new file mode 100644
index 000000000000..502686d308e2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_115-pr113750.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-add-options vect_early_break } */
+/* { dg-require-effective-target vect_early_break } */
+/* { dg-require-effective-target vect_int } */
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+
+#ifndef N
+#define N 800
+#endif
+unsigned vect_a[N];
+unsigned vect_b[N];
+
+unsigned test4(unsigned x)
+{
+ unsigned ret = 0;
+ for (int i = 0; i < N; i++)
+ {
+foo:
+   vect_b[i] = x + i;
+   if (vect_a[i] != x)
+     break;
+   vect_a[i] = x;
+ }
+ return ret;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_116-pr113750.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_116-pr113750.c
new file mode 100644
index 000000000000..4e02158aa351
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_116-pr113750.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-add-options vect_early_break } */
+/* { dg-require-effective-target vect_early_break } */
+/* { dg-require-effective-target vect_int } */
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+
+#ifndef N
+#define N 800
+#endif
+unsigned vect_a[N];
+unsigned vect_b[N];
+
+unsigned test4(unsigned x)
+{
+ unsigned ret = 0;
+ for (int i = 0; i < N; i++)
+ {
+   vect_b[i] = x + i;
+   if (vect_a[i] != x)
+foo:
+     break;
+   vect_a[i] = x;
+ }
+ return ret;
+}
diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
index f79ade9509b1..56964178a500 100644
--- a/gcc/tree-vect-data-refs.cc
+++ b/gcc/tree-vect-data-refs.cc
@@ -819,6 +819,18 @@ vect_analyze_early_break_dependences (loop_vec_info loop_vinfo)
      trapped already during loop form analysis.  */
   gcc_assert (dest_bb->loop_father == loop);
 
+  /* Check that the destination block we picked has only one pred.  To relax this we
+     have to take special care when moving the statements.  We don't currently support
+     such control flow however this check is there to simplify how we handle
+     labels that may be present anywhere in the IL.  This check is to ensure that the
+     labels aren't significant for the CFG.  */
+  if (!single_pred (dest_bb))
+    return opt_result::failure_at (vect_location,
+			     "chosen loop exit block (BB %d) does not have a "
+			     "single predecessor which is currently not "
+			     "supported for early break vectorization.\n",
+			     dest_bb->index);
+
   LOOP_VINFO_EARLY_BRK_DEST_BB (loop_vinfo) = dest_bb;
 
   if (!LOOP_VINFO_EARLY_BRK_VUSES (loop_vinfo).is_empty ())
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 9aba94bd6ca2..190df9ec7741 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -11786,7 +11786,7 @@ move_early_exit_stmts (loop_vec_info loop_vinfo)
 
   /* Move all stmts that need moving.  */
   basic_block dest_bb = LOOP_VINFO_EARLY_BRK_DEST_BB (loop_vinfo);
-  gimple_stmt_iterator dest_gsi = gsi_start_bb (dest_bb);
+  gimple_stmt_iterator dest_gsi = gsi_after_labels (dest_bb);
 
   for (gimple *stmt : LOOP_VINFO_EARLY_BRK_STORES (loop_vinfo))
     {

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-07 10:59 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-07 10:59 [gcc r14-8840] middle-end: fix ICE when destination BB for stores starts with a label [PR113750] Tamar Christina

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).