On Sun, Jun 24, 2012 at 11:50:12AM +0100, Richard Sandiford wrote:
> --- gcc/df-problems.c 2012-06-23 13:28:55.576128246 +0100
> +++ gcc/df-problems.c 2012-06-24 11:25:36.851531368 +0100
> @@ -3209,7 +3210,8 @@ dead_debug_insert_temp (struct dead_debu
> the widest referenced mode. */
> while ((cur = *tailp))
> {
> - if (DF_REF_REGNO (cur->use) == uregno)
> + cur_reg = *DF_REF_REAL_LOC (cur->use);
> + if (REGNO (cur_reg) == uregno)
> {
> *usesp = cur;
> usesp = &cur->next;
> @@ -3217,21 +3219,13 @@ dead_debug_insert_temp (struct dead_debu
> cur->next = NULL;
> if (!reg
> || (GET_MODE_BITSIZE (GET_MODE (reg))
> - < GET_MODE_BITSIZE (GET_MODE (*DF_REF_REAL_LOC (cur->use)))))
> - reg = *DF_REF_REAL_LOC (cur->use);
> + < GET_MODE_BITSIZE (GET_MODE (cur_reg))))
> + reg = cur_reg;
> }
> else
> tailp = &(*tailp)->next;
> }
>
> - /* We may have dangling bits in debug->used for registers that were part
> - of a multi-register use, one component of which has been reset. */
> - if (reg == NULL)
> - {
> - gcc_checking_assert (!uses);
> - return 0;
> - }
> -
> gcc_checking_assert (uses);
>
> breg = reg;
Unfortunately this seems to break bootstrap on i686-linux.
Delta-reduced testcase is:
typedef _Complex float __attribute__ ((mode (TC))) __complex128;
extern __complex128 clogq (__complex128) __attribute__ ((__nothrow__));
__complex128
cacoshq (__complex128 x)
{
__complex128 res;
int rcls = __builtin_fpclassify (0, 1, 4, 3, 2, __real__ x);
int icls = __builtin_fpclassify (0, 1, 4, 3, 2, __imag__ x);
if (rcls <= 1 || icls <= 1)
{
__complex128 y;
res = clogq (y);
if (__real__ res < 0.0)
res = -res;
}
return res;
}
which ICEs at -O2 -g -fPIC -m32 in the above gcc_checking_assert (uses)
now.
Jakub