[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