Commit e90c56c6 by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/55730 (ICE in mem_loc_descriptor, at dwarf2out.c:12725)

	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
parent da942ca0
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> 2012-12-18 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55683 PR tree-optimization/55683
...@@ -12714,6 +12714,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, ...@@ -12714,6 +12714,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode,
case CONST_VECTOR: case CONST_VECTOR:
case CONST_FIXED: case CONST_FIXED:
case CLRSB: case CLRSB:
case CLOBBER:
/* If delegitimize_address couldn't do anything with the UNSPEC, we /* 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 can't express it in the debug info. This can happen e.g. with some
TLS UNSPECs. */ TLS UNSPECs. */
......
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> 2012-12-18 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55683 PR tree-optimization/55683
......
/* 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;
}
...@@ -29,6 +29,24 @@ along with GCC; see the file COPYING3. If not see ...@@ -29,6 +29,24 @@ along with GCC; see the file COPYING3. If not see
#include "regs.h" #include "regs.h"
#include "emit-rtl.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 /* Replace auto-increment addressing modes with explicit operations to access
the same addresses without modifying the corresponding registers. */ the same addresses without modifying the corresponding registers. */
...@@ -158,6 +176,7 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src, ...@@ -158,6 +176,7 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src,
basic_block this_basic_block) basic_block this_basic_block)
{ {
rtx next, loc, end = NEXT_INSN (BB_END (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; struct rtx_subst_pair p;
p.to = src; p.to = src;
...@@ -165,6 +184,8 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src, ...@@ -165,6 +184,8 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src,
next = NEXT_INSN (insn); next = NEXT_INSN (insn);
last = NEXT_INSN (last); 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) while (next != last && next != end)
{ {
insn = next; insn = next;
...@@ -179,6 +200,7 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src, ...@@ -179,6 +200,7 @@ propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src,
df_insn_rescan (insn); 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. */ /* Initialize DEBUG to an empty list, and clear USED, if given. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment