s390: SImode pointers vs LR

Jeff Law law@redhat.com
Tue Jun 2 17:13:00 GMT 2015


On 06/02/2015 09:32 AM, Andreas Krebbel wrote:
> Bootstrap failed with:
>
> /home/andreas/clean/../gcc/gcc/dwarf2out.c: In function ‘constant_size’:
> /home/andreas/clean/../gcc/gcc/dwarf2out.c:6572: error: insn does not satisfy its constraints:
> (insn 39 38 66 6 /home/andreas/clean/../gcc/gcc/toplev.h:176 (set (reg:SI 2 %r2 [orig:44
> prephitmp.4958 ] [44])
>          (ashift:SI (reg:SI 2 %r2 [orig:44 prephitmp.4958 ] [44])
>              (plus:SI (reg:SI 12 %r12 [49])
>                  (reg:SI 2 %r2 [orig:44 prephitmp.4958 ] [44])))) 360 {*ashlsi3} (nil)
>      (nil))
> /home/andreas/clean/../gcc/gcc/dwarf2out.c:6572: internal compiler error: in
> reload_cse_simplify_operands, at postreload.c:393
>
> This is the result of reload reloading the constant in:
>
> (insn 58 57 59 6 (set (reg/v:SI 48 [ log ])
>          (ashift:SI (reg:SI 66)
>              (plus:SI (reg:SI 2 %r2 [+4 ])
>                  (const_int 1 [0x1])))) 360 {*ashlsi3} (insn_list:REG_DEP_TRUE 53
> (insn_list:REG_DEP_TRUE 57 (nil)))
>      (expr_list:REG_DEAD (reg:DI 2 %r2)
>          (expr_list:REG_DEAD (reg:SI 66)
>              (nil))))
>
> Reloads for insn # 58
> Reload 0: reload_in (SI) = (const_int 1 [0x1])
>          ADDR_REGS, RELOAD_FOR_INPUT (opnum = 2)
>          reload_in_reg: (const_int 1 [0x1])
>          reload_reg_rtx: (reg:SI 1 %r1 [66])
> Reload 1: reload_in (SI) = (reg:SI 1 %r1 [66])
>          reload_out (SI) = (reg/v:SI 9 %r9 [orig:48 log ] [48])
>          GENERAL_REGS, RELOAD_OTHER (opnum = 0)
>          reload_in_reg: (reg:SI 1 %r1 [66])
>          reload_out_reg: (reg/v:SI 9 %r9 [orig:48 log ] [48])
>          reload_reg_rtx: (reg/v:SI 9 %r9 [orig:48 log ] [48])
But shouldn't we be reloading the (plus (reg) (const_int 1)) part as a 
whole rather than sub-components?


>
> Without accepting SImode in s390_decompose_address
> find_reloads_address reloads const_int 1 into a reg.  Unfortunately it
> assumes that this makes a valid address because double_reg_address_ok
> is true on our target. But of course the shift instruction cannot deal
> with an index register.
But isn't that 3 registers used in the address computation if the 
(const_int 1) gets reloaded?  one of the value shifted, two for the 
shift count?  I'm not familiar with the s390, so if you can handle that 
kind of insn, then, umm, cool.



>
> However, the problem to me appears to be that s390_decompose_address
> is involved for shift count operands at all.  We have a separate
> function for this (s390_decompose_shift_count) which is invoked by the
> relevant predicate and constraint. s390_decompose_address is only
> called because the Y constraint letter is marked as
> EXTRA_ADDRESS_CONSTRAINT.
Note that the EXTRA_ADDRESS_CONSTRAINT stuff all changed a little while 
back, not sure if it makes any significant difference in the analysis 
though.

The only other thing that comes immediately to mind would be secondary 
reloads.  But I always hate suggesting them.


Jeff



More information about the Gcc mailing list