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