[Bug java/18190] [4.2/4.3/4.4 regression] primitive array optimization is gone

rguenth at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Fri Mar 20 22:44:00 GMT 2009



------- Comment #13 from rguenth at gcc dot gnu dot org  2009-03-20 22:44 -------
It at least still happens with 4.3 and I have no belief that it is fixed with
4.4 if comment #3 applies.  Code generated is also absymal (-O2):

_ZN1t18__U3c_clinit__U3e_EJvv:
.LFB2:
        pushl   %ebp
.LCFI0:
        movl    %esp, %ebp
.LCFI1:
        subl    $8, %esp
.LCFI2:
        movl    $4, 4(%esp)
        movl    $_Jv_intClass, (%esp)
        call    _Jv_NewPrimArray
        movl    4(%eax), %edx
        testl   %edx, %edx
        je      .L8
        cmpl    $1, %edx
        movl    $5, 8(%eax)
        jbe     .L9
        cmpl    $2, %edx
        movl    $7, 12(%eax)
        jbe     .L10
        cmpl    $3, %edx
        movl    $9, 16(%eax)
        jbe     .L11
        movl    $11, 20(%eax)
        movl    %eax, _ZN1t1xE
        leave
        ret
.L8:
        movl    $0, (%esp)
        call    _Jv_ThrowBadArrayIndex
.L9:
        movl    $1, (%esp)
        call    _Jv_ThrowBadArrayIndex
.L10:
        movl    $2, (%esp)
        call    _Jv_ThrowBadArrayIndex
.L11:
        movl    $3, (%esp)
        call    _Jv_ThrowBadArrayIndex

(4.3 again), we do not seem to be able to CSE the load of the array length
on the tree level and we have no way (still) of commoning the calls to
_Jv_ThrowBadArrayIndex either:

<bb 2>:
  D.241 = _Jv_NewPrimArray (&_Jv_intClass, 4);
  D.249 = D.241->length;
  if (D.249 != 0)
    goto <bb 4>;
  else
    goto <bb 3>;

<bb 3>:
  _Jv_ThrowBadArrayIndex (0);

<bb 4>:
  D.241->data[0] = 5;
  D.263 = D.241->length;
  if ((unsigned int) D.263 > 1)
    goto <bb 6>;
  else
    goto <bb 5>;

<bb 5>:
  _Jv_ThrowBadArrayIndex (1);

<bb 6>:
  D.241->data[1] = 7;
  D.277 = D.241->length;
  if ((unsigned int) D.277 > 2)
    goto <bb 8>;
  else
    goto <bb 7>;

<bb 7>:
  _Jv_ThrowBadArrayIndex (2);

<bb 8>:
  D.241->data[2] = 9;
  D.291 = D.241->length;
  if ((unsigned int) D.291 > 3)
    goto <bb 10>;
  else
    goto <bb 9>;

<bb 9>:
  _Jv_ThrowBadArrayIndex (3);

<bb 10>:
  D.241->data[3] = 11;
  x = D.241;
  return;


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18190



More information about the Java-prs mailing list