------- Additional Comments From geoffk at gcc dot gnu dot org  2005-04-28 
18:58 -------
OK, the problem is definitely a latent bug.

The problem is that in fix_truncdfsi2, it creates a stack temporary, with

 operands[3] = assign_stack_temp (DImode, GET_MODE_SIZE (DImode), 0);           
                                           

which just happens to be something like

(mem/i:DI (plus:SI (reg/f:SI 114 virtual-stack-vars)
        (const_int 32768 [0x8000])) [0 S8 A64])

Uh-oh!  That's not an address!  So when instantiate_virtual_regs_1 notices 
this, it rewrites it to:

            (clobber (mem/i:DI (plus:SI (reg/f:SI 30 r30)
                        (reg:SI 128)) [0 S8 A64]))
 
but fix_truncdfsi2_internal needs an offsettable operand,

   (clobber (match_operand:DI 3 "memory_operand" "=o"))]

because it plans to use plus_constant on it.

For me, the testcase fails even if I just say "-mcpu=rs64a", there's no need 
for actual 64-bit pointers.

I guess the right fix is to use adjust_address rather than plus_constant.

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|ice-on-valid-code           |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20813

Reply via email to