Hey guys,<br><br>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.<br>
<br>void fool( int long n )<br>{<br>  double w[268435600];<br>  double z[268435600];<br>  unsigned long i;<br>  for ( i = 0; i < n; i++ ) {<br>    w[i] = 1.0;<br>    z[i] = 2.0;<br>  }<br>  printf(" n: %lld, W %g Z %g\n", n, w[1], z[1] );<br>
}<br><br>Here's one of the offending instructions produced by 2.9:<br><br>movsd   -2147482472(%rsp), %xmm0<br><br>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<br>
is finding a good place to break up the displacements during lowering. I would like the offset to be calculated similar to gcc:<br><br>movabsq $-4294969640, %rdx<br>movsd     0(%rbp,%rdx), %xmm0<br><br>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.<br>
<br>Tx,<br>Cameron