[LLVMdev] x86-64 large stack offsets

Cameron McInally cameron.mcinally at nyu.edu
Mon Sep 26 12:02:41 PDT 2011


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(%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/698907db/attachment.html>


More information about the llvm-dev mailing list