[LLVMdev] x86-64 large stack offsets (original) (raw)

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