From: tromey Date: Tue, 4 Jun 2002 22:09:43 +0000 (+0000) Subject: * jcf-write.c (perform_relocations): Optmize a goto to a goto. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=47c4c0f70f05c1a7ba3baf4b08051896d6ad289a * jcf-write.c (perform_relocations): Optmize a goto to a goto. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54264 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index e05dba1504f..10a4746a8d0 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,7 @@ +2002-06-04 Tom Tromey + + * jcf-write.c (perform_relocations): Optmize a goto to a goto. + 2002-06-04 Michael Koch * gcj.texi (Input Options): Fixed typo. diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 7ddca448448..f419e9f7ad3 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -2677,6 +2677,37 @@ perform_relocations (state) shrink += 3; } + /* Optimize GOTO L; ... L: GOTO X by changing the first goto to + jump directly to X. We're careful here to avoid an infinite + loop if the `goto's themselves form one. We do this + optimization because we can generate a goto-to-goto for some + try/finally blocks. */ + while (reloc != NULL + && reloc->kind == OPCODE_goto_w + && reloc->label != block + && reloc->label->v.chunk->data != NULL + && reloc->label->v.chunk->data[0] == OPCODE_goto) + { + /* Find the reloc for the first instruction of the + destination block. */ + struct jcf_relocation *first_reloc; + for (first_reloc = reloc->label->u.relocations; + first_reloc; + first_reloc = first_reloc->next) + { + if (first_reloc->offset == 1 + && first_reloc->kind == OPCODE_goto_w) + { + reloc->label = first_reloc->label; + break; + } + } + + /* If we didn't do anything, exit the loop. */ + if (first_reloc == NULL) + break; + } + for (reloc = block->u.relocations; reloc != NULL; reloc = reloc->next) { if (reloc->kind == SWITCH_ALIGN_RELOC)