We have some legacy code that checks for INT_MIN via the
test "if (x != -x)".

With gcc 4.3.3 this test is optimized out.

Now is this wrong or right to do -- I don't know.  If so, perhaps someone
could describe the reasons for me.

However -- consider the following simple code:

-- cut here (l.c) --

#include <stdio.h>

char *test(long a)
{
    if (a < 0 && (a != -a)) {
        return "right";
    } else {
        return "left";
    }
}

int a;

main()
{
    a = -2147483647;
    printf("%s\n", test(a-1));
}

-- cut here (end of l.c) --

If I compile the code with gcc 4.3.3 and with -O2, the
function "test" seems to be inlined -- and it does what
I want:

$ gcc -O2 -m32 l.c -o ltst
$ ./ltst
left

HOWEVER if I turn off inlining, I get the "wrong" answer that's breaking
our legacy code:

$ gcc -O2 -fno-inline -m32 l.c -o ltst_noinline
$ ./ltst_noinline
right

So regardless of which is correct, they should be consistent, right?


-- 
           Summary: gcc bug when comparing x to -x (linux, 32-bit)
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: daven at model dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41882

Reply via email to