------- Comment #4 from anton at mips dot complang dot tuwien dot ac dot at  
2005-12-06 21:46 -------
Subject: Re:  pessimization of goto * ("computed goto")

pinskia at gcc dot gnu dot org wrote:
> __asm__(""); makes stuff worse.

I just applied the following patch to engine1.i:

--- engine1.i   2005-12-06 22:34:08.000000000 +0100
+++ engine1.i~  2005-12-06 19:04:12.000000000 +0100
@@ -17562,7 +17562,7 @@
 {
 # 188 "./java.vmg"
 {
-  { if ((aArray) == ((void *)0)) { __asm__(""); goto
*throw_nullpointerexception; } };
+  { if ((aArray) == ((void *)0)) { goto *throw_nullpointerexception; } };
   { if (( ((java_arrayheader*)(aArray))->size ) <= (u4) (iIndex)) {
arrayindexoutofbounds_index = (iIndex); goto
*throw_arrayindexoutofboundsexception; } };
   ;
   vResult = ((((java_intarray*)(aArray))->data)[iIndex]);

The result looks much better; in particular, instead of the

        je      .L995

I now get:

        jne     .L762
        movq    -136(%rbp), %rdx
.LBE46:
        .loc 2 231 0
        jmp     *%rdx
.L762:

I.e., a separate indirect jump for improved branch prediction (not
important in this case, because this indirect branch will rarely be
used).  More importantly, no direct branches to far-away places which
did destroy the relocatability (and thus suitability for "selective
inlining") of this code fragment.

So, no, the code is not worse, but much better.  I hope this
workaround will continue to work in future versions.

- anton


-- 


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

Reply via email to