Thread: AW: AW: Could turn on -O2 in AIX

AW: AW: Could turn on -O2 in AIX

From
Zeugswetter Andreas SB
Date:
> There is a special case in nabstime.h for AIX, which imho
> got swapped. The normal case for me would be INT_MIN
> and not the 0x80000001.
> There is a comment that I don't understand at all given the below 
> source code:
> 
> /*
>  * AIX considers 2147483648 == -2147483648 (since they have 
> the same bit
>  * representation) but uses a different sign sense in a comparison to
>  * these integer constants depending on whether the constant is signed
>  * or not!
>  */
> #if defined (_AIX)
> #define NOSTART_ABSTIME ((AbsoluteTime) INT_MIN)
> #else 
> #define NOSTART_ABSTIME ((AbsoluteTime) 0x80000001)           
>   /* -2147483647 (- 2^31) */
> #endif
> 
> 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.

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.

Please apply the patch and all works well.

Thanks
Andreas


Re: AW: AW: Could turn on -O2 in AIX

From
Tom Lane
Date:
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


Re: AW: AW: Could turn on -O2 in AIX

From
Tom Lane
Date:
>> 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?

I went ahead and committed this change, since Thomas hasn't weighed in
with an objection ...
        regards, tom lane


Re: AW: AW: Could turn on -O2 in AIX

From
Thomas Lockhart
Date:
> >> 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?
> I went ahead and committed this change, since Thomas hasn't weighed in
> with an objection ...

Hmm. I've been seeing a lot of followup messages to threads I don't
recall getting. Presumably all related to a combination of getting
auto-unsubscribed to -hackers :(, traveling and getting mail on my
laptop, and converting service at home over to DSL.

Hopefully this will all settle down here in the next few days.

Is the original issue support for 0x10... as the smallest integer, as
opposed to -MAX_INT? As long as we continue to map the "reserved values"
to the upper and lower range of allowed values so they are unlikely to
appear under normal circumstances, the change should be OK.
                  - Thomas


Re: AW: AW: Could turn on -O2 in AIX

From
Tom Lane
Date:
Thomas Lockhart <lockhart@alumni.caltech.edu> writes:
> Is the original issue support for 0x10... as the smallest integer, as
> opposed to -MAX_INT? As long as we continue to map the "reserved values"
> to the upper and lower range of allowed values so they are unlikely to
> appear under normal circumstances, the change should be OK.

I think that the original problem was that Andreas was seeing a compiler
codegen bug on AIX, having to do with the comparisonfoo > INT_MIN
generated by the AbsoluteTimeIsReal macro.  I think he was seeing that
the compiler insisted on generating an unsigned compare, explicit casts
to signed datatypes notwithstanding :-(.

The proposed fix was to recode the macro's test as foo != INT_MIN,
thereby avoiding the issue of whether the comparison is signed or not.
To do that, we needed to make NOSTART_ABSTIME be defined as INT_MIN
on all platforms, not only AIX.  That seemed like a good general-purpose
approach to me anyway, since the intended meaning of 0x80000000 was very
unclear otherwise.
        regards, tom lane

PS: I'm quite sure that I'd explicitly cc'd you on the prior discussion.
If you didn't see it, then you've lost personal mail, not only pghackers
traffic...


Re: AW: AW: Could turn on -O2 in AIX

From
Bruce Momjian
Date:
Tom, can you remind me where we left this?

> 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 sense in 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 sense in 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
> 


--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: AW: AW: Could turn on -O2 in AIX

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Tom, can you remind me where we left this?

It's done ...
        regards, tom lane