https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68990
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code CC| |jakub at gcc dot gnu.org, | |vmakarov at gcc dot gnu.org --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Looks like a RA issue to me. At least, on -m32 -O3 -march=x86-64 compiled: short a; int b = 1, f; char c, e = 1; long long d; static short foo () { unsigned g, h = 0; int i = 0 || d * (b | e); char j = a << i, l = a; short k; int m = -b; if (m < b) { k = m = b; g = (k || l) / (b / e); if (b) __builtin_printf ("foo=%lld\n", (long long) a); } a = b = m; if (j || e) { h = g; i = m; g = j * k / (i - d); if (m) b = j && b; e = b * (h & d) || g; } b = i; char n = e || h | d; e = i < d & k / n; return f; } int main () { if (foo ()) if (c) lab: goto lab; return 0; } we in *.ira still have correct: (insn 30 28 31 2 (parallel [ (set (reg/v:SI 103 [ m ]) (neg:SI (reg:SI 91 [ b.2_7 ]))) (clobber (reg:CC 17 flags)) ]) pr68990-4.c:13 463 {*negsi2_1} (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))) (insn 31 30 32 2 (set (reg:CCGC 17 flags) (compare:CCGC (reg:SI 91 [ b.2_7 ]) (reg/v:SI 103 [ m ]))) pr68990-4.c:14 7 {*cmpsi_1} (nil)) (jump_insn 32 31 33 2 (set (pc) (if_then_else (le (reg:CCGC 17 flags) (const_int 0 [0])) (label_ref 56) (pc))) pr68990-4.c:14 631 {*jcc_1} (expr_list:REG_DEAD (reg:CCGC 17 flags) (int_list:REG_BR_PROB 5000 (nil))) and 31:r91 l0 mem 13:r103 l0 3 but LRA turns that into: (insn 256 207 208 2 (set (reg:SI 1 dx [orig:91 b.2_7 ] [91]) (mem/c:SI (plus:SI (reg/f:SI 6 bp) (const_int -28 [0xffffffffffffffe4])) [5 %sfp+-4 S4 A32])) pr68990-4.c:13 86 {*movsi_internal} (nil)) (insn 208 256 30 2 (set (reg/v:SI 3 bx [orig:103 m ] [103]) (reg:SI 1 dx [orig:91 b.2_7 ] [91])) pr68990-4.c:13 86 {*movsi_internal} (nil)) (insn 30 208 286 2 (parallel [ (set (reg/v:SI 3 bx [orig:103 m ] [103]) (neg:SI (reg/v:SI 3 bx [orig:103 m ] [103]))) (clobber (reg:CC 17 flags)) ]) pr68990-4.c:13 463 {*negsi2_1} (nil)) (insn 286 30 210 2 (set (mem/c:SI (plus:SI (reg/f:SI 6 bp) (const_int -28 [0xffffffffffffffe4])) [5 %sfp+-4 S4 A32]) (reg:SI 3 bx [orig:91 b.2_7 ] [91])) pr68990-4.c:13 86 {*movsi_internal} (nil)) (insn 210 286 31 2 (set (reg:SI 3 bx [orig:91 b.2_7 ] [91]) (reg:SI 1 dx [orig:91 b.2_7 ] [91])) pr68990-4.c:14 86 {*movsi_internal} (nil)) (insn 31 210 32 2 (set (reg:CCGC 17 flags) (compare:CCGC (reg:SI 3 bx [orig:91 b.2_7 ] [91]) (reg:SI 3 bx [orig:91 b.2_7 ] [91]))) pr68990-4.c:14 7 {*cmpsi_1} (nil)) (jump_insn 32 31 33 2 (set (pc) (if_then_else (le (reg:CCGC 17 flags) (const_int 0 [0])) (label_ref 56) (pc))) pr68990-4.c:14 631 {*jcc_1} (int_list:REG_BR_PROB 5000 (nil)) -> 56) which is just wrong, instead of comparing m < b it suddenly compares b < b.