Array bounds checks

Bryce McKinlay bryce@albatross.co.nz
Thu Oct 26 01:39:00 GMT 2000


I was wondering why using "--no-bounds-checks" makes such a big
difference to the performance of a lot of array-heavy code. In a simple
example like the following:
ABC()
{
 int[] ia = new int[24];
 for (int i=0; i < ia.length; i++)
 {
 ia[i] = 32;
 }
}
Should not the optimizer be able to eliminate the bounds check, or at
least move it out of the inner loop? Basically this loop expands to:
for (int i=0; i < ia.length; i++)
 {
 if (i > ia.length) throw ArrayBoundsException;
 ia[i] = 32;
 }
So it seems pretty clear to me that the (i > ia.length) condition can
never be true, especially considering that I'm not making any calls or
doing anything that could change the value of ia, So why can't the
optimizer remove it? This is a snippit of the .s output emitted using
-O2:
 call _Jv_NewArray
 movl %eax, %ebx
 xorl %eax, %eax
 addl 16,ドル %esp
 cmpl 8(%ebx), %eax
 jge .L10
 leal 12(%ebx), %ecx
 .p2align 4
.L5:
 movl 8(%ebx), %edx
 cmpl %edx, %eax
 jae .L11
 movl 32,ドル (%ecx)
 incl %eax
 addl 4,ドル %ecx
 cmpl %edx, %eax
 jl .L5
.L10:
 movl -4(%ebp), %ebx
 movl %ebp, %esp
 popl %ebp
 ret
 .p2align 4,,7
.L11:
 subl 12,ドル %esp
 pushl %eax
 call _Jv_ThrowBadArrayIndex
regards
 [ bryce ]


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /