]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR rtl-optimization/85167 (shrink-wrap.c:333:15: runtime error with...
authorJakub Jelinek <jakub@redhat.com>
Fri, 22 Jun 2018 21:05:08 +0000 (23:05 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 22 Jun 2018 21:05:08 +0000 (23:05 +0200)
Backported from mainline
2018-04-03  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/85167
* shrink-wrap.c (move_insn_for_shrink_wrap): Don't set bb_uses and
bb_defs if *split_p, instead preinitialize it to NULL.

* gcc.dg/pr85167.c: New test.

From-SVN: r261946

gcc/ChangeLog
gcc/shrink-wrap.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr85167.c [new file with mode: 0644]

index 05e9df4ee30abd16e5b4acec3147f870e7a05f8f..dd6bc807df06b65c7d700f46cab758f3ec39c74c 100644 (file)
@@ -1,6 +1,12 @@
 2018-06-22  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-04-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/85167
+       * shrink-wrap.c (move_insn_for_shrink_wrap): Don't set bb_uses and
+       bb_defs if *split_p, instead preinitialize it to NULL.
+
        2018-03-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/85095
index 253be9d5273b32146709ba73cab47a198b2d824a..083eebc257c8b4866c12b26fabb3b539199c5140 100644 (file)
@@ -157,7 +157,7 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
                           struct dead_debug_local *debug)
 {
   rtx set, src, dest;
-  bitmap live_out, live_in, bb_uses, bb_defs;
+  bitmap live_out, live_in, bb_uses = NULL, bb_defs = NULL;
   unsigned int i, dregno, end_dregno;
   unsigned int sregno = FIRST_PSEUDO_REGISTER;
   unsigned int end_sregno = FIRST_PSEUDO_REGISTER;
@@ -330,8 +330,11 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
       /* Check whether BB uses DEST or clobbers DEST.  We need to add
         INSN to BB if so.  Either way, DEST is no longer live on entry,
         except for any part that overlaps SRC (next loop).  */
-      bb_uses = &DF_LR_BB_INFO (bb)->use;
-      bb_defs = &DF_LR_BB_INFO (bb)->def;
+      if (!*split_p)
+       {
+         bb_uses = &DF_LR_BB_INFO (bb)->use;
+         bb_defs = &DF_LR_BB_INFO (bb)->def;
+       }
       if (df_live)
        {
          for (i = dregno; i < end_dregno; i++)
index 84abc4f8e37e877cf504e8b0675a91817d48b2e4..ae3c9cb8681ddcaa754b536889114b5be76a20b6 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2018-04-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/85167
+       * gcc.dg/pr85167.c: New test.
+
        PR c++/85147
        * g++.dg/cpp0x/pr85147.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr85167.c b/gcc/testsuite/gcc.dg/pr85167.c
new file mode 100644 (file)
index 0000000..e4277e3
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR rtl-optimization/85167 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -w" } */
+
+struct A { long b; };
+int c, d, e;
+int bar (void);
+
+int
+foo (void)
+{
+  long g;
+  for (; g == c ? 0 : (e = 1); g = ((struct A *)g)->b)
+    if (bar ())
+      return d;
+}