https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69377
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Priority|P3 |P1 CC| |vmakarov at gcc dot gnu.org --- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Looks like a RA bug to me. At least in *.ira we have above the test for the second printf: (insn 171 170 316 24 (set (reg/v:QI 122 [ x ]) (not:QI (subreg:QI (reg:SI 201) 0))) pr69377.c:64 504 {*one_cmplqi2_1} (expr_list:REG_DEAD (reg:SI 201) (nil))) (insn 316 171 172 24 (set (reg:HI 224 [ u.3_64 ]) (mem/c:HI (symbol_ref:SI ("u") [flags 0x2] <var_decl 0x7fefb81f2120 u>) [2 u+0 S2 A16])) 88 {*movhi_internal} (nil)) (insn 172 316 173 24 (set (reg:CCGC 17 flags) (compare:CCGC (reg/v:QI 156 [ x ]) (reg/v:QI 122 [ x ]))) pr69377.c:65 5 {*cmpqi_1} (expr_list:REG_DEAD (reg/v:QI 156 [ x ]) (nil))) (jump_insn 173 172 174 24 (set (pc) (if_then_else (le (reg:CCGC 17 flags) (const_int 0 [0])) (label_ref:SI 180) (pc))) pr69377.c:65 633 {*jcc_1} (expr_list:REG_DEAD (reg:CCGC 17 flags) (int_list:REG_BR_PROB 7100 (nil))) -> 180) but *.reload turns it into: (insn 457 170 171 26 (set (reg/v:QI 0 ax [orig:122 x ] [122]) (reg:QI 1 dx [201])) pr69377.c:64 89 {*movqi_internal} (nil)) (insn 171 457 458 26 (set (reg/v:QI 0 ax [orig:122 x ] [122]) (not:QI (reg/v:QI 0 ax [orig:122 x ] [122]))) pr69377.c:64 504 {*one_cmplqi2_1} (nil)) (insn 458 171 509 26 (set (reg/v:QI 1 dx [orig:156 x ] [156]) (reg/v:QI 0 ax [orig:122 x ] [122])) pr69377.c:64 89 {*movqi_internal} (nil)) (insn 509 458 316 26 (set (mem/c:QI (plus:SI (reg/f:SI 7 sp) (const_int 8 [0x8])) [5 %sfp+-24 S1 A32]) (reg/v:QI 1 dx [orig:156 x ] [156])) pr69377.c:64 89 {*movqi_internal} (nil)) (insn 316 509 499 26 (set (reg:HI 0 ax [orig:224 u.3_64 ] [224]) (mem/c:HI (symbol_ref:SI ("u") [flags 0x2] <var_decl 0x7fefb81f2120 u>) [2 u+0 S2 A16])) 88 {*movhi_internal} (nil)) (insn 499 316 172 26 (set (reg/v:QI 3 bx [orig:156 x ] [156]) (reg/v:QI 1 dx [orig:156 x ] [156])) pr69377.c:65 89 {*movqi_internal} (nil)) (insn 172 499 173 26 (set (reg:CCGC 17 flags) (compare:CCGC (reg/v:QI 3 bx [orig:156 x ] [156]) (reg/v:QI 3 bx [orig:156 x ] [156]))) pr69377.c:65 5 {*cmpqi_1} (nil)) (jump_insn 173 172 174 26 (set (pc) (if_then_else (le (reg:CCGC 17 flags) (const_int 0 [0])) (label_ref:SI 180) (pc))) pr69377.c:65 633 {*jcc_1} (int_list:REG_BR_PROB 7100 (nil)) -> 180) Thus in the end we compare a QImode register with itself, while the source has: c = x; z = -y; t1 = (j && y << c) + k || x; x = ~(u % p); if (x < c) and thus we want to compare the older value of x with completely different value.