Is eliminate_regs_in_insn allowed to generate invalid instruction?

Ian Lance Taylor iant@google.com
Fri Dec 17 16:55:00 GMT 2010


"Bingfeng Mei" <bmei@broadcom.com> writes:

> I think I found the cause. find_reloads_address returns 0 even
> it reloads both parts of address (see the patch). Therefore, 
> corresponding address_reloaded[i] is not set and in
> the following code of find_reloads, 
>
>    if (EXTRA_CONSTRAINT_STR (operand, c, p))
>     win = 1;
> /* If the address was already reloaded,
>    we win as well.  */
>    else if (MEM_P (operand)
> 	      && address_reloaded[i] == 1) <-- address_reloaded[i] still 0
>      win = 1;
>     ...
>
> Extra reload is thus generated even it is unnecessary
> and causes ICE. 
>
> It looks like a general GCC bug. But I couldn't produce
>  a test for x86. The following patch is bootstrapped 
> and passes tests on x86_64-unknown-linux-gnu. Is it
>  OK to apply the patch?
>
> Cheers,
> Bingfeng 
>
>
> Index: reload.c
> ===================================================================
> --- reload.c    (revision 167979)
> +++ reload.c    (working copy)
> @@ -5188,7 +5188,7 @@ find_reloads_address (enum machine_mode
>                                   &XEXP (ad, 1 - op_index), opnum,
>                                   type, 0, insn);
>
> -         return 0;
> +         return 1;

I'm willing to believe that there is a problem here, but that patch
isn't right.  find_reloads_address should only return 1 if the address
is replaced or reloaded as a whole, and that is not what is happening
here.  What is happening here is that the components of the address are
being reloaded.

Frankly I would fix this problem in LEGITIMIZE_RELOAD_ADDRESS.

Ian



More information about the Gcc-patches mailing list