https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80620

            Bug ID: 80620
           Summary: gcc produces wrong code with -O3
           Product: gcc
           Version: 7.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vsevolod.livinskij at frtk dot ru
  Target Milestone: ---

Created attachment 41311
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41311&action=edit
Reproducer.

gcc produces wrong code with -O3. It fails on multiple architectures (knl,
skylake-avx512 and others)

Reproducer:
>$ cat func.c 
extern const long int var_10;
extern int var_43;
extern int var_732;
extern int var_743;
extern int var_748;
extern int var_999;
extern unsigned long int var_751;

void foo() {
  if (!var_10 - var_10)
    var_732 = var_43 = 0;
  else
    var_743 = 3UL * var_10 == 0;
  if (var_999 / var_10)
    var_748 = 0 < -var_10 + 500849970701012771 + (unsigned long)-var_10;
  else
    var_751 = 4081116982543369 & var_10;
}

>$ cat driver.c 
#include <stdio.h>

const long int var_10 = -465274079317386463L;
int var_43 = 856872806;
int var_732 = -1940894202;
int var_743 = 1718449211;
int var_748 = -392681565;
unsigned long int var_751 = 13521452247506316486UL;
int var_999 = -13194608;

extern void foo ();

int main () {
    foo ();
    printf("%lu\n", var_751);
    return 0;
}

Error:
>$ gcc -O3 driver.c func.c ; ./a.out 
17981469994392165153
>$ gcc -O0 driver.c func.c ; ./a.out 
2818598057803777

GCC revision: 247564

Reply via email to