re PR debug/49544 (ICE in new_elt_loc_list)
authorJakub Jelinek <jakub@redhat.com>
Mon, 27 Jun 2011 16:45:49 +0000 (18:45 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 27 Jun 2011 16:45:49 +0000 (18:45 +0200)
PR debug/49544
* cselib.c (promote_debug_loc): If cselib_preserve_constants
and l has two DEBUG_INSN owned locs instead of just one, adjust
the second location's setting_insn too.

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

From-SVN: r175540

gcc/ChangeLog
gcc/cselib.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr49544.c [new file with mode: 0644]

index 9d3823a1a46d1e1bddacc616ac2c788d3cc531c5..14e023b177156e0720d6a254847651c304a6ce08 100644 (file)
@@ -1,3 +1,10 @@
+2011-06-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/49544
+       * cselib.c (promote_debug_loc): If cselib_preserve_constants
+       and l has two DEBUG_INSN owned locs instead of just one, adjust
+       the second location's setting_insn too.
+
 2011-06-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR libmudflap/38738
index e575aff72fd8320dceffd96a098e9f082d117a3b..b96c0cd07abbb189179028b59fa8460080457784 100644 (file)
@@ -257,7 +257,15 @@ promote_debug_loc (struct elt_loc_list *l)
     {
       n_debug_values--;
       l->setting_insn = cselib_current_insn;
-      gcc_assert (!l->next || cselib_preserve_constants);
+      if (cselib_preserve_constants && l->next)
+       {
+         gcc_assert (l->next->setting_insn
+                     && DEBUG_INSN_P (l->next->setting_insn)
+                     && !l->next->next);
+         l->next->setting_insn = cselib_current_insn;
+       }
+      else
+       gcc_assert (!l->next);
     }
 }
 
index 7184340d0025c42e3f732e91f2d955ea3e7186a4..2d026a041b65692a92a4b96c38307118bca9f8ed 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/49544
+       * gcc.dg/pr49544.c: New test.
+
 2011-06-27  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/49394
diff --git a/gcc/testsuite/gcc.dg/pr49544.c b/gcc/testsuite/gcc.dg/pr49544.c
new file mode 100644 (file)
index 0000000..65498f4
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR debug/49544 */
+/* { dg-do compile } */
+/* { dg-options "-g -O2" } */
+
+int baz (int, int, void *);
+
+static inline __attribute__ ((always_inline)) long
+foo (int x, int y, void *z)
+{
+  if (y < 0)
+    return baz (x, y, z);
+  return 0;
+}
+
+long
+bar (long x, long y, long z)
+{
+  return foo (x, y, (void *) z);
+}