A few Questions on OS X ghc-6.4.3 fix
p.tanski at gmail.com
Sat Oct 21 21:11:58 EDT 2006
On Oct 21, 2006, at 6:23 PM, Ian Lynagh wrote:
> Hi Peter,
> On Sat, Oct 21, 2006 at 05:56:30PM -0400, Peter Tanski wrote:
>> Sorry for yet another typo:
>> #pragma options align=4
>> should have been:
>> #pragma options align=power
>> A definition might be:
>> #if powerpc_HOST_ARCH
>> #define ALIGN_POWER "#pragma options align=power"
>> #define ALIGN_POWER_RESET "#pragma options align=reset"
>> #define ALIGN_POWER
>> #define ALIGN_POWER_RESET
>> I will try this out and see if the resulting code is any cleaner.
> I can't find the context for this - is this a fix for something that's
> broken, a performance improvement or something else? If it's a fix, do
> you have an example that goes wrong?
> Also, do you know if it is OS X specific, or if it would also apply to
> PPC Linux?
Sorry for the out-of-context statement. You may not have read the
email I cc'd to cvs-ghc at haskell.org, so I will send a copy of that
separately. In short, I had mentioned that Zero Length Array (ZLA)
members may require gnu extensions for support and only buy a
moderate amount of space and I suggested that using pragmas (at the
time I was thinking of packing the alignment) would save the same
amount of space, allow pointers to other structures to be used
instead of ZLA's and might even improve performance.
In this context, I had suggested the option for powerpc systems. It
would not be OS X specific and indeed it would only be a small
enhancement on OS X. An alignment pragma may save some space (on x86
processors which do not vary performance with alignment, as low as 1,
meaning 2^1) for structures and memory in general. On RISC
processors proper alignment may improve performance over what we have
now but I was wrong about the improvement #pragma options align=power
would make on all OS X systems.
After reading through the documentation on alignment again and some
assembler output code, it turns out the default alignment for Darwin
(OS X) 32-bit systems is the ABI alignment (which, in turn, defines
alignment for power systems): the alignment for a struct is
essentially the alignment of its largest member, though internally
the alignment of members after the first have an embedding alignment
of their natural size or at most 4 bytes (alignment of 2). Structs
containing doubles or long longs would improve with special pragmas,
but there aren't many of either in the RTS. In other words, no
improvement at all, except that it might--I have not deciphered the
assembler yet--help reduce packing extra space for ZLA members if the
ZLA's were packed to size 4 so they could contain the first member of
the next container. On 64-bit and powerpc-Linux systems the default
alignment given by gcc is 'natural,' which is the alignment of the
members of the structure (a structure may be aligned at 1, 2, 4, 8 or
16 bytes. So on x86 Windows packing the members of a struct (also
avaliable on Microsoft's CL compiler) would save some space and
alignment might make a difference on powerpc-Linux and other RISC
systems. Just an idea I had to try out. I hope none of this would
create more work for you.
More information about the Cvs-ghc