gcc/gcc44-vta-pr41353-c9.patch
Jakub Jelinek 22fa975b2a 4.4.1-20
2009-10-08 08:41:15 +00:00

47 lines
1.7 KiB
Diff

2009-10-07 Alexandre Oliva <aoliva@redhat.com>
PR debug/41353
* regmove.c (regmove_backward_pass): Replace src with dst in the
debug insn, and check for dst before rather than after.
--- gcc/regmove.c.orig 2009-10-06 03:51:43.000000000 -0300
+++ gcc/regmove.c 2009-10-07 02:35:36.000000000 -0300
@@ -1117,23 +1117,28 @@ regmove_backward_pass (void)
break;
}
- /* We can't make this change if SRC is read or
+ /* We can't make this change if DST is mentioned at
+ all in P, since we are going to change its value.
+ We can't make this change if SRC is read or
partially written in P, since we are going to
- eliminate SRC. We can't make this change
- if DST is mentioned at all in P,
- since we are going to change its value. */
- if (reg_overlap_mentioned_p (src, PATTERN (p)))
+ eliminate SRC. However, if it's a debug insn, we
+ can't refrain from making the change, for this
+ would cause codegen differences, so instead we
+ invalidate debug expressions that reference DST,
+ and adjust references to SRC in them so that they
+ become references to DST. */
+ if (reg_mentioned_p (dst, PATTERN (p)))
{
if (DEBUG_INSN_P (p))
- validate_replace_rtx_group (dst, src, insn);
+ validate_change (p, &INSN_VAR_LOCATION_LOC (p),
+ gen_rtx_UNKNOWN_VAR_LOC (), 1);
else
break;
}
- if (reg_mentioned_p (dst, PATTERN (p)))
+ if (reg_overlap_mentioned_p (src, PATTERN (p)))
{
if (DEBUG_INSN_P (p))
- validate_change (p, &INSN_VAR_LOCATION_LOC (p),
- gen_rtx_UNKNOWN_VAR_LOC (), 1);
+ validate_replace_rtx_group (src, dst, p);
else
break;
}