re PR rtl-optimization/85167 (shrink-wrap.c:333:15: runtime error with UBSAN)
authorJakub Jelinek <jakub@redhat.com>
Tue, 3 Apr 2018 21:45:52 +0000 (23:45 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 3 Apr 2018 21:45:52 +0000 (23:45 +0200)
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: r259058

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

index 78d14afe1717a6193a47328a6c7879074876fcb0..cd64aa46cc19b3d9da724e3924c348941350297f 100644 (file)
@@ -1,5 +1,9 @@
 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.
+
        PR tree-optimization/85156
        * builtins.c (fold_builtin_expect): Use save_expr on arg1 to avoid
        evaluating the argument multiple times.
index fd19acec9c1af6855322aaf3af0415cfee5951a1..6b47d4ea8cdeabbef2b1325787abc3a8e31d78a2 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 6d1322cb076d009bb3e78d4949fc7580ead92bdb..de14495bf9ae50e918152d1996e8ce2a74d6975c 100644 (file)
@@ -1,5 +1,8 @@
 2018-04-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/85167
+       * gcc.dg/pr85167.c: New test.
+
        PR tree-optimization/85156
        * c-c++-common/pr85156.c: New test.
        * gcc.c-torture/execute/pr85156.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;
+}