1 /* src/vm/jit/ifconv/ifconv.c - if-conversion
3 Copyright (C) 1996-2005, 2006 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
25 Contact: cacao@cacaojvm.org
27 Authors: Christian Thalinger
31 $Id: stack.c 4455 2006-02-06 01:02:59Z edwin $
42 #include "vm/method.h"
43 #include "vm/jit/codegen-common.h"
44 #include "vm/jit/jit.h"
45 #include "vm/jit/reg.h"
46 #include "vm/jit/show.h"
49 /* patterns for a total number of 3 instructions ******************************/
51 #define IFCONV_PATTERN_3_SIZE sizeof(ifconv_pattern_3) / (sizeof(s4) * 3 * 2)
53 static s4 ifconv_pattern_3[][2][3] = {
73 /* patterns for a total number of 4 instructions ******************************/
75 #define IFCONV_PATTERN_4_SIZE sizeof(ifconv_pattern_4) / (sizeof(s4) * 4 * 2)
77 static s4 ifconv_pattern_4[][2][4] = {
99 /* ifconv_condition_complement *************************************************
101 Table of conditions and their complement. Index with:
103 (ICMD_IFxx - ICMD_IFEQ)
105 ATTENTION: Don't change order! It depends on the Java bytecode opcode!
107 *******************************************************************************/
109 static s4 ifconv_condition_complement[6] = {
110 /* !ICMD_IFEQ */ ICMD_IFNE,
111 /* !ICMD_IFNE */ ICMD_IFEQ,
112 /* !ICMD_IFLT */ ICMD_IFGE,
113 /* !ICMD_IFGE */ ICMD_IFLT,
114 /* !ICMD_IFGT */ ICMD_IFLE,
115 /* !ICMD_IFLE */ ICMD_IFGT,
119 /* ifconv_static ***************************************************************
121 Does if-conversion with static data based on pattern matching.
123 *******************************************************************************/
125 static void check(jitdata *jd, basicblock *bptr);
127 bool ifconv_static(jitdata *jd)
144 /* get required compiler data */
148 /* iterate over all basic blocks */
150 bptr = jd->basicblocks;
151 bcount = jd->basicblockcount;
153 for (; bcount >= 0; bcount--, bptr++) {
154 /* Deleted basic blocks are just skipped. */
156 if (bptr->flags == BBDELETED)
159 /* We need at least 3 basic blocks including the current one. */
164 /* Only look at the last instruction of the current basic
165 block. All conditional branch instructions are suitable
166 for if-conversion. */
168 iptr = bptr->iinstr + bptr->icount - 1;
206 /* basic blocks can only have 1 predecessor */
208 if ((bptr[1].predecessorcount != 1) ||
209 (bptr[2].predecessorcount != 1))
214 /* only use a fixed size of instructions */
216 icount = bptr[1].icount + bptr[2].icount;
218 /* we only convert less than or equal 4 instructions */
223 /* check which pattern to use */
227 /* just skip basic blocks with length 1 */
234 pattern = (s4 *) ifconv_pattern_3;
235 patternsize = IFCONV_PATTERN_3_SIZE;
239 pattern = (s4 *) ifconv_pattern_4;
240 patternsize = IFCONV_PATTERN_4_SIZE;
244 /* keep compiler happy */
248 /* that should not happen */
253 /* Iterate over all patterns of the given pattern. */
255 for (i = 0; i < patternsize; i++) {
256 /* Check the first and the second basic block at the
257 same time. The instructions _MUST NOT_ be
258 reordered in the array before. */
260 tiptr = bptr[1].iinstr;
262 for (j = 0; j < icount; j++, tiptr++) {
265 p = pattern + (icount * 2 * i) + (icount * 0) + j;
269 if (tiptr->opc != opcode)
273 /* found a matching pattern */
278 show_basicblock(jd, &bptr[0]);
279 show_basicblock(jd, &bptr[1]);
280 show_basicblock(jd, &bptr[2]);
281 show_basicblock(jd, &bptr[3]);
285 /* check the condition */
294 condition = ICMD_IFEQ;
303 condition = ICMD_IFNE;
310 condition = ICMD_IFLT;
317 condition = ICMD_IFGE;
324 condition = ICMD_IFGT;
331 condition = ICMD_IFLE;
338 /* keep compiler happy */
345 /* get the condition array index */
347 complement = ifconv_condition_complement[condition - ICMD_IFEQ];
349 /* Set the new instructions, first basic block 1... */
351 tiptr = bptr[1].iinstr;
354 for (; j < bptr[1].icount; j++, tiptr++) {
355 /* get the replacing opcode */
357 p = pattern + (icount * 2 * i) + (icount * 1) + j;
361 /* If we add a NOP, skip the current instruction
362 and set the stack of the next instruction
363 to the previous one. */
365 if (opcode == ICMD_NOP) {
366 tiptr[1].dst = tiptr[-1].dst;
369 /* For the first basic block we have to set the
370 complementary condition. */
372 /* tiptr->opc = opcode | (complement << 8); */
376 /* ...then basic block 2. We split this step, as we
377 have to set different conditions in the blocks. */
379 for (; j < bptr[1].icount + bptr[2].icount; j++, tiptr++) {
380 p = pattern + (icount * 2 * i) + (icount * 1) + j;
382 /* For the first basic block we have to set the
383 complementary condition. */
385 tiptr->opc = *p | (condition << 8);
387 /* if we add a NOP, set the stacks correctly */
389 if (tiptr->opc == ICMD_NOP) {
394 /* tag the conditional branch instruction as conditional */
396 iptr->opc |= condition << 8;
398 /* add the instructions to the current basic block */
400 bptr->icount += icount;
405 show_basicblock(jd, &bptr[0]);
409 /* delete the 2 following basic blocks */
411 bptr[1].flags = BBDELETED;
412 bptr[2].flags = BBDELETED;
416 /* we had a match, exit this iteration */
426 /* everything's ok */
431 static void check(jitdata *jd, basicblock *bptr)
436 /* get required compiler data */
443 java.lang.reflect.Modifier.isPublic(I)Z
445 [ ] L000(5 - 0) flags=1:
446 [ i00] 0 (line: 227) ICONST 0 (0x00000000)
447 [ l00 i00] 1 (line: 227) ILOAD 0
448 [ r15 i00] 2 (line: 227) IANDCONST 1 (0x00000001)
449 [ r15 i00] 3 (line: 227) NOP
450 [ i00] 4 (line: 227) IFEQ 0 (0x00000000) L002
452 [ i00] L001(2 - 1) flags=1:
453 [ ] 0 (line: 227) POP
454 [ i00] 1 (line: 227) ICONST 1 (0x00000001)
456 [ i00] L002(1 - 2) flags=1:
457 [ ] 0 (line: 227) IRETURN
460 if ((bptr[1].icount == 2) &&
461 (bptr[1].iinstr[0].opc == ICMD_POP) &&
462 (bptr[1].iinstr[1].opc == ICMD_ICONST))
470 java.util.Hashtable.isEmpty()Z PUBLIC SYNCHRONIZED
472 [ ] L000(3 - 0) flags=1:
473 [ l00] 0 (line: 292) ALOAD 0
474 [ rdi] 1 (line: 292) GETFIELD 36, java.util.Hashtable.size (type I
476 [ ] 2 (line: 292) IFNE 0 (0x00000000) L002
478 [ ] L001(2 - 1) flags=1:
479 [ rdi] 0 (line: 292) ICONST 1 (0x00000001)
480 [ ] 1 (line: 292) IRETURN
482 [ ] L002(2 - 1) flags=1:
483 [ rdi] 0 (line: 292) ICONST 0 (0x00000000)
484 [ ] 1 (line: 292) IRETURN
487 if ((bptr[1].icount == 2) &&
488 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
489 (bptr[1].iinstr[1].opc == ICMD_IRETURN) &&
491 (bptr[2].icount == 2) &&
492 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
493 (bptr[2].iinstr[1].opc == ICMD_IRETURN))
499 this seems to be the most common and simplest if, check for all types
504 if ((bptr[1].icount == 2) &&
505 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
506 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
508 (bptr[2].icount == 1) &&
509 (bptr[2].iinstr[0].opc == ICMD_ICONST))
514 if ((bptr[1].icount == 2) &&
515 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
516 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
518 (bptr[2].icount == 1) &&
519 (bptr[2].iinstr[0].opc == ICMD_LCONST))
524 if ((bptr[1].icount == 2) &&
525 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
526 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
528 (bptr[2].icount == 1) &&
529 (bptr[2].iinstr[0].opc == ICMD_ACONST))
534 if ((bptr[1].icount == 2) &&
535 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
536 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
538 (bptr[2].icount == 1) &&
539 (bptr[2].iinstr[0].opc == ICMD_FCONST))
544 if ((bptr[1].icount == 2) &&
545 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
546 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
548 (bptr[2].icount == 1) &&
549 (bptr[2].iinstr[0].opc == ICMD_DCONST))
557 if ((bptr[1].icount == 2) &&
558 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
559 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
561 (bptr[2].icount == 1) &&
562 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
567 if ((bptr[1].icount == 2) &&
568 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
569 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
571 (bptr[2].icount == 1) &&
572 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
577 if ((bptr[1].icount == 2) &&
578 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
579 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
581 (bptr[2].icount == 1) &&
582 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
587 if ((bptr[1].icount == 2) &&
588 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
589 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
591 (bptr[2].icount == 1) &&
592 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
597 if ((bptr[1].icount == 2) &&
598 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
599 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
601 (bptr[2].icount == 1) &&
602 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
607 /* xCONST, GOTO - xLOAD */
609 if ((bptr[1].icount == 2) &&
610 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
611 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
613 (bptr[2].icount == 1) &&
614 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
619 if ((bptr[1].icount == 2) &&
620 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
621 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
623 (bptr[2].icount == 1) &&
624 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
629 if ((bptr[1].icount == 2) &&
630 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
631 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
633 (bptr[2].icount == 1) &&
634 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
639 if ((bptr[1].icount == 2) &&
640 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
641 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
643 (bptr[2].icount == 1) &&
644 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
649 if ((bptr[1].icount == 2) &&
650 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
651 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
653 (bptr[2].icount == 1) &&
654 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
659 /* xLOAD, GOTO - xCONST */
661 if ((bptr[1].icount == 2) &&
662 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
663 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
665 (bptr[2].icount == 1) &&
666 (bptr[2].iinstr[0].opc == ICMD_ICONST))
671 if ((bptr[1].icount == 2) &&
672 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
673 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
675 (bptr[2].icount == 1) &&
676 (bptr[2].iinstr[0].opc == ICMD_LCONST))
681 if ((bptr[1].icount == 2) &&
682 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
683 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
685 (bptr[2].icount == 1) &&
686 (bptr[2].iinstr[0].opc == ICMD_ACONST))
691 if ((bptr[1].icount == 2) &&
692 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
693 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
695 (bptr[2].icount == 1) &&
696 (bptr[2].iinstr[0].opc == ICMD_FCONST))
701 if ((bptr[1].icount == 2) &&
702 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
703 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
705 (bptr[2].icount == 1) &&
706 (bptr[2].iinstr[0].opc == ICMD_DCONST))
712 check for different ISTORE destinations or handle them properly
715 if ((bptr[1].icount == 3) &&
716 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
717 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
718 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
720 (bptr[2].icount == 2) &&
721 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
722 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
727 if ((bptr[1].icount == 3) &&
728 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
729 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
730 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
732 (bptr[2].icount == 2) &&
733 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
734 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
739 if ((bptr[1].icount == 3) &&
740 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
741 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
742 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
744 (bptr[2].icount == 2) &&
745 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
746 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
752 /* ALOAD, GETFIELD - ALOAD, GETFIELD */
754 if ((bptr[1].icount == 3) &&
755 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
756 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
757 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
759 (bptr[2].icount == 2) &&
760 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
761 (bptr[2].iinstr[1].opc == ICMD_GETFIELD))
767 /* ALOAD, ICONST, PUTFIELD - ALOAD, ICONST, PUTFIELD */
769 if ((bptr[1].icount == 4) &&
770 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
771 (bptr[1].iinstr[1].opc == ICMD_ICONST) &&
772 (bptr[1].iinstr[2].opc == ICMD_PUTFIELD) &&
773 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
775 (bptr[2].icount == 3) &&
776 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
777 (bptr[2].iinstr[1].opc == ICMD_ICONST) &&
778 (bptr[2].iinstr[2].opc == ICMD_PUTFIELD)
784 if ((bptr[1].icount == 4) &&
785 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
786 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
787 (bptr[1].iinstr[2].opc == ICMD_ASTORE) &&
788 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
790 (bptr[2].icount == 3) &&
791 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
792 (bptr[2].iinstr[1].opc == ICMD_GETFIELD) &&
793 (bptr[2].iinstr[2].opc == ICMD_ASTORE)
799 if ((bptr[1].icount == 2) &&
800 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
801 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
803 (bptr[2].icount == 1) &&
804 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
809 if ((bptr[1].icount == 3) &&
810 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
811 (bptr[1].iinstr[1].opc == ICMD_ASTORE) &&
812 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
814 (bptr[2].icount == 2) &&
815 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC) &&
816 (bptr[2].iinstr[1].opc == ICMD_ASTORE))
821 if ((bptr[1].icount == 2) &&
822 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
823 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
825 (bptr[2].icount == 1) &&
826 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
831 if ((bptr[1].icount == 2) &&
832 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
833 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
835 (bptr[2].icount == 1) &&
836 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
842 if ((bptr[1].icount == 3) &&
843 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
844 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
845 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
847 (bptr[2].icount == 1) &&
848 (bptr[2].iinstr[0].opc == ICMD_ICONST))
853 if ((bptr[1].icount == 3) &&
854 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
855 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
856 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
858 (bptr[2].icount == 1) &&
859 (bptr[2].iinstr[0].opc == ICMD_LCONST))
864 if ((bptr[1].icount == 3) &&
865 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
866 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
867 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
869 (bptr[2].icount == 1) &&
870 (bptr[2].iinstr[0].opc == ICMD_ACONST))
875 if ((bptr[1].icount == 3) &&
876 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
877 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
878 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
880 (bptr[2].icount == 1) &&
881 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
886 if ((bptr[1].icount == 3) &&
887 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
888 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
889 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
891 (bptr[2].icount == 1) &&
892 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
897 if ((bptr[1].icount == 3) &&
898 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
899 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
900 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
902 (bptr[2].icount == 1) &&
903 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
910 CHECK 3 : (BB: 0) IFEQ javax.swing.plaf.basic.BasicInternalFrameTitlePane.paintTitleBackground(Ljava/awt/Graphics;)V PROTECTED
911 [ ? ? ? ? ? ] L001(instruction count: 4, predecessors: 1):
912 [ ? ? ? ? ? ] 0 (line: 909) ALOAD 0
913 [ ? ? ? ? ? ] 1 (line: 909) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.selectedTitleColor (type Ljava/awt/Color;)
914 [ ? ? ? ? ? ] 2 (line: 909) ASTORE 4
915 [ ? ? ? ? ? ] 3 (line: 909) GOTO op1=41
916 [ ? ? ? ? ? ] L002(instruction count: 3, predecessors: 1):
917 [ ? ? ? ? ? ] 0 (line: 911) ALOAD 0
918 [ ? ? ? ? ? ] 1 (line: 911) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.notSelectedTitleColor (type Ljava/awt/Color;)
919 [ ? ? ? ? ? ] 2 (line: 911) ASTORE 4
922 CHECK 3 : (BB: 3) IFEQ javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(Ljava/awt/event/MouseEvent;)V PUBLIC
923 [ ? ? ? ? ? ] L004(instruction count: 4, predecessors: 1):
924 [ ? ? ? ? ? ] 0 (line: 2244) ACONST 0x3602d30, String = "Tree.openIcon"
925 [ ? ? ? ? ? ] 1 (line: 2244) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
926 [ ? ? ? ? ? ] 2 (line: 2244) ASTORE 8
927 [ ? ? ? ? ? ] 3 (line: 2244) GOTO op1=155
928 [ ? ? ? ? ? ] L005(instruction count: 3, predecessors: 1):
929 [ ? ? ? ? ? ] 0 (line: 2246) ACONST 0x3602e00, String = "Tree.closedIcon"
930 [ ? ? ? ? ? ] 1 (line: 2246) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
931 [ ? ? ? ? ? ] 2 (line: 2246) ASTORE 8
934 CHECK 3 : (BB: 2) IFEQ javax.naming.CompoundName.initializeSyntax()V PRIVATE FINAL
935 [ ? ? ? ? ] L003(instruction count: 4, predecessors: 1):
936 [ ? ? ? ? ] 0 (line: 445) ALOAD 0
937 [ ? ? ? ? ] 1 (line: 445) ICONST 1 (0x00000001)
938 [ ? ? ? ? ] 2 (line: 445) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
939 [ ? ? ? ? ] 3 (line: 445) GOTO op1=51
940 [ ? ? ? ? ] L004(instruction count: 3, predecessors: 1):
941 [ ? ? ? ? ] 0 (line: 449) ALOAD 0
942 [ ? ? ? ? ] 1 (line: 449) ICONST 0 (0x00000000)
943 [ ? ? ? ? ] 2 (line: 449) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
946 CHECK 3 : (BB: 15) IFNE java.awt.Scrollbar.setValues(IIII)V PUBLIC SYNCHRONIZED
947 [ ? ? ? ? ? ] L016(instruction count: 4, predecessors: 1):
948 [ ? ? ? ? ? ] 0 (line: 371) ALOAD 0
949 [ ? ? ? ? ? ] 1 (line: 371) ICONST 1 (0x00000001)
950 [ ? ? ? ? ? ] 2 (line: 371) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
951 [ ? ? ? ? ? ] 3 (line: 371) GOTO op1=152
952 [ ? ? ? ? ? ] L017(instruction count: 3, predecessors: 1):
953 [ ? ? ? ? ? ] 0 (line: 373) ALOAD 0
954 [ ? ? ? ? ? ] 1 (line: 373) ILOAD 6
955 [ ? ? ? ? ? ] 2 (line: 373) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
958 CHECK 3 : (BB: 1) IFEQ javax.swing.JInternalFrame.setIcon(Z)V PUBLIC
959 [ ? ? ? ? ] L002(instruction count: 4, predecessors: 1):
960 [ ? ? ? ? ] 0 (line: 1395) ALOAD 0
961 [ ? ? ? ? ] 1 (line: 1395) ICONST 25552 (0x000063d0)
962 [ ? ? ? ? ] 2 (line: 1395) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
963 [ ? ? ? ? ] 3 (line: 1395) GOTO op1=61
964 [ ? ? ? ? ] L003(instruction count: 3, predecessors: 1):
965 [ ? ? ? ? ] 0 (line: 1397) ALOAD 0
966 [ ? ? ? ? ] 1 (line: 1397) ICONST 25553 (0x000063d1)
967 [ ? ? ? ? ] 2 (line: 1397) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
973 printf("PATTERN %02d: (BB: %3d) ", pattern, jd->basicblockcount - bptr->nr);
976 /* if (pattern == 27) { */
977 /* show_basicblock(m, cd, &bptr[1]); */
978 /* show_basicblock(m, cd, &bptr[2]); */
984 if ((bptr[1].icount == 2) &&
985 (bptr[2].icount == 1) &&
987 (bptr[1].iinstr[1].opc == ICMD_GOTO))
989 printf("CHECK 1 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
992 show_basicblock(jd, &bptr[1]);
993 show_basicblock(jd, &bptr[2]);
998 if ((bptr[1].icount == 3) &&
999 (bptr[2].icount == 2) &&
1001 (bptr[1].iinstr[2].opc == ICMD_GOTO))
1003 printf("CHECK 2 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1006 show_basicblock(jd, &bptr[1]);
1007 show_basicblock(jd, &bptr[2]);
1012 if ((bptr[1].icount == 4) &&
1013 (bptr[2].icount == 3) &&
1015 (bptr[1].iinstr[3].opc == ICMD_GOTO))
1017 printf("CHECK 3 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1020 show_basicblock(jd, &bptr[1]);
1021 show_basicblock(jd, &bptr[2]);
1026 if ((bptr[1].icount == 3) &&
1027 (bptr[2].icount == 1) &&
1029 (bptr[1].iinstr[2].opc == ICMD_GOTO))
1031 printf("CHECK 4 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1034 show_basicblock(jd, &bptr[1]);
1035 show_basicblock(jd, &bptr[2]);
1040 #endif /* !defined(NDEBUG) */
1045 * These are local overrides for various environment variables in Emacs.
1046 * Please do not remove this and leave it at the end of the file, where
1047 * Emacs will automagically detect them.
1048 * ---------------------------------------------------------------------
1051 * indent-tabs-mode: t
1055 * vim:noexpandtab:sw=4:ts=4: