47 lines
1.7 KiB
Diff
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;
|
|
}
|