[Bug middle-end/86554] New: Incorrect code generation with signed/unsigned comparison
anton at samba dot org
gcc-bugzilla@gcc.gnu.org
Tue Jul 17 20:34:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86554
Bug ID: 86554
Summary: Incorrect code generation with signed/unsigned
comparison
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: anton at samba dot org
Target Milestone: ---
The test case below fails on both ppc64le and x86_64 when built with -O2, I
see:
ret is 1017
ret is < 1
Looking at the code, the < 1 comparison is removed completely.
--
#include <stdio.h>
#include <stdint.h>
struct foo
{
uint32_t x;
};
typedef struct foo foo;
static inline int zot(foo *f)
{
int ret;
if (f->x > 0x7FFFFFFF)
ret = (int)(f->x - 0x7FFFFFFF);
else
ret = (int)f->x - 0x7FFFFFFF;
return ret;
}
void bar(foo *f)
{
int ret = zot(f);
printf("ret is %d\n", ret);
if (ret < 1)
printf("ret is < 1\n");
}
int main(void)
{
foo f;
f.x = 0x800003f8;
bar(&f);
}
More information about the Gcc-bugs
mailing list