]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR debug/55730 (ICE in mem_loc_descriptor, at dwarf2out.c:12725)
authorJakub Jelinek <jakub@redhat.com>
Wed, 19 Dec 2012 12:16:56 +0000 (13:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 19 Dec 2012 12:16:56 +0000 (13:16 +0100)
PR debug/55730
* dwarf2out.c (mem_loc_descriptor): Ignore CLOBBER.
* valtrack.c (gen_lowpart_for_debug): New function.
(propagate_for_debug): Temporarily set rtl_hooks.gen_lowpart_no_emit
to gen_lowpart_for_debug.

* gcc.dg/debug/pr55730.c: New test.

From-SVN: r194607

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/debug/pr55730.c [new file with mode: 0644]
gcc/valtrack.c

index 694062f727406c86b233cda681bf7b8a6657e196..34b5836fd56a5e8a0a34ff9d0cbd4e7165c3a3c0 100644 (file)
@@ -1,3 +1,11 @@
+2012-12-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/55730
+       * dwarf2out.c (mem_loc_descriptor): Ignore CLOBBER.
+       * valtrack.c (gen_lowpart_for_debug): New function.
+       (propagate_for_debug): Temporarily set rtl_hooks.gen_lowpart_no_emit
+       to gen_lowpart_for_debug.
+
 2012-12-18  Jan Hubicka  <jh@suse.cz>
 
        PR tree-optimization/55683
index a284eed6977fabb225ee2c12ae6413888666af81..a86525094e85fff55bd873fde9a6efc294afd195 100644 (file)
@@ -12714,6 +12714,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode,
     case CONST_VECTOR:
     case CONST_FIXED:
     case CLRSB:
+    case CLOBBER:
       /* If delegitimize_address couldn't do anything with the UNSPEC, we
         can't express it in the debug info.  This can happen e.g. with some
         TLS UNSPECs.  */
index 0a8580c4d8ff24fd193dc3c2d16aa542a8482490..81693bf15ff75c7240937ccae00d80c89ccd55ee 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/55730
+       * gcc.dg/debug/pr55730.c: New test.
+
 2012-12-18  Jan Hubicka  <jh@suse.cz>
 
        PR tree-optimization/55683
diff --git a/gcc/testsuite/gcc.dg/debug/pr55730.c b/gcc/testsuite/gcc.dg/debug/pr55730.c
new file mode 100644 (file)
index 0000000..073d83d
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR debug/55730 */
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+union U
+{
+  float f;
+  int i;
+};
+
+void
+foo (unsigned short *x, unsigned char y)
+{
+  unsigned char g;
+  union U u;
+  if (u.i < 0)
+    g = 0;
+  else
+    {
+      u.f = u.f * (255.0F / 256.0F) + 32768.0F;
+      g = (unsigned char) u.i;
+    }
+  *x = (g << 8) | y;
+}
index 5eefabd2aed104448a2ff2f346368b6aacfbee6f..07ef12500aec7d2e68ea2ad862402edee4e96cd5 100644 (file)
@@ -29,6 +29,24 @@ along with GCC; see the file COPYING3.  If not see
 #include "regs.h"
 #include "emit-rtl.h"
 
+/* gen_lowpart_no_emit hook implementation for DEBUG_INSNs.  In DEBUG_INSNs,
+   all lowpart SUBREGs are valid, despite what the machine requires for
+   instructions.  */
+
+static rtx
+gen_lowpart_for_debug (enum machine_mode mode, rtx x)
+{
+  rtx result = gen_lowpart_if_possible (mode, x);
+  if (result)
+    return result;
+
+  if (GET_MODE (x) != VOIDmode)
+    return gen_rtx_raw_SUBREG (mode, x,
+                              subreg_lowpart_offset (mode, GET_MODE (x)));
+
+  return NULL_RTX;
+}
+
 /* Replace auto-increment addressing modes with explicit operations to access
    the same addresses without modifying the corresponding registers.  */
 
@@ -158,6 +176,7 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src,
                     basic_block this_basic_block)
 {
   rtx next, loc, end = NEXT_INSN (BB_END (this_basic_block));
+  rtx (*saved_rtl_hook_no_emit) (enum machine_mode, rtx);
 
   struct rtx_subst_pair p;
   p.to = src;
@@ -165,6 +184,8 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src,
 
   next = NEXT_INSN (insn);
   last = NEXT_INSN (last);
+  saved_rtl_hook_no_emit = rtl_hooks.gen_lowpart_no_emit;
+  rtl_hooks.gen_lowpart_no_emit = gen_lowpart_for_debug;
   while (next != last && next != end)
     {
       insn = next;
@@ -179,6 +200,7 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src,
          df_insn_rescan (insn);
        }
     }
+  rtl_hooks.gen_lowpart_no_emit = saved_rtl_hook_no_emit;
 }
 
 /* Initialize DEBUG to an empty list, and clear USED, if given.  */