[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