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
25 $Id: stack.c 4455 2006-02-06 01:02:59Z edwin $
38 #include "vm/jit/codegen-common.h"
39 #include "vm/jit/jit.h"
40 #include "vm/jit/reg.h"
41 #include "vm/jit/show.h"
43 #include "vmcore/method.h"
46 /* patterns for a total number of 3 instructions ******************************/
48 #define IFCONV_PATTERN_3_SIZE sizeof(ifconv_pattern_3) / (sizeof(s4) * 3 * 2)
50 static s4 ifconv_pattern_3[][2][3] = {
70 /* patterns for a total number of 4 instructions ******************************/
72 #define IFCONV_PATTERN_4_SIZE sizeof(ifconv_pattern_4) / (sizeof(s4) * 4 * 2)
74 static s4 ifconv_pattern_4[][2][4] = {
96 /* ifconv_condition_complement *************************************************
98 Table of conditions and their complement. Index with:
100 (ICMD_IFxx - ICMD_IFEQ)
102 ATTENTION: Don't change order! It depends on the Java bytecode opcode!
104 *******************************************************************************/
106 static s4 ifconv_condition_complement[6] = {
107 /* !ICMD_IFEQ */ ICMD_IFNE,
108 /* !ICMD_IFNE */ ICMD_IFEQ,
109 /* !ICMD_IFLT */ ICMD_IFGE,
110 /* !ICMD_IFGE */ ICMD_IFLT,
111 /* !ICMD_IFGT */ ICMD_IFLE,
112 /* !ICMD_IFLE */ ICMD_IFGT,
116 /* ifconv_static ***************************************************************
118 Does if-conversion with static data based on pattern matching.
120 *******************************************************************************/
122 static void check(jitdata *jd, basicblock *bptr);
124 bool ifconv_static(jitdata *jd)
141 /* get required compiler data */
145 /* iterate over all basic blocks */
147 bptr = jd->basicblocks;
148 bcount = jd->basicblockcount;
150 for (; bcount >= 0; bcount--, bptr++) {
151 /* Deleted basic blocks are just skipped. */
153 if (bptr->flags == BBDELETED)
156 /* We need at least 3 basic blocks including the current one. */
161 /* Only look at the last instruction of the current basic
162 block. All conditional branch instructions are suitable
163 for if-conversion. */
165 iptr = bptr->iinstr + bptr->icount - 1;
203 /* basic blocks can only have 1 predecessor */
205 if ((bptr[1].predecessorcount != 1) ||
206 (bptr[2].predecessorcount != 1))
211 /* only use a fixed size of instructions */
213 icount = bptr[1].icount + bptr[2].icount;
215 /* we only convert less than or equal 4 instructions */
220 /* check which pattern to use */
224 /* just skip basic blocks with length 1 */
231 pattern = (s4 *) ifconv_pattern_3;
232 patternsize = IFCONV_PATTERN_3_SIZE;
236 pattern = (s4 *) ifconv_pattern_4;
237 patternsize = IFCONV_PATTERN_4_SIZE;
241 /* keep compiler happy */
246 /* that should not happen */
248 vm_abort("ifconv_static: invalid instruction count %d", icount);
251 /* Iterate over all patterns of the given pattern. */
253 for (i = 0; i < patternsize; i++) {
254 /* Check the first and the second basic block at the
255 same time. The instructions _MUST NOT_ be
256 reordered in the array before. */
258 tiptr = bptr[1].iinstr;
260 for (j = 0; j < icount; j++, tiptr++) {
263 p = pattern + (icount * 2 * i) + (icount * 0) + j;
267 if (tiptr->opc != opcode)
271 /* found a matching pattern */
276 show_basicblock(jd, &bptr[0]);
277 show_basicblock(jd, &bptr[1]);
278 show_basicblock(jd, &bptr[2]);
279 show_basicblock(jd, &bptr[3]);
283 /* check the condition */
292 condition = ICMD_IFEQ;
301 condition = ICMD_IFNE;
308 condition = ICMD_IFLT;
315 condition = ICMD_IFGE;
322 condition = ICMD_IFGT;
329 condition = ICMD_IFLE;
336 /* keep compiler happy */
340 vm_abort("ifconv_static: invalid opcode: %d", iptr->opc);
343 /* get the condition array index */
345 complement = ifconv_condition_complement[condition - ICMD_IFEQ];
347 /* Set the new instructions, first basic block 1... */
349 tiptr = bptr[1].iinstr;
352 for (; j < bptr[1].icount; j++, tiptr++) {
353 /* get the replacing opcode */
355 p = pattern + (icount * 2 * i) + (icount * 1) + j;
359 /* If we add a NOP, skip the current instruction
360 and set the stack of the next instruction
361 to the previous one. */
363 if (opcode == ICMD_NOP) {
364 tiptr[1].dst = tiptr[-1].dst;
367 /* For the first basic block we have to set the
368 complementary condition. */
370 /* tiptr->opc = opcode | (complement << 8); */
374 /* ...then basic block 2. We split this step, as we
375 have to set different conditions in the blocks. */
377 for (; j < bptr[1].icount + bptr[2].icount; j++, tiptr++) {
378 p = pattern + (icount * 2 * i) + (icount * 1) + j;
380 /* For the first basic block we have to set the
381 complementary condition. */
383 tiptr->opc = *p | (condition << 8);
385 /* if we add a NOP, set the stacks correctly */
387 if (tiptr->opc == ICMD_NOP) {
392 /* tag the conditional branch instruction as conditional */
394 iptr->opc |= condition << 8;
396 /* add the instructions to the current basic block */
398 bptr->icount += icount;
403 show_basicblock(jd, &bptr[0]);
407 /* delete the 2 following basic blocks */
409 bptr[1].flags = BBDELETED;
410 bptr[2].flags = BBDELETED;
414 /* we had a match, exit this iteration */
424 /* everything's ok */
429 static void check(jitdata *jd, basicblock *bptr)
434 /* get required compiler data */
441 java.lang.reflect.Modifier.isPublic(I)Z
443 [ ] L000(5 - 0) flags=1:
444 [ i00] 0 (line: 227) ICONST 0 (0x00000000)
445 [ l00 i00] 1 (line: 227) ILOAD 0
446 [ r15 i00] 2 (line: 227) IANDCONST 1 (0x00000001)
447 [ r15 i00] 3 (line: 227) NOP
448 [ i00] 4 (line: 227) IFEQ 0 (0x00000000) L002
450 [ i00] L001(2 - 1) flags=1:
451 [ ] 0 (line: 227) POP
452 [ i00] 1 (line: 227) ICONST 1 (0x00000001)
454 [ i00] L002(1 - 2) flags=1:
455 [ ] 0 (line: 227) IRETURN
458 if ((bptr[1].icount == 2) &&
459 (bptr[1].iinstr[0].opc == ICMD_POP) &&
460 (bptr[1].iinstr[1].opc == ICMD_ICONST))
468 java.util.Hashtable.isEmpty()Z PUBLIC SYNCHRONIZED
470 [ ] L000(3 - 0) flags=1:
471 [ l00] 0 (line: 292) ALOAD 0
472 [ rdi] 1 (line: 292) GETFIELD 36, java.util.Hashtable.size (type I
474 [ ] 2 (line: 292) IFNE 0 (0x00000000) L002
476 [ ] L001(2 - 1) flags=1:
477 [ rdi] 0 (line: 292) ICONST 1 (0x00000001)
478 [ ] 1 (line: 292) IRETURN
480 [ ] L002(2 - 1) flags=1:
481 [ rdi] 0 (line: 292) ICONST 0 (0x00000000)
482 [ ] 1 (line: 292) IRETURN
485 if ((bptr[1].icount == 2) &&
486 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
487 (bptr[1].iinstr[1].opc == ICMD_IRETURN) &&
489 (bptr[2].icount == 2) &&
490 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
491 (bptr[2].iinstr[1].opc == ICMD_IRETURN))
497 this seems to be the most common and simplest if, check for all types
502 if ((bptr[1].icount == 2) &&
503 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
504 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
506 (bptr[2].icount == 1) &&
507 (bptr[2].iinstr[0].opc == ICMD_ICONST))
512 if ((bptr[1].icount == 2) &&
513 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
514 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
516 (bptr[2].icount == 1) &&
517 (bptr[2].iinstr[0].opc == ICMD_LCONST))
522 if ((bptr[1].icount == 2) &&
523 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
524 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
526 (bptr[2].icount == 1) &&
527 (bptr[2].iinstr[0].opc == ICMD_ACONST))
532 if ((bptr[1].icount == 2) &&
533 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
534 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
536 (bptr[2].icount == 1) &&
537 (bptr[2].iinstr[0].opc == ICMD_FCONST))
542 if ((bptr[1].icount == 2) &&
543 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
544 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
546 (bptr[2].icount == 1) &&
547 (bptr[2].iinstr[0].opc == ICMD_DCONST))
555 if ((bptr[1].icount == 2) &&
556 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
557 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
559 (bptr[2].icount == 1) &&
560 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
565 if ((bptr[1].icount == 2) &&
566 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
567 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
569 (bptr[2].icount == 1) &&
570 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
575 if ((bptr[1].icount == 2) &&
576 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
577 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
579 (bptr[2].icount == 1) &&
580 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
585 if ((bptr[1].icount == 2) &&
586 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
587 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
589 (bptr[2].icount == 1) &&
590 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
595 if ((bptr[1].icount == 2) &&
596 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
597 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
599 (bptr[2].icount == 1) &&
600 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
605 /* xCONST, GOTO - xLOAD */
607 if ((bptr[1].icount == 2) &&
608 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
609 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
611 (bptr[2].icount == 1) &&
612 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
617 if ((bptr[1].icount == 2) &&
618 (bptr[1].iinstr[0].opc == ICMD_LCONST) &&
619 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
621 (bptr[2].icount == 1) &&
622 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
627 if ((bptr[1].icount == 2) &&
628 (bptr[1].iinstr[0].opc == ICMD_ACONST) &&
629 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
631 (bptr[2].icount == 1) &&
632 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
637 if ((bptr[1].icount == 2) &&
638 (bptr[1].iinstr[0].opc == ICMD_FCONST) &&
639 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
641 (bptr[2].icount == 1) &&
642 (bptr[2].iinstr[0].opc == ICMD_FLOAD))
647 if ((bptr[1].icount == 2) &&
648 (bptr[1].iinstr[0].opc == ICMD_DCONST) &&
649 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
651 (bptr[2].icount == 1) &&
652 (bptr[2].iinstr[0].opc == ICMD_DLOAD))
657 /* xLOAD, GOTO - xCONST */
659 if ((bptr[1].icount == 2) &&
660 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
661 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
663 (bptr[2].icount == 1) &&
664 (bptr[2].iinstr[0].opc == ICMD_ICONST))
669 if ((bptr[1].icount == 2) &&
670 (bptr[1].iinstr[0].opc == ICMD_LLOAD) &&
671 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
673 (bptr[2].icount == 1) &&
674 (bptr[2].iinstr[0].opc == ICMD_LCONST))
679 if ((bptr[1].icount == 2) &&
680 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
681 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
683 (bptr[2].icount == 1) &&
684 (bptr[2].iinstr[0].opc == ICMD_ACONST))
689 if ((bptr[1].icount == 2) &&
690 (bptr[1].iinstr[0].opc == ICMD_FLOAD) &&
691 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
693 (bptr[2].icount == 1) &&
694 (bptr[2].iinstr[0].opc == ICMD_FCONST))
699 if ((bptr[1].icount == 2) &&
700 (bptr[1].iinstr[0].opc == ICMD_DLOAD) &&
701 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
703 (bptr[2].icount == 1) &&
704 (bptr[2].iinstr[0].opc == ICMD_DCONST))
710 check for different ISTORE destinations or handle them properly
713 if ((bptr[1].icount == 3) &&
714 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
715 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
716 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
718 (bptr[2].icount == 2) &&
719 (bptr[2].iinstr[0].opc == ICMD_ICONST) &&
720 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
725 if ((bptr[1].icount == 3) &&
726 (bptr[1].iinstr[0].opc == ICMD_ILOAD) &&
727 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
728 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
730 (bptr[2].icount == 2) &&
731 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
732 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
737 if ((bptr[1].icount == 3) &&
738 (bptr[1].iinstr[0].opc == ICMD_ICONST) &&
739 (bptr[1].iinstr[1].opc == ICMD_ISTORE) &&
740 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
742 (bptr[2].icount == 2) &&
743 (bptr[2].iinstr[0].opc == ICMD_ILOAD) &&
744 (bptr[2].iinstr[1].opc == ICMD_ISTORE))
750 /* ALOAD, GETFIELD - ALOAD, GETFIELD */
752 if ((bptr[1].icount == 3) &&
753 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
754 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
755 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
757 (bptr[2].icount == 2) &&
758 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
759 (bptr[2].iinstr[1].opc == ICMD_GETFIELD))
765 /* ALOAD, ICONST, PUTFIELD - ALOAD, ICONST, PUTFIELD */
767 if ((bptr[1].icount == 4) &&
768 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
769 (bptr[1].iinstr[1].opc == ICMD_ICONST) &&
770 (bptr[1].iinstr[2].opc == ICMD_PUTFIELD) &&
771 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
773 (bptr[2].icount == 3) &&
774 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
775 (bptr[2].iinstr[1].opc == ICMD_ICONST) &&
776 (bptr[2].iinstr[2].opc == ICMD_PUTFIELD)
782 if ((bptr[1].icount == 4) &&
783 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
784 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
785 (bptr[1].iinstr[2].opc == ICMD_ASTORE) &&
786 (bptr[1].iinstr[3].opc == ICMD_GOTO) &&
788 (bptr[2].icount == 3) &&
789 (bptr[2].iinstr[0].opc == ICMD_ALOAD) &&
790 (bptr[2].iinstr[1].opc == ICMD_GETFIELD) &&
791 (bptr[2].iinstr[2].opc == ICMD_ASTORE)
797 if ((bptr[1].icount == 2) &&
798 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
799 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
801 (bptr[2].icount == 1) &&
802 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
807 if ((bptr[1].icount == 3) &&
808 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
809 (bptr[1].iinstr[1].opc == ICMD_ASTORE) &&
810 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
812 (bptr[2].icount == 2) &&
813 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC) &&
814 (bptr[2].iinstr[1].opc == ICMD_ASTORE))
819 if ((bptr[1].icount == 2) &&
820 (bptr[1].iinstr[0].opc == ICMD_GETSTATIC) &&
821 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
823 (bptr[2].icount == 1) &&
824 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
829 if ((bptr[1].icount == 2) &&
830 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
831 (bptr[1].iinstr[1].opc == ICMD_GOTO) &&
833 (bptr[2].icount == 1) &&
834 (bptr[2].iinstr[0].opc == ICMD_GETSTATIC))
840 if ((bptr[1].icount == 3) &&
841 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
842 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
843 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
845 (bptr[2].icount == 1) &&
846 (bptr[2].iinstr[0].opc == ICMD_ICONST))
851 if ((bptr[1].icount == 3) &&
852 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
853 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
854 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
856 (bptr[2].icount == 1) &&
857 (bptr[2].iinstr[0].opc == ICMD_LCONST))
862 if ((bptr[1].icount == 3) &&
863 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
864 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
865 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
867 (bptr[2].icount == 1) &&
868 (bptr[2].iinstr[0].opc == ICMD_ACONST))
873 if ((bptr[1].icount == 3) &&
874 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
875 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
876 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
878 (bptr[2].icount == 1) &&
879 (bptr[2].iinstr[0].opc == ICMD_ILOAD))
884 if ((bptr[1].icount == 3) &&
885 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
886 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
887 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
889 (bptr[2].icount == 1) &&
890 (bptr[2].iinstr[0].opc == ICMD_LLOAD))
895 if ((bptr[1].icount == 3) &&
896 (bptr[1].iinstr[0].opc == ICMD_ALOAD) &&
897 (bptr[1].iinstr[1].opc == ICMD_GETFIELD) &&
898 (bptr[1].iinstr[2].opc == ICMD_GOTO) &&
900 (bptr[2].icount == 1) &&
901 (bptr[2].iinstr[0].opc == ICMD_ALOAD))
908 CHECK 3 : (BB: 0) IFEQ javax.swing.plaf.basic.BasicInternalFrameTitlePane.paintTitleBackground(Ljava/awt/Graphics;)V PROTECTED
909 [ ? ? ? ? ? ] L001(instruction count: 4, predecessors: 1):
910 [ ? ? ? ? ? ] 0 (line: 909) ALOAD 0
911 [ ? ? ? ? ? ] 1 (line: 909) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.selectedTitleColor (type Ljava/awt/Color;)
912 [ ? ? ? ? ? ] 2 (line: 909) ASTORE 4
913 [ ? ? ? ? ? ] 3 (line: 909) GOTO op1=41
914 [ ? ? ? ? ? ] L002(instruction count: 3, predecessors: 1):
915 [ ? ? ? ? ? ] 0 (line: 911) ALOAD 0
916 [ ? ? ? ? ? ] 1 (line: 911) GETFIELD (NOT RESOLVED), javax.swing.plaf.basic.BasicInternalFrameTitlePane.notSelectedTitleColor (type Ljava/awt/Color;)
917 [ ? ? ? ? ? ] 2 (line: 911) ASTORE 4
920 CHECK 3 : (BB: 3) IFEQ javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(Ljava/awt/event/MouseEvent;)V PUBLIC
921 [ ? ? ? ? ? ] L004(instruction count: 4, predecessors: 1):
922 [ ? ? ? ? ? ] 0 (line: 2244) ACONST 0x3602d30, String = "Tree.openIcon"
923 [ ? ? ? ? ? ] 1 (line: 2244) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
924 [ ? ? ? ? ? ] 2 (line: 2244) ASTORE 8
925 [ ? ? ? ? ? ] 3 (line: 2244) GOTO op1=155
926 [ ? ? ? ? ? ] L005(instruction count: 3, predecessors: 1):
927 [ ? ? ? ? ? ] 0 (line: 2246) ACONST 0x3602e00, String = "Tree.closedIcon"
928 [ ? ? ? ? ? ] 1 (line: 2246) INVOKESTATIC (NOT RESOLVED) javax.swing.UIManager.getIcon(Ljava/lang/Object;)Ljavax/swing/Icon;
929 [ ? ? ? ? ? ] 2 (line: 2246) ASTORE 8
932 CHECK 3 : (BB: 2) IFEQ javax.naming.CompoundName.initializeSyntax()V PRIVATE FINAL
933 [ ? ? ? ? ] L003(instruction count: 4, predecessors: 1):
934 [ ? ? ? ? ] 0 (line: 445) ALOAD 0
935 [ ? ? ? ? ] 1 (line: 445) ICONST 1 (0x00000001)
936 [ ? ? ? ? ] 2 (line: 445) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
937 [ ? ? ? ? ] 3 (line: 445) GOTO op1=51
938 [ ? ? ? ? ] L004(instruction count: 3, predecessors: 1):
939 [ ? ? ? ? ] 0 (line: 449) ALOAD 0
940 [ ? ? ? ? ] 1 (line: 449) ICONST 0 (0x00000000)
941 [ ? ? ? ? ] 2 (line: 449) PUTFIELD (NOT RESOLVED), javax.naming.CompoundName.direction (type I)
944 CHECK 3 : (BB: 15) IFNE java.awt.Scrollbar.setValues(IIII)V PUBLIC SYNCHRONIZED
945 [ ? ? ? ? ? ] L016(instruction count: 4, predecessors: 1):
946 [ ? ? ? ? ? ] 0 (line: 371) ALOAD 0
947 [ ? ? ? ? ? ] 1 (line: 371) ICONST 1 (0x00000001)
948 [ ? ? ? ? ? ] 2 (line: 371) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
949 [ ? ? ? ? ? ] 3 (line: 371) GOTO op1=152
950 [ ? ? ? ? ? ] L017(instruction count: 3, predecessors: 1):
951 [ ? ? ? ? ? ] 0 (line: 373) ALOAD 0
952 [ ? ? ? ? ? ] 1 (line: 373) ILOAD 6
953 [ ? ? ? ? ? ] 2 (line: 373) PUTFIELD (NOT RESOLVED), java.awt.Scrollbar.lineIncrement (type I)
956 CHECK 3 : (BB: 1) IFEQ javax.swing.JInternalFrame.setIcon(Z)V PUBLIC
957 [ ? ? ? ? ] L002(instruction count: 4, predecessors: 1):
958 [ ? ? ? ? ] 0 (line: 1395) ALOAD 0
959 [ ? ? ? ? ] 1 (line: 1395) ICONST 25552 (0x000063d0)
960 [ ? ? ? ? ] 2 (line: 1395) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
961 [ ? ? ? ? ] 3 (line: 1395) GOTO op1=61
962 [ ? ? ? ? ] L003(instruction count: 3, predecessors: 1):
963 [ ? ? ? ? ] 0 (line: 1397) ALOAD 0
964 [ ? ? ? ? ] 1 (line: 1397) ICONST 25553 (0x000063d1)
965 [ ? ? ? ? ] 2 (line: 1397) INVOKEVIRTUAL (NOT RESOLVED) javax.swing.JInternalFrame.fireInternalFrameEvent(I)V
971 printf("PATTERN %02d: (BB: %3d) ", pattern, jd->basicblockcount - bptr->nr);
974 /* if (pattern == 27) { */
975 /* show_basicblock(m, cd, &bptr[1]); */
976 /* show_basicblock(m, cd, &bptr[2]); */
982 if ((bptr[1].icount == 2) &&
983 (bptr[2].icount == 1) &&
985 (bptr[1].iinstr[1].opc == ICMD_GOTO))
987 printf("CHECK 1 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
990 show_basicblock(jd, &bptr[1]);
991 show_basicblock(jd, &bptr[2]);
996 if ((bptr[1].icount == 3) &&
997 (bptr[2].icount == 2) &&
999 (bptr[1].iinstr[2].opc == ICMD_GOTO))
1001 printf("CHECK 2 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1004 show_basicblock(jd, &bptr[1]);
1005 show_basicblock(jd, &bptr[2]);
1010 if ((bptr[1].icount == 4) &&
1011 (bptr[2].icount == 3) &&
1013 (bptr[1].iinstr[3].opc == ICMD_GOTO))
1015 printf("CHECK 3 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1018 show_basicblock(jd, &bptr[1]);
1019 show_basicblock(jd, &bptr[2]);
1024 if ((bptr[1].icount == 3) &&
1025 (bptr[2].icount == 1) &&
1027 (bptr[1].iinstr[2].opc == ICMD_GOTO))
1029 printf("CHECK 4 : (BB: %3d) ", jd->basicblockcount - bptr->nr);
1032 show_basicblock(jd, &bptr[1]);
1033 show_basicblock(jd, &bptr[2]);
1038 #endif /* !defined(NDEBUG) */
1043 * These are local overrides for various environment variables in Emacs.
1044 * Please do not remove this and leave it at the end of the file, where
1045 * Emacs will automagically detect them.
1046 * ---------------------------------------------------------------------
1049 * indent-tabs-mode: t
1053 * vim:noexpandtab:sw=4:ts=4: