On Mon, Jul 11, 2016 at 03:26:46PM +0200, Ulrich Weigand wrote:
> However, there still seems to be another underlying problem: reload
> should never generate invalid instructions.  (Playing with '?' to
> fix *inefficient* instructions is fine, but we shouldn't rely on '?'
> to fix *invalid* instructions.)
> 
> If reload -for whatever reason- wants to emit a vr->gpr move, then it
> should generate a valid instruction sequence to do so, via secondary
> reloads if necessary.  I think it would be a good idea to investigate
> why that isn't happening in this test case.  [ There is a chance that
> the underlying bug will reappear in a different context, even after
> the '?' change is applied. ]

The vr->gpr move uses secondary memory.  The memory allocated by
assign_stack_local, called from get_secondary_memory is

(mem/c:V16QI (plus:DI (reg/f:DI 113 sfp)
        (const_int 32 [0x20])) [0  S16 A128])

and that is incorrectly simplified by eliminate_regs to

(mem/c:V16QI (reg/f:DI 1 1))

for use by the strict_memory_address_space_p check, which of course
then passes.

eliminate_regs sees this entry in the elimination table:
(gdb) p *ep
$7 = {from = 113, to = 1, initial_offset = -32, can_eliminate = 1, 
can_eliminate_previous = 1, offset = -32, previous_offset = -32, 
ref_outside_mem = 0, from_rtx = 0x7ffff688a300, to_rtx = 0x7ffff688a2e8}

The offset in the elimination table was correct before
get_secondary_memory called assign_stack_local, but not after
frame_offset was changed when allocating a new stack slot.

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to