[Bug tree-optimization/68990] [6 Regression] wrong code at -O3 on x86_64-pc-linux-gnu in 32-bit mode.
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Dec 21 14:43:00 GMT 2015
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.
More information about the Gcc-bugs
mailing list