[Bug middle-end/66876] New: vrp: changing unsigned to signed comparison
konstantin.vladimirov at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Jul 15 09:35:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66876
Bug ID: 66876
Summary: vrp: changing unsigned to signed comparison
Product: gcc
Version: 5.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: konstantin.vladimirov at gmail dot com
Target Milestone: ---
Minimized test case (note explicit unsigned long cast):
---
#include <stdlib.h>
int a = 0xecfb39f5;
unsigned short *d = (unsigned short *) &a;
int
main (void)
{
if ((unsigned long) (65536 * d[1] + d[0]) < (1UL << 28))
{
abort ();
}
return 0;
}
---
Compiler version:
---
$ ~/x86-toolchain-5.1/bin/gcc -v
Using built-in specs.
COLLECT_GCC=/home/tilir/x86-toolchain-5.1/bin/gcc
COLLECT_LTO_WRAPPER=/home/tilir/x86-toolchain-5.1/libexec/gcc/x86_64-unknown-linux-gnu/5.1.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-5.1-src/gcc_5_1_0_release/configure
--enable-languages=c,c++ --prefix=/home/tilir/x86-toolchain-5.1/
Thread model: posix
gcc version 5.1.0 (GCC)
---
$ ~/x86-toolchain-5.1/bin/gcc -O2 test.c
$ ./a.out
Aborted
but
$ ~/x86-toolchain-5.1/bin/gcc -O2 test.c -fno-tree-vrp
$ ./a.out
Everything is ok.
Before VRP:
_9 = (unsigned int) _8;
if (_9 <= 268435455)
goto <bb 3>;
else
goto <bb 4>;
On VRP stage:
_8 : --> single use.
_9 = (unsigned int) _8;
_9 : --> single use.
if (_9 <= 268435455)
After VRP:
if (_8 <= 268435455)
goto <bb 3>;
else
goto <bb 4>;
By C11 standard, the rank of unsigned long is equal to rank of long and higher,
then rank of int, so integer promotions here should make unsigned long from
both sides.
More information about the Gcc-bugs
mailing list