https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79571

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-03-01
     Ever confirmed|0                           |1

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
We have:
(insn 8 6 9 2 (set (reg:TI 93 [ *_2 ])
        (mem:TI (zero_extend:DI (reg:SI 91)) [1 *_2+0 S16 A64])) "pr79571.c":8
80 {*movti_internal}
     (expr_list:REG_DEAD (reg:SI 91)
        (expr_list:REG_EQUIV (mem/c:TI (symbol_ref:DI ("a") [flags 0x2] 
<var_decl 0x7f40f2f19e10 a>) [1 a+0 S16 A64])
            (nil))))
and the constraints/predicates are:
(define_insn "*movti_internal"
  [(set (match_operand:TI 0 "nonimmediate_operand" "=!r ,o ,v,v ,v ,m")
        (match_operand:TI 1 "general_operand"      "riFo,re,C,BC,vm,v"))]
The (zero_extend:DI (reg:SI 91)) is valid address for nonimmediate_operand or m
constraint, but not for o constraint, as it is not offsetable.  I'd have
expected LRA to force the zero_extend into some DImode register and that would
then be offsetable.  Or does the backend need to use a predicate like e.g.
rs6000
offsettable_mem_operand (in this case like nonimmediate_operand, but if it is a
MEM, fail if not offsetable)?  That would in general pessimize the case where
the source is in a vector register.

Reply via email to