http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56195
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org,
| |vmakarov at gcc dot gnu.org
Target Milestone|--- |4.8.0
Summary|Error: incorrect register |[4.8 Regression] Error:
|`%rdi' used with `l' suffix |incorrect register `%rdi'
|(at -O2) |used with `l' suffix (at
| |-O2)
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-02-03
21:01:59 UTC ---
Started with LRA merge (
http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=192719 ).
(define_insn "*cmp<mode>_1"
[(set (reg FLAGS_REG)
(compare (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
(match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m")))]
"ix86_match_ccmode (insn, CCmode)"
"cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
[(set_attr "type" "icmp")
(set_attr "mode" "<MODE>")])
In *.ira dump the insn looks still correct:
(insn 90 87 91 22 (set (reg:CCGC 17 flags)
(compare:CCGC (reg:SI 118 [ D.1797 ])
(mem:SI (reg/v/f:DI 59 [ q ]) [2 *q_1+0 S4 A32]))) pr56195.c:17 7
{*cmpsi_1}
(nil))
but in *.reload dump:
(insn 90 256 91 22 (set (reg:CCGC 17 flags)
(compare:CCGC (reg:DI 5 di [137])
(mem:SI (reg:DI 5 di [137]) [2 *q_1+0 S4 A32]))) pr56195.c:17 7
{*cmpsi_1}
(expr_list:REG_DEAD (reg:DI 5 di [137])
(nil)))
so I wonder how could it match that way and survive till end of compilation.