1 /* src/vm/jit/ifconv/ifconv.c - if-conversion
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #include "vm/jit/codegen-common.h"
37 #include "vm/jit/jit.h"
38 #include "vm/jit/reg.h"
39 #include "vm/jit/show.h"
41 #include "vmcore/method.h"
44 /* patterns for a total number of 3 instructions ******************************/
46 #define IFCONV_PATTERN_3_SIZE sizeof(ifconv_pattern_3) / (sizeof(s4) * 3 * 2)
48 static s4 ifconv_pattern_3[][2][3] = {
68 /* patterns for a total number of 4 instructions ******************************/
70 #define IFCONV_PATTERN_4_SIZE sizeof(ifconv_pattern_4) / (sizeof(s4) * 4 * 2)
72 static s4 ifconv_pattern_4[][2][4] = {
94 /* ifconv_condition_complement *************************************************
96 Table of conditions and their complement. Index with:
98 (ICMD_IFxx - ICMD_IFEQ)
100 ATTENTION: Don't change order! It depends on the Java bytecode opcode!
102 *******************************************************************************/
104 static s4 ifconv_condition_complement[6] = {
105 /* !ICMD_IFEQ */ ICMD_IFNE,
106 /* !ICMD_IFNE */ ICMD_IFEQ,
107 /* !ICMD_IFLT */ ICMD_IFGE,
108 /* !ICMD_IFGE */ ICMD_IFLT,
109 /* !ICMD_IFGT */ ICMD_IFLE,
110 /* !ICMD_IFLE */ ICMD_IFGT,
114 /* ifconv_static ***************************************************************
116 Does if-conversion with static data based on pattern matching.
118 *******************************************************************************/
120 static void check(jitdata *jd, basicblock *bptr);
122 bool ifconv_static(jitdata *jd)
139 /* get required compiler data */
143 /* iterate over all basic blocks */
145 bptr = jd->basicblocks;
146 bcount = jd->basicblockcount;
148 for (; bcount >= 0; bcount--, bptr++) {
149 /* Deleted basic blocks are just skipped. */
151 if (bptr->flags == BBDELETED)
154 /* We need at least 3 basic blocks including the current one. */
159 /* Only look at the last instruction of the current basic
160 block. All conditional branch instructions are suitable
161 for if-conversion. */
163 iptr = bptr->iinstr + bptr->icount - 1;
201 /* basic blocks can only have 1 predecessor */
203 if ((bptr[1].predecessorcount != 1) ||
204 (bptr[2].predecessorcount != 1))
209 /* only use a fixed size of instructions */
211 icount = bptr[1].icount + bptr[2].icount;
213 /* we only convert less than or equal 4 instructions */
218 /* check which pattern to use */
222 /* just skip basic blocks with length 1 */
229 pattern = (s4 *) ifconv_pattern_3;
230 patternsize = IFCONV_PATTERN_3_SIZE;
234 pattern = (s4 *) ifconv_pattern_4;
235 patternsize = IFCONV_PATTERN_4_SIZE;
239 /* keep compiler happy */
244 /* that should not happen */
246 vm_abort("ifconv_static: invalid instruction count %d", icount);
249 /* Iterate over all patterns of the given pattern. */
251 for (i = 0; i < patternsize; i++) {
252 /* Check the first and the second basic block at the
253 same time. The instructions _MUST NOT_ be
254 reordered in the array before. */
256 tiptr = bptr[1].iinstr;
258 for (j = 0; j < icount; j++, tiptr++) {
261 p = pattern + (icount * 2 * i) + (icount * 0) + j;
265 if (tiptr->opc != opcode)
269 /* found a matching pattern */
274 show_basicblock(jd, &bptr[0]);
275 show_basicblock(jd, &bptr[1]);
276 show_basicblock(jd, &bptr[2]);
277 show_basicblock(jd, &bptr[3]);
281 /* check the condition */
290 condition = ICMD_IFEQ;
299 condition = ICMD_IFNE;
306 condition = ICMD_IFLT;
313 condition = ICMD_IFGE;
320 condition = ICMD_IFGT;
327 condition = ICMD_IFLE;
334 /* keep compiler happy */
338 vm_abort("ifconv_static: invalid opcode: %d", iptr->opc);
341 /* get the condition array index */
343 complement = ifconv_condition_complement[condition - ICMD_IFEQ];
345 /* Set the new instructions, first basic block 1... */
347 tiptr = bptr[1].iinstr;
350 for (; j < bptr[1].icount; j++, tiptr++) {
351 /* get the replacing opcode */
353 p = pattern + (icount * 2 * i) + (icount * 1) + j;
357 /* If we add a NOP, skip the current instruction
358 and set the stack of the next instruction
359 to the previous one. */
361 if (opcode == ICMD_NOP) {
362 tiptr[1].dst = tiptr[-1].dst;
365 /* For the first basic block we have to set the
366 complementary condition. */
368 /* tiptr->opc = opcode | (complement << 8); */
372 /* ...then basic block 2. We split this step, as we
373 have to set different conditions in the blocks. */
375 for (; j < bptr[1].icount + bptr[2].icount; j++, tiptr++) {
376 p = pattern + (icount * 2 * i) + (icount * 1) + j;
378 /* For the first basic block we have to set the
379 complementary condition. */
381 tiptr->opc = *p | (condition << 8);
383 /* if we add a NOP, set the stacks correctly */
385 if (tiptr->opc == ICMD_NOP) {
390 /* tag the conditional branch instruction as conditional */
392 iptr->opc |= condition << 8;
394 /* add the instructions to the current basic block */
396 bptr->icount += icount;
401 show_basicblock(jd, &bptr[0]);
405 /* delete the 2 following basic blocks */
407 bptr[1].flags = BBDELETED;
408 bptr[2].flags = BBDELETED;
412 /* we had a match, exit this iteration */
422 /* everything's ok */
427 static void check(jitdata *jd, basicblock *bptr)
432 /* get required compiler data */
439 java.lang.reflect.Modifier.isPublic(I)Z
441 [ ] L000(5 - 0) flags=1:
442 [ i00] 0 (line: 227) ICONST 0 (0x00000000)
443 [ l00 i00] 1 (line: 227) ILOAD 0
444 [ r15 i00] 2 (line: 227) IANDCONST 1 (0x00000001)
445 [ r15 i00] 3 (line: 227) NOP
446 [ i00] 4 (line: 227) IFEQ 0 (0x00000000) L002
448 [ i00] L001(2 - 1) flags=1:
449 [ ] 0 (line: 227) POP
450 [ i00] 1 (line: 227) ICONST 1 (0x00000001)
452 [ i00] L002(1 - 2) flags=1:
453 [ ] 0 (line: 227) IRETURN
456 if ((bptr[1].icount == 2) &&
457 (bptr[1].iinstr[0].opc == ICMD_POP) &&
458 (bptr[1].iinstr[1].opc == ICMD_ICONST))
466 java.util.Hashtable.isEmpty()Z PUBLIC SYNCHRONIZED
468 [ ] L000(3 - 0) flags=1:
469 [ l00] 0 (line: 292) ALOAD 0
470 [ rdi] 1 (line: 292) GETFIELD 36, java.util.Hashtable.size (type I
472 [ ] 2 (line: 292) IFNE 0 (0x00000000) L002
474 [ ] L001(2 - 1) flags=1:
475 [ rdi] 0 (line: 292) ICONST 1 (0x00000001)
476 [ ] 1 (line: 292) IRETURN
478 [ ] L002(2 - 1) flags=1:
479 [ rdi] 0 (line: 292) ICONST 0 (0x00000000)
480 [ ] 1 (line: 292) IRETURN
483 if ((bptr[1].icount == 2) &&
484 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
485 (bptr[1].iinstr[1].opc == ICMD_IRETURN) &&
487 (bptr[2].icount == 2) &&
488 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
489 (bptr[2].iinstr[1].opc == ICMD_IRETURN))
495 this seems to be the most common and simplest if, check for all types
500 if ((bptr[1].icount == 2) &&
501 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
502 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
504 (bptr[2].icount == 1) &&
505 (bptr[2].iinstr[0].opc == ICMD_ICONST))
510 if ((bptr[1].icount == 2) &&
511 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
512 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
514 (bptr[2].icount == 1) &&
515 (bptr[2].iinstr[0].opc == ICMD_LCONST))
520 if ((bptr[1].icount == 2) &&
521 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
522 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
524 (bptr[2].icount == 1) &&
525 (bptr[2].iinstr[0].opc == ICMD_ACONST))
530 if ((bptr[1].icount == 2) &&
531 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
532 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
534 (bptr[2].icount == 1) &&
535 (bptr[2].iinstr[0].opc == ICMD_FCONST))
540 if ((bptr[1].icount == 2) &&
541 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
542 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
544 (bptr[2].icount == 1) &&
545 (bptr[2].iinstr[0].opc == ICMD_DCONST))
553 if ((bptr[1].icount == 2) &&
554 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
555 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
557 (bptr[2].icount == 1) &&
558 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
563 if ((bptr[1].icount == 2) &&
564 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
565 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
567 (bptr[2].icount == 1) &&
568 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
573 if ((bptr[1].icount == 2) &&
574 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
575 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
577 (bptr[2].icount == 1) &&
578 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
583 if ((bptr[1].icount == 2) &&
584 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
585 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
587 (bptr[2].icount == 1) &&
588 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
593 if ((bptr[1].icount == 2) &&
594 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
595 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
597 (bptr[2].icount == 1) &&
598 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
603 /* xCONST, GOTO - xLOAD */
605 if ((bptr[1].icount == 2) &&
606 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
607 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
609 (bptr[2].icount == 1) &&
610 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
615 if ((bptr[1].icount == 2) &&
616 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
617 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
619 (bptr[2].icount == 1) &&
620 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
625 if ((bptr[1].icount == 2) &&
626 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
627 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
629 (bptr[2].icount == 1) &&
630 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
635 if ((bptr[1].icount == 2) &&
636 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
637 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
639 (bptr[2].icount == 1) &&
640 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
645 if ((bptr[1].icount == 2) &&
646 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
647 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
649 (bptr[2].icount == 1) &&
650 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
655 /* xLOAD, GOTO - xCONST */
657 if ((bptr[1].icount == 2) &&
658 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
659 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
661 (bptr[2].icount == 1) &&
662 (bptr[2].iinstr[0].opc == ICMD_ICONST))
667 if ((bptr[1].icount == 2) &&
668 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
669 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
671 (bptr[2].icount == 1) &&
672 (bptr[2].iinstr[0].opc == ICMD_LCONST))
677 if ((bptr[1].icount == 2) &&
678 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
679 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
681 (bptr[2].icount == 1) &&
682 (bptr[2].iinstr[0].opc == ICMD_ACONST))
687 if ((bptr[1].icount == 2) &&
688 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
689 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
691 (bptr[2].icount == 1) &&
692 (bptr[2].iinstr[0].opc == ICMD_FCONST))
697 if ((bptr[1].icount == 2) &&
698 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
699 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
701 (bptr[2].icount == 1) &&
702 (bptr[2].iinstr[0].opc == ICMD_DCONST))
708 check for different ISTORE destinations or handle them properly
711 if ((bptr[1].icount == 3) &&
712 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
713 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
714 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
716 (bptr[2].icount == 2) &&
717 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
718 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
723 if ((bptr[1].icount == 3) &&
724 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
725 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
726 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
728 (bptr[2].icount == 2) &&
729 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
730 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
735 if ((bptr[1].icount == 3) &&
736 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
737 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
738 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
740 (bptr[2].icount == 2) &&
741 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
742 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
748 /* ALOAD, GETFIELD - ALOAD, GETFIELD */
750 if ((bptr[1].icount == 3) &&
751 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
752 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
753 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
755 (bptr[2].icount == 2) &&
756 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
757 (bptr[2].iinstr[1].opc == ICMD_GETFIELD))
763 /* ALOAD, ICONST, PUTFIELD - ALOAD, ICONST, PUTFIELD */
765 if ((bptr[1].icount == 4) &&
766 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
767 (bptr[1].iinstr[1].opc == ICMD_ICONST) &&
768 (bptr[1].iinstr[2].opc == ICMD_PUTFIELD) &&
769 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
771 (bptr[2].icount == 3) &&
772 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
773 (bptr[2].iinstr[1].opc == ICMD_ICONST) &&
774 (bptr[2].iinstr[2].opc == ICMD_PUTFIELD)
780 if ((bptr[1].icount == 4) &&
781 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
782 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
783 (bptr[1].iinstr[2].opc == ICMD_ASTORE) &&
784 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
786 (bptr[2].icount == 3) &&
787 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
788 (bptr[2].iinstr[1].opc == ICMD_GETFIELD) &&
789 (bptr[2].iinstr[2].opc == ICMD_ASTORE)
795 if ((bptr[1].icount == 2) &&
796 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
797 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
799 (bptr[2].icount == 1) &&
800 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
805 if ((bptr[1].icount == 3) &&
806 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
807 (bptr[1].iinstr[1].opc == ICMD_ASTORE) &&
808 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
810 (bptr[2].icount == 2) &&
811 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC) &&
812 (bptr[2].iinstr[1].opc == ICMD_ASTORE))
817 if ((bptr[1].icount == 2) &&
818 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
819 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
821 (bptr[2].icount == 1) &&
822 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
827 if ((bptr[1].icount == 2) &&
828 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
829 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
831 (bptr[2].icount == 1) &&
832 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
838 if ((bptr[1].icount == 3) &&
839 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
840 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
841 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
843 (bptr[2].icount == 1) &&
844 (bptr[2].iinstr[0].opc == ICMD_ICONST))
849 if ((bptr[1].icount == 3) &&
850 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
851 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
852 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
854 (bptr[2].icount == 1) &&
855 (bptr[2].iinstr[0].opc == ICMD_LCONST))
860 if ((bptr[1].icount == 3) &&
861 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
862 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
863 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
865 (bptr[2].icount == 1) &&
866 (bptr[2].iinstr[0].opc == ICMD_ACONST))
871 if ((bptr[1].icount == 3) &&
872 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
873 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
874 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
876 (bptr[2].icount == 1) &&
877 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
882 if ((bptr[1].icount == 3) &&
883 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
884 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
885 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
887 (bptr[2].icount == 1) &&
888 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
893 if ((bptr[1].icount == 3) &&
894 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
895 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
896 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
898 (bptr[2].icount == 1) &&
899 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
906 CHECK 3 : (BB: 0) IFEQ javax.swing.plaf.basic.BasicInternalFrameTitlePane.paintTitleBackground(Ljava/awt/Graphics;)V PROTECTED
907 [ ? ? ? ? ? ] L001(instruction count: 4, predecessors: 1):
908 [ ? ? ? ? ? ] 0 (line: 909) ALOAD 0
909 [ ? ? ? ? ? ] 1 (line: 909) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.selectedTitleColor (type Ljava/awt/Color;)
910 [ ? ? ? ? ? ] 2 (line: 909) ASTORE 4
911 [ ? ? ? ? ? ] 3 (line: 909) GOTO op1=41
912 [ ? ? ? ? ? ] L002(instruction count: 3, predecessors: 1):
913 [ ? ? ? ? ? ] 0 (line: 911) ALOAD 0
914 [ ? ? ? ? ? ] 1 (line: 911) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.notSelectedTitleColor (type Ljava/awt/Color;)
915 [ ? ? ? ? ? ] 2 (line: 911) ASTORE 4
918 CHECK 3 : (BB: 3) IFEQ javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(Ljava/awt/event/MouseEvent;)V PUBLIC
919 [ ? ? ? ? ? ] L004(instruction count: 4, predecessors: 1):
920 [ ? ? ? ? ? ] 0 (line: 2244) ACONST 0x3602d30, String = "Tree.openIcon"
921 [ ? ? ? ? ? ] 1 (line: 2244) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
922 [ ? ? ? ? ? ] 2 (line: 2244) ASTORE 8
923 [ ? ? ? ? ? ] 3 (line: 2244) GOTO op1=155
924 [ ? ? ? ? ? ] L005(instruction count: 3, predecessors: 1):
925 [ ? ? ? ? ? ] 0 (line: 2246) ACONST 0x3602e00, String = "Tree.closedIcon"
926 [ ? ? ? ? ? ] 1 (line: 2246) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
927 [ ? ? ? ? ? ] 2 (line: 2246) ASTORE 8
930 CHECK 3 : (BB: 2) IFEQ javax.naming.CompoundName.initializeSyntax()V PRIVATE FINAL
931 [ ? ? ? ? ] L003(instruction count: 4, predecessors: 1):
932 [ ? ? ? ? ] 0 (line: 445) ALOAD 0
933 [ ? ? ? ? ] 1 (line: 445) ICONST 1 (0x00000001)
934 [ ? ? ? ? ] 2 (line: 445) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
935 [ ? ? ? ? ] 3 (line: 445) GOTO op1=51
936 [ ? ? ? ? ] L004(instruction count: 3, predecessors: 1):
937 [ ? ? ? ? ] 0 (line: 449) ALOAD 0
938 [ ? ? ? ? ] 1 (line: 449) ICONST 0 (0x00000000)
939 [ ? ? ? ? ] 2 (line: 449) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
942 CHECK 3 : (BB: 15) IFNE java.awt.Scrollbar.setValues(IIII)V PUBLIC SYNCHRONIZED
943 [ ? ? ? ? ? ] L016(instruction count: 4, predecessors: 1):
944 [ ? ? ? ? ? ] 0 (line: 371) ALOAD 0
945 [ ? ? ? ? ? ] 1 (line: 371) ICONST 1 (0x00000001)
946 [ ? ? ? ? ? ] 2 (line: 371) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
947 [ ? ? ? ? ? ] 3 (line: 371) GOTO op1=152
948 [ ? ? ? ? ? ] L017(instruction count: 3, predecessors: 1):
949 [ ? ? ? ? ? ] 0 (line: 373) ALOAD 0
950 [ ? ? ? ? ? ] 1 (line: 373) ILOAD 6
951 [ ? ? ? ? ? ] 2 (line: 373) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
954 CHECK 3 : (BB: 1) IFEQ javax.swing.JInternalFrame.setIcon(Z)V PUBLIC
955 [ ? ? ? ? ] L002(instruction count: 4, predecessors: 1):
956 [ ? ? ? ? ] 0 (line: 1395) ALOAD 0
957 [ ? ? ? ? ] 1 (line: 1395) ICONST 25552 (0x000063d0)
958 [ ? ? ? ? ] 2 (line: 1395) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
959 [ ? ? ? ? ] 3 (line: 1395) GOTO op1=61
960 [ ? ? ? ? ] L003(instruction count: 3, predecessors: 1):
961 [ ? ? ? ? ] 0 (line: 1397) ALOAD 0
962 [ ? ? ? ? ] 1 (line: 1397) ICONST 25553 (0x000063d1)
963 [ ? ? ? ? ] 2 (line: 1397) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
969 printf("PATTERN %02d: (BB: %3d) ", pattern, jd->basicblockcount - bptr->nr);
972 /* if (pattern == 27) { */
973 /* show_basicblock(m, cd, &bptr[1]); */
974 /* show_basicblock(m, cd, &bptr[2]); */
980 if ((bptr[1].icount == 2) &&
981 (bptr[2].icount == 1) &&
983 (bptr[1].iinstr[1].opc == ICMD_GOTO))
985 printf("CHECK 1 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
988 show_basicblock(jd, &bptr[1]);
989 show_basicblock(jd, &bptr[2]);
994 if ((bptr[1].icount == 3) &&
995 (bptr[2].icount == 2) &&
997 (bptr[1].iinstr[2].opc == ICMD_GOTO))
999 printf("CHECK 2 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1002 show_basicblock(jd, &bptr[1]);
1003 show_basicblock(jd, &bptr[2]);
1008 if ((bptr[1].icount == 4) &&
1009 (bptr[2].icount == 3) &&
1011 (bptr[1].iinstr[3].opc == ICMD_GOTO))
1013 printf("CHECK 3 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1016 show_basicblock(jd, &bptr[1]);
1017 show_basicblock(jd, &bptr[2]);
1022 if ((bptr[1].icount == 3) &&
1023 (bptr[2].icount == 1) &&
1025 (bptr[1].iinstr[2].opc == ICMD_GOTO))
1027 printf("CHECK 4 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1030 show_basicblock(jd, &bptr[1]);
1031 show_basicblock(jd, &bptr[2]);
1036 #endif /* !defined(NDEBUG) */
1041 * These are local overrides for various environment variables in Emacs.
1042 * Please do not remove this and leave it at the end of the file, where
1043 * Emacs will automagically detect them.
1044 * ---------------------------------------------------------------------
1047 * indent-tabs-mode: t
1051 * vim:noexpandtab:sw=4:ts=4: