Re: Regression fails on Alpha True64 V5.0 for - Mailing list pgsql-ports
From | Tegge, Bernd |
---|---|
Subject | Re: Regression fails on Alpha True64 V5.0 for |
Date | |
Msg-id | 5.1.0.14.0.20011121091945.0298c300@dragon.dr.repas.de Whole thread Raw |
In response to | Re: Regression fails on Alpha True64 V5.0 for yesterdays cvs (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: Regression fails on Alpha True64 V5.0 for yesterdays cvs
|
List | pgsql-ports |
At 14:27 19.11.01 -0500, Tom Lane wrote: >"Tegge, Bernd" <tegge@repas-aeg.de> writes: > > I've got a rather ugly but usable workaround. See attached timestamp.c > >My, that *is* ugly. Surely there's gotta be something cleaner. > >I don't quite understand how it is that the Compaq compiler works at >all, if it thinks it can optimize random memcpy operations into >opcodes that assume aligned addresses. Well, if both operands are ptr to double and the compiler/runtime system aligns doubles except on explicit request (frex #pragma noalign) the optimizer probably thought it was safe to replace the memcpy by a load/store double operation. It probably should not have done this after casting the pointers to void*, but it did ... > We should be coredumping in a >lot more places than just this. Since we're not, there's got to be >some fairly straightforward way of defeating the optimization. >The extra memcpy looks to me like black magic that doesn't really have >anything directly to do with the problem. I had to use the temp vars after the assignment. Otherwise the compiler optimized them away. Sometimes this thing is amazing. >I'm surprised that the (void *) cast didn't fix it. Perhaps it would >work to use DatumGetPointer rather than DatumGetIntervalP --- that is, >never give the compiler any hint that the source might be considered >double-aligned in the first place. Thanks, *that* did it. We should just extend the comment block above to going back to DatumGetIntervalP if the array code ever gets fixed. *** timestamp.c.bak Wed Nov 21 09:41:35 2001 --- timestamp.c Wed Nov 21 09:44:46 2001 *************** *** 1569,1577 **** * buggy array code: it won't ensure proper alignment of Interval * objects on machines where double requires 8-byte alignment. That * should be fixed, but in the meantime... */ ! memcpy( (void *)&sumX, (void *)DatumGetIntervalP(transdatums[0]), sizeof(Interval)); ! memcpy( (void *)&N, (void *)DatumGetIntervalP(transdatums[1]), sizeof(Interval)); newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl, IntervalPGetDatum(&sumX), IntervalPGetDatum(newval))); --- 1569,1578 ---- * buggy array code: it won't ensure proper alignment of Interval * objects on machines where double requires 8-byte alignment. That * should be fixed, but in the meantime... + * If it ever gets fixed use DatumGetIntervalP instead of DatumGetPointer */ ! memcpy( (void *)&sumX, (void *)DatumGetPointer(transdatums[0]), sizeof(Interval)); ! memcpy( (void *)&N, (void *)DatumGetPointer(transdatums[1]), sizeof(Interval)); newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl, IntervalPGetDatum(&sumX), IntervalPGetDatum(newval))); *************** *** 1606,1614 **** * buggy array code: it won't ensure proper alignment of Interval * objects on machines where double requires 8-byte alignment. That * should be fixed, but in the meantime... */ ! memcpy( (void *)&sumX, (void *)DatumGetIntervalP(transdatums[0]), sizeof(Interval)); ! memcpy( (void *)&N, (void *)DatumGetIntervalP(transdatums[1]), sizeof(Interval)); /* SQL92 defines AVG of no values to be NULL */ if (N.time == 0) PG_RETURN_NULL(); --- 1607,1616 ---- * buggy array code: it won't ensure proper alignment of Interval * objects on machines where double requires 8-byte alignment. That * should be fixed, but in the meantime... + * If it ever gets fixed use DatumGetIntervalP instead of DatumGetPointer */ ! memcpy( (void *)&sumX, (void *)DatumGetPointer(transdatums[0]), sizeof(Interval)); ! memcpy( (void *)&N, (void *)DatumGetPointer(transdatums[1]), sizeof(Interval)); /* SQL92 defines AVG of no values to be NULL */ if (N.time == 0) PG_RETURN_NULL();
pgsql-ports by date: