re PR rtl-optimization/24883 (fatal error: internal consistency failure building xorg-x11)

./:	PR rtl-optimization/24883
	* combine.c (combinable_i3pat): When checking whether the
	destination of i3 is used in i3, consider paradoxical subregs.
testsuite/:
	PR rtl-optimization/24883
	* gcc.c-torture/compile/pr24883.c: New test.

From-SVN: r107279
This commit is contained in:
Ian Lance Taylor 2005-11-21 05:41:36 +00:00 committed by Ian Lance Taylor
parent 1ef6855c51
commit 083a9e91be
4 changed files with 51 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2005-11-20 Ian Lance Taylor <ian@airs.com>
PR rtl-optimization/24883
* combine.c (combinable_i3pat): When checking whether the
destination of i3 is used in i3, consider paradoxical subregs.
2005-11-21 Kazu Hirata <kazu@codesourcery.com>
PR middle-end/20583

View File

@ -1423,6 +1423,7 @@ combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
rtx dest = SET_DEST (set);
rtx src = SET_SRC (set);
rtx inner_dest = dest;
rtx subdest;
while (GET_CODE (inner_dest) == STRICT_LOW_PART
|| GET_CODE (inner_dest) == SUBREG
@ -1457,27 +1458,35 @@ combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
|| (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
return 0;
/* If DEST is used in I3, it is being killed in this insn,
so record that for later.
/* If DEST is used in I3, it is being killed in this insn, so
record that for later. We have to consider paradoxical
subregs here, since they kill the whole register, but we
ignore partial subregs, STRICT_LOW_PART, etc.
Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
STACK_POINTER_REGNUM, since these are always considered to be
live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
if (pi3dest_killed && REG_P (dest)
&& reg_referenced_p (dest, PATTERN (i3))
&& REGNO (dest) != FRAME_POINTER_REGNUM
subdest = dest;
if (GET_CODE (subdest) == SUBREG
&& (GET_MODE_SIZE (GET_MODE (subdest))
>= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
subdest = SUBREG_REG (subdest);
if (pi3dest_killed
&& REG_P (subdest)
&& reg_referenced_p (subdest, PATTERN (i3))
&& REGNO (subdest) != FRAME_POINTER_REGNUM
#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
&& REGNO (dest) != HARD_FRAME_POINTER_REGNUM
&& REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
#endif
#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
&& (REGNO (dest) != ARG_POINTER_REGNUM
|| ! fixed_regs [REGNO (dest)])
&& (REGNO (subdest) != ARG_POINTER_REGNUM
|| ! fixed_regs [REGNO (subdest)])
#endif
&& REGNO (dest) != STACK_POINTER_REGNUM)
&& REGNO (subdest) != STACK_POINTER_REGNUM)
{
if (*pi3dest_killed)
return 0;
*pi3dest_killed = dest;
*pi3dest_killed = subdest;
}
}

View File

@ -1,3 +1,8 @@
2005-11-20 Ian Lance Taylor <ian@airs.com>
PR rtl-optimization/24883
* gcc.c-torture/compile/pr24883.c: New test.
2005-11-21 Kazu Hirata <kazu@codesourcery.com>
PR middle-end/20583

View File

@ -0,0 +1,21 @@
typedef struct _rec_stl rec_stl;
struct _rec_stl {
unsigned char **strs;
};
orec_str_list(int count) {
rec_stl *stl;
int i, j;
int li, lj;
unsigned char ci, cj;
for (i = 0; i < count; i++) {
for (j = i + 1; j < count; j++) {
cj = lj > 2 ? stl->strs[j][0] : (long)stl->strs[j] & 0xff;
if ((count >= 16 && cj < ci) || (cj == ci && lj > li)) {
stl->strs[j] = stl->strs[i];
ci ^= cj;
cj ^= ci;
ci ^= cj;
}
}
}
}