Re: AW: AW: Could turn on -O2 in AIX - Mailing list pgsql-hackers

From Tom Lane
Subject Re: AW: AW: Could turn on -O2 in AIX
Date
Msg-id 21643.973891521@sss.pgh.pa.us
Whole thread Raw
In response to AW: AW: Could turn on -O2 in AIX  (Zeugswetter Andreas SB <ZeugswetterA@wien.spardat.at>)
Responses Re: AW: AW: Could turn on -O2 in AIX  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: AW: AW: Could turn on -O2 in AIX  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-hackers
Zeugswetter Andreas SB <ZeugswetterA@wien.spardat.at> writes:
>> But that is unfortunately not the problem. Looks like yet 
>> another broken compiler to me :-(

> Ok, the comparison ((int) time) > ((int) 0x80000001) is the problem.
> Reading the comment again and again, I have come to the conclusion,
> that the intent was originally to avoid INT_MIN on AIX.

No, I think the other way round.  Digging into Postgres 4.2, I find

#if defined(PORTNAME_aix)
/** AIX considers 2147483648 == -2147483648 (since they have the same bit* representation) but uses a different sign
sensein a comparison to * these integer constants depending on whether the constant is signed * or not!*/
 
#include <values.h>
#define NOSTART_ABSTIME    ((AbsoluteTime) HIBITI)        /* - 2^31 */
#else
#define NOSTART_ABSTIME ((AbsoluteTime) 2147483648)    /* - 2^31 */
#endif /* PORTNAME_aix */

where HIBITI must come from a system header, because it doesn't appear
anywhere else in Postgres 4.2.  But I'm betting it was a representation
of 0x80000000.  By the time of our oldest CVS sources, this had
metamorphosed into

#if defined(PORTNAME_aix)
/** AIX considers 2147483648 == -2147483648 (since they have the same bit* representation) but uses a different sign
sensein a comparison to * these integer constants depending on whether the constant is signed * or not!*/
 
#include <values.h>
/*#define NOSTART_ABSTIME       ((AbsoluteTime) HIBITI)        */        /* - 2^31 */
#define NOSTART_ABSTIME      ((AbsoluteTime) INT_MIN)
#else
/*#define NOSTART_ABSTIME ((AbsoluteTime) 2147483648)*/ /* - 2^31 */
#define NOSTART_ABSTIME ((AbsoluteTime) -2147483647)    /* - 2^31 */
#endif /* PORTNAME_aix */

Hard to tell how we got from point A to point B, but it seems
crystal-clear that the *original* author intended to use 0x80000000
on all platforms.

> My solution would be to use INT_MIN for all ports, which has the advantage 
> that the above problematic comparison can be converted to !=,
> since no integer will be smaller than INT_MIN.

I agree.  When I was looking at this code this morning, I was wondering
what INT_MIN was supposed to represent anyway, if NOSTART_ABSTIME is
INT_MIN + 1.  I think someone messed this up between 4.2 and Postgres95.

Thomas, any objection to this plan?
        regards, tom lane


pgsql-hackers by date:

Previous
From: Peter Eisentraut
Date:
Subject: Re: Problems with Perl
Next
From: Tom Lane
Date:
Subject: Re: Problems with Perl