[LLVMdev] x86-64 large stack offsets

Cameron McInally cameron.mcinally at nyu.edu
Mon Sep 26 12:24:39 PDT 2011


To be pedantic... use of the frame pointer isn't necessary. The stack
pointer would be fine. That's just how GCC calculates the offset for this
test case.

On Monday, September 26, 2011, Cameron McInally <cameron.mcinally at nyu.edu>
wrote:
> Hey guys,
>
> I'm working on a bug for x86-64 in LLVM 2.9. Well, it's actually two
issues. The assembly generated for large stack offsets has an overflow; And,
once the overflow is fixed, the displacement is too large for GNU ld to
handle it.
>
> void fool( int long n )
> {
>   double w[268435600];
>   double z[268435600];
>   unsigned long i;
>   for ( i = 0; i < n; i++ ) {
>     w[i] = 1.0;
>     z[i] = 2.0;
>   }
>   printf(" n: %lld, W %g Z %g\n", n, w[1], z[1] );
> }
>
> Here's one of the offending instructions produced by 2.9:
>
> movsd   -2147482472 <tel:2147482472>(%rsp), %xmm0
>
> Fixing the displacement overflow is pretty easy. It's just a matter of
changing a few variable types in LLVM from unsigned to uint64_t in the
functions that calculate the stack offsets. The real trouble I'm having
> is finding a good place to break up the displacements during lowering. I
would like the offset to be calculated similar to gcc:
>
> movabsq $-4294969640, %rdx
> movsd     0(%rbp,%rdx), %xmm0
>
> Any suggestions on the correct lowering pass to do a transformation like
this? I'm an LLVM noob, so I'm not sure where it should go.
>
> Tx,
> Cameron
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110926/ded4cdc4/attachment.html>


More information about the llvm-dev mailing list