1 /* src/vm/jit/optimizing/ifconv.c - if-conversion
3 Copyright (C) 1996-2005, 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
32 #include "vm/method.h"
35 #include "vm/jit/codegen-common.h"
36 #include "vm/jit/jit.hpp"
37 #include "vm/jit/reg.h"
38 #include "vm/jit/show.h"
41 /* patterns for a total number of 3 instructions ******************************/
43 #define IFCONV_PATTERN_3_SIZE sizeof(ifconv_pattern_3) / (sizeof(s4) * 3 * 2)
45 static s4 ifconv_pattern_3[][2][3] = {
65 /* patterns for a total number of 4 instructions ******************************/
67 #define IFCONV_PATTERN_4_SIZE sizeof(ifconv_pattern_4) / (sizeof(s4) * 4 * 2)
69 static s4 ifconv_pattern_4[][2][4] = {
91 /* ifconv_condition_complement *************************************************
93 Table of conditions and their complement. Index with:
95 (ICMD_IFxx - ICMD_IFEQ)
97 ATTENTION: Don't change order! It depends on the Java bytecode opcode!
99 *******************************************************************************/
101 static s4 ifconv_condition_complement[6] = {
102 /* !ICMD_IFEQ */ ICMD_IFNE,
103 /* !ICMD_IFNE */ ICMD_IFEQ,
104 /* !ICMD_IFLT */ ICMD_IFGE,
105 /* !ICMD_IFGE */ ICMD_IFLT,
106 /* !ICMD_IFGT */ ICMD_IFLE,
107 /* !ICMD_IFLE */ ICMD_IFGT,
111 /* ifconv_static ***************************************************************
113 Does if-conversion with static data based on pattern matching.
115 *******************************************************************************/
117 static void check(jitdata *jd, basicblock *bptr);
119 bool ifconv_static(jitdata *jd)
136 /* get required compiler data */
140 /* iterate over all basic blocks */
142 bptr = jd->basicblocks;
143 bcount = jd->basicblockcount;
145 for (; bcount >= 0; bcount--, bptr++) {
146 /* Deleted basic blocks are just skipped. */
148 if (bptr->flags == BBDELETED)
151 /* We need at least 3 basic blocks including the current one. */
156 /* Only look at the last instruction of the current basic
157 block. All conditional branch instructions are suitable
158 for if-conversion. */
160 iptr = bptr->iinstr + bptr->icount - 1;
198 /* basic blocks can only have 1 predecessor */
200 if ((bptr[1].predecessorcount != 1) ||
201 (bptr[2].predecessorcount != 1))
206 /* only use a fixed size of instructions */
208 icount = bptr[1].icount + bptr[2].icount;
210 /* we only convert less than or equal 4 instructions */
215 /* check which pattern to use */
219 /* just skip basic blocks with length 1 */
226 pattern = (s4 *) ifconv_pattern_3;
227 patternsize = IFCONV_PATTERN_3_SIZE;
231 pattern = (s4 *) ifconv_pattern_4;
232 patternsize = IFCONV_PATTERN_4_SIZE;
236 /* keep compiler happy */
241 /* that should not happen */
243 vm_abort("ifconv_static: invalid instruction count %d", icount);
246 /* Iterate over all patterns of the given pattern. */
248 for (i = 0; i < patternsize; i++) {
249 /* Check the first and the second basic block at the
250 same time. The instructions _MUST NOT_ be
251 reordered in the array before. */
253 tiptr = bptr[1].iinstr;
255 for (j = 0; j < icount; j++, tiptr++) {
258 p = pattern + (icount * 2 * i) + (icount * 0) + j;
262 if (tiptr->opc != opcode)
266 /* found a matching pattern */
271 show_basicblock(jd, &bptr[0]);
272 show_basicblock(jd, &bptr[1]);
273 show_basicblock(jd, &bptr[2]);
274 show_basicblock(jd, &bptr[3]);
278 /* check the condition */
287 condition = ICMD_IFEQ;
296 condition = ICMD_IFNE;
303 condition = ICMD_IFLT;
310 condition = ICMD_IFGE;
317 condition = ICMD_IFGT;
324 condition = ICMD_IFLE;
331 /* keep compiler happy */
335 vm_abort("ifconv_static: invalid opcode: %d", iptr->opc);
338 /* get the condition array index */
340 complement = ifconv_condition_complement[condition - ICMD_IFEQ];
342 /* Set the new instructions, first basic block 1... */
344 tiptr = bptr[1].iinstr;
347 for (; j < bptr[1].icount; j++, tiptr++) {
348 /* get the replacing opcode */
350 p = pattern + (icount * 2 * i) + (icount * 1) + j;
354 /* If we add a NOP, skip the current instruction
355 and set the stack of the next instruction
356 to the previous one. */
358 if (opcode == ICMD_NOP) {
359 tiptr[1].dst = tiptr[-1].dst;
362 /* For the first basic block we have to set the
363 complementary condition. */
365 /* tiptr->opc = opcode | (complement << 8); */
369 /* ...then basic block 2. We split this step, as we
370 have to set different conditions in the blocks. */
372 for (; j < bptr[1].icount + bptr[2].icount; j++, tiptr++) {
373 p = pattern + (icount * 2 * i) + (icount * 1) + j;
375 /* For the first basic block we have to set the
376 complementary condition. */
378 tiptr->opc = *p | (condition << 8);
380 /* if we add a NOP, set the stacks correctly */
382 if (tiptr->opc == ICMD_NOP) {
387 /* tag the conditional branch instruction as conditional */
389 iptr->opc |= condition << 8;
391 /* add the instructions to the current basic block */
393 bptr->icount += icount;
398 show_basicblock(jd, &bptr[0]);
402 /* delete the 2 following basic blocks */
404 bptr[1].flags = BBDELETED;
405 bptr[2].flags = BBDELETED;
409 /* we had a match, exit this iteration */
419 /* everything's ok */
424 static void check(jitdata *jd, basicblock *bptr)
429 /* get required compiler data */
436 java.lang.reflect.Modifier.isPublic(I)Z
438 [ ] L000(5 - 0) flags=1:
439 [ i00] 0 (line: 227) ICONST 0 (0x00000000)
440 [ l00 i00] 1 (line: 227) ILOAD 0
441 [ r15 i00] 2 (line: 227) IANDCONST 1 (0x00000001)
442 [ r15 i00] 3 (line: 227) NOP
443 [ i00] 4 (line: 227) IFEQ 0 (0x00000000) L002
445 [ i00] L001(2 - 1) flags=1:
446 [ ] 0 (line: 227) POP
447 [ i00] 1 (line: 227) ICONST 1 (0x00000001)
449 [ i00] L002(1 - 2) flags=1:
450 [ ] 0 (line: 227) IRETURN
453 if ((bptr[1].icount == 2) &&
454 (bptr[1].iinstr[0].opc == ICMD_POP) &&
455 (bptr[1].iinstr[1].opc == ICMD_ICONST))
463 java.util.Hashtable.isEmpty()Z PUBLIC SYNCHRONIZED
465 [ ] L000(3 - 0) flags=1:
466 [ l00] 0 (line: 292) ALOAD 0
467 [ rdi] 1 (line: 292) GETFIELD 36, java.util.Hashtable.size (type I
469 [ ] 2 (line: 292) IFNE 0 (0x00000000) L002
471 [ ] L001(2 - 1) flags=1:
472 [ rdi] 0 (line: 292) ICONST 1 (0x00000001)
473 [ ] 1 (line: 292) IRETURN
475 [ ] L002(2 - 1) flags=1:
476 [ rdi] 0 (line: 292) ICONST 0 (0x00000000)
477 [ ] 1 (line: 292) IRETURN
480 if ((bptr[1].icount == 2) &&
481 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
482 (bptr[1].iinstr[1].opc == ICMD_IRETURN) &&
484 (bptr[2].icount == 2) &&
485 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
486 (bptr[2].iinstr[1].opc == ICMD_IRETURN))
492 this seems to be the most common and simplest if, check for all types
497 if ((bptr[1].icount == 2) &&
498 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
499 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
501 (bptr[2].icount == 1) &&
502 (bptr[2].iinstr[0].opc == ICMD_ICONST))
507 if ((bptr[1].icount == 2) &&
508 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
509 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
511 (bptr[2].icount == 1) &&
512 (bptr[2].iinstr[0].opc == ICMD_LCONST))
517 if ((bptr[1].icount == 2) &&
518 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
519 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
521 (bptr[2].icount == 1) &&
522 (bptr[2].iinstr[0].opc == ICMD_ACONST))
527 if ((bptr[1].icount == 2) &&
528 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
529 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
531 (bptr[2].icount == 1) &&
532 (bptr[2].iinstr[0].opc == ICMD_FCONST))
537 if ((bptr[1].icount == 2) &&
538 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
539 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
541 (bptr[2].icount == 1) &&
542 (bptr[2].iinstr[0].opc == ICMD_DCONST))
550 if ((bptr[1].icount == 2) &&
551 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
552 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
554 (bptr[2].icount == 1) &&
555 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
560 if ((bptr[1].icount == 2) &&
561 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
562 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
564 (bptr[2].icount == 1) &&
565 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
570 if ((bptr[1].icount == 2) &&
571 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
572 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
574 (bptr[2].icount == 1) &&
575 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
580 if ((bptr[1].icount == 2) &&
581 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
582 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
584 (bptr[2].icount == 1) &&
585 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
590 if ((bptr[1].icount == 2) &&
591 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
592 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
594 (bptr[2].icount == 1) &&
595 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
600 /* xCONST, GOTO - xLOAD */
602 if ((bptr[1].icount == 2) &&
603 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
604 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
606 (bptr[2].icount == 1) &&
607 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
612 if ((bptr[1].icount == 2) &&
613 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
614 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
616 (bptr[2].icount == 1) &&
617 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
622 if ((bptr[1].icount == 2) &&
623 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
624 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
626 (bptr[2].icount == 1) &&
627 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
632 if ((bptr[1].icount == 2) &&
633 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
634 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
636 (bptr[2].icount == 1) &&
637 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
642 if ((bptr[1].icount == 2) &&
643 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
644 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
646 (bptr[2].icount == 1) &&
647 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
652 /* xLOAD, GOTO - xCONST */
654 if ((bptr[1].icount == 2) &&
655 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
656 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
658 (bptr[2].icount == 1) &&
659 (bptr[2].iinstr[0].opc == ICMD_ICONST))
664 if ((bptr[1].icount == 2) &&
665 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
666 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
668 (bptr[2].icount == 1) &&
669 (bptr[2].iinstr[0].opc == ICMD_LCONST))
674 if ((bptr[1].icount == 2) &&
675 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
676 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
678 (bptr[2].icount == 1) &&
679 (bptr[2].iinstr[0].opc == ICMD_ACONST))
684 if ((bptr[1].icount == 2) &&
685 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
686 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
688 (bptr[2].icount == 1) &&
689 (bptr[2].iinstr[0].opc == ICMD_FCONST))
694 if ((bptr[1].icount == 2) &&
695 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
696 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
698 (bptr[2].icount == 1) &&
699 (bptr[2].iinstr[0].opc == ICMD_DCONST))
705 check for different ISTORE destinations or handle them properly
708 if ((bptr[1].icount == 3) &&
709 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
710 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
711 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
713 (bptr[2].icount == 2) &&
714 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
715 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
720 if ((bptr[1].icount == 3) &&
721 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
722 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
723 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
725 (bptr[2].icount == 2) &&
726 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
727 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
732 if ((bptr[1].icount == 3) &&
733 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
734 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
735 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
737 (bptr[2].icount == 2) &&
738 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
739 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
745 /* ALOAD, GETFIELD - ALOAD, GETFIELD */
747 if ((bptr[1].icount == 3) &&
748 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
749 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
750 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
752 (bptr[2].icount == 2) &&
753 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
754 (bptr[2].iinstr[1].opc == ICMD_GETFIELD))
760 /* ALOAD, ICONST, PUTFIELD - ALOAD, ICONST, PUTFIELD */
762 if ((bptr[1].icount == 4) &&
763 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
764 (bptr[1].iinstr[1].opc == ICMD_ICONST) &&
765 (bptr[1].iinstr[2].opc == ICMD_PUTFIELD) &&
766 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
768 (bptr[2].icount == 3) &&
769 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
770 (bptr[2].iinstr[1].opc == ICMD_ICONST) &&
771 (bptr[2].iinstr[2].opc == ICMD_PUTFIELD)
777 if ((bptr[1].icount == 4) &&
778 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
779 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
780 (bptr[1].iinstr[2].opc == ICMD_ASTORE) &&
781 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
783 (bptr[2].icount == 3) &&
784 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
785 (bptr[2].iinstr[1].opc == ICMD_GETFIELD) &&
786 (bptr[2].iinstr[2].opc == ICMD_ASTORE)
792 if ((bptr[1].icount == 2) &&
793 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
794 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
796 (bptr[2].icount == 1) &&
797 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
802 if ((bptr[1].icount == 3) &&
803 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
804 (bptr[1].iinstr[1].opc == ICMD_ASTORE) &&
805 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
807 (bptr[2].icount == 2) &&
808 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC) &&
809 (bptr[2].iinstr[1].opc == ICMD_ASTORE))
814 if ((bptr[1].icount == 2) &&
815 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
816 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
818 (bptr[2].icount == 1) &&
819 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
824 if ((bptr[1].icount == 2) &&
825 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
826 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
828 (bptr[2].icount == 1) &&
829 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
835 if ((bptr[1].icount == 3) &&
836 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
837 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
838 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
840 (bptr[2].icount == 1) &&
841 (bptr[2].iinstr[0].opc == ICMD_ICONST))
846 if ((bptr[1].icount == 3) &&
847 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
848 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
849 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
851 (bptr[2].icount == 1) &&
852 (bptr[2].iinstr[0].opc == ICMD_LCONST))
857 if ((bptr[1].icount == 3) &&
858 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
859 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
860 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
862 (bptr[2].icount == 1) &&
863 (bptr[2].iinstr[0].opc == ICMD_ACONST))
868 if ((bptr[1].icount == 3) &&
869 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
870 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
871 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
873 (bptr[2].icount == 1) &&
874 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
879 if ((bptr[1].icount == 3) &&
880 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
881 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
882 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
884 (bptr[2].icount == 1) &&
885 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
890 if ((bptr[1].icount == 3) &&
891 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
892 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
893 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
895 (bptr[2].icount == 1) &&
896 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
903 CHECK 3 : (BB: 0) IFEQ javax.swing.plaf.basic.BasicInternalFrameTitlePane.paintTitleBackground(Ljava/awt/Graphics;)V PROTECTED
904 [ ? ? ? ? ? ] L001(instruction count: 4, predecessors: 1):
905 [ ? ? ? ? ? ] 0 (line: 909) ALOAD 0
906 [ ? ? ? ? ? ] 1 (line: 909) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.selectedTitleColor (type Ljava/awt/Color;)
907 [ ? ? ? ? ? ] 2 (line: 909) ASTORE 4
908 [ ? ? ? ? ? ] 3 (line: 909) GOTO op1=41
909 [ ? ? ? ? ? ] L002(instruction count: 3, predecessors: 1):
910 [ ? ? ? ? ? ] 0 (line: 911) ALOAD 0
911 [ ? ? ? ? ? ] 1 (line: 911) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.notSelectedTitleColor (type Ljava/awt/Color;)
912 [ ? ? ? ? ? ] 2 (line: 911) ASTORE 4
915 CHECK 3 : (BB: 3) IFEQ javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(Ljava/awt/event/MouseEvent;)V PUBLIC
916 [ ? ? ? ? ? ] L004(instruction count: 4, predecessors: 1):
917 [ ? ? ? ? ? ] 0 (line: 2244) ACONST 0x3602d30, String = "Tree.openIcon"
918 [ ? ? ? ? ? ] 1 (line: 2244) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
919 [ ? ? ? ? ? ] 2 (line: 2244) ASTORE 8
920 [ ? ? ? ? ? ] 3 (line: 2244) GOTO op1=155
921 [ ? ? ? ? ? ] L005(instruction count: 3, predecessors: 1):
922 [ ? ? ? ? ? ] 0 (line: 2246) ACONST 0x3602e00, String = "Tree.closedIcon"
923 [ ? ? ? ? ? ] 1 (line: 2246) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
924 [ ? ? ? ? ? ] 2 (line: 2246) ASTORE 8
927 CHECK 3 : (BB: 2) IFEQ javax.naming.CompoundName.initializeSyntax()V PRIVATE FINAL
928 [ ? ? ? ? ] L003(instruction count: 4, predecessors: 1):
929 [ ? ? ? ? ] 0 (line: 445) ALOAD 0
930 [ ? ? ? ? ] 1 (line: 445) ICONST 1 (0x00000001)
931 [ ? ? ? ? ] 2 (line: 445) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
932 [ ? ? ? ? ] 3 (line: 445) GOTO op1=51
933 [ ? ? ? ? ] L004(instruction count: 3, predecessors: 1):
934 [ ? ? ? ? ] 0 (line: 449) ALOAD 0
935 [ ? ? ? ? ] 1 (line: 449) ICONST 0 (0x00000000)
936 [ ? ? ? ? ] 2 (line: 449) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
939 CHECK 3 : (BB: 15) IFNE java.awt.Scrollbar.setValues(IIII)V PUBLIC SYNCHRONIZED
940 [ ? ? ? ? ? ] L016(instruction count: 4, predecessors: 1):
941 [ ? ? ? ? ? ] 0 (line: 371) ALOAD 0
942 [ ? ? ? ? ? ] 1 (line: 371) ICONST 1 (0x00000001)
943 [ ? ? ? ? ? ] 2 (line: 371) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
944 [ ? ? ? ? ? ] 3 (line: 371) GOTO op1=152
945 [ ? ? ? ? ? ] L017(instruction count: 3, predecessors: 1):
946 [ ? ? ? ? ? ] 0 (line: 373) ALOAD 0
947 [ ? ? ? ? ? ] 1 (line: 373) ILOAD 6
948 [ ? ? ? ? ? ] 2 (line: 373) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
951 CHECK 3 : (BB: 1) IFEQ javax.swing.JInternalFrame.setIcon(Z)V PUBLIC
952 [ ? ? ? ? ] L002(instruction count: 4, predecessors: 1):
953 [ ? ? ? ? ] 0 (line: 1395) ALOAD 0
954 [ ? ? ? ? ] 1 (line: 1395) ICONST 25552 (0x000063d0)
955 [ ? ? ? ? ] 2 (line: 1395) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
956 [ ? ? ? ? ] 3 (line: 1395) GOTO op1=61
957 [ ? ? ? ? ] L003(instruction count: 3, predecessors: 1):
958 [ ? ? ? ? ] 0 (line: 1397) ALOAD 0
959 [ ? ? ? ? ] 1 (line: 1397) ICONST 25553 (0x000063d1)
960 [ ? ? ? ? ] 2 (line: 1397) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
966 printf("PATTERN %02d: (BB: %3d) ", pattern, jd->basicblockcount - bptr->nr);
969 /* if (pattern == 27) { */
970 /* show_basicblock(m, cd, &bptr[1]); */
971 /* show_basicblock(m, cd, &bptr[2]); */
977 if ((bptr[1].icount == 2) &&
978 (bptr[2].icount == 1) &&
980 (bptr[1].iinstr[1].opc == ICMD_GOTO))
982 printf("CHECK 1 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
985 show_basicblock(jd, &bptr[1]);
986 show_basicblock(jd, &bptr[2]);
991 if ((bptr[1].icount == 3) &&
992 (bptr[2].icount == 2) &&
994 (bptr[1].iinstr[2].opc == ICMD_GOTO))
996 printf("CHECK 2 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
999 show_basicblock(jd, &bptr[1]);
1000 show_basicblock(jd, &bptr[2]);
1005 if ((bptr[1].icount == 4) &&
1006 (bptr[2].icount == 3) &&
1008 (bptr[1].iinstr[3].opc == ICMD_GOTO))
1010 printf("CHECK 3 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1013 show_basicblock(jd, &bptr[1]);
1014 show_basicblock(jd, &bptr[2]);
1019 if ((bptr[1].icount == 3) &&
1020 (bptr[2].icount == 1) &&
1022 (bptr[1].iinstr[2].opc == ICMD_GOTO))
1024 printf("CHECK 4 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1027 show_basicblock(jd, &bptr[1]);
1028 show_basicblock(jd, &bptr[2]);
1033 #endif /* !defined(NDEBUG) */
1038 * These are local overrides for various environment variables in Emacs.
1039 * Please do not remove this and leave it at the end of the file, where
1040 * Emacs will automagically detect them.
1041 * ---------------------------------------------------------------------
1044 * indent-tabs-mode: t
1048 * vim:noexpandtab:sw=4:ts=4: