annotate graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java @ 21771:ed3d7af510bd

BytecodeParser#lookupField: use eagerResolving instead of unresolvedIsError to guard explicit initialization.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 03 Jun 2015 09:28:41 +0200
parents bb72c486714a
children 76c162c69c2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
4 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
8 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
13 * accompanied this code).
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
14 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
18 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
21 * questions.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
22 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.java;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
24
21720
d915361cc3a1 moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21713
diff changeset
25 import static com.oracle.graal.bytecode.Bytecodes.*;
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
26 import static com.oracle.graal.compiler.common.GraalOptions.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
27 import static com.oracle.graal.compiler.common.type.StampFactory.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
28 import static com.oracle.graal.graphbuilderconf.IntrinsicContext.CompilationContext.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
29 import static com.oracle.graal.java.BytecodeParser.Options.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
30 import static com.oracle.graal.nodes.StructuredGraph.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
31 import static com.oracle.graal.nodes.type.StampTool.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
32 import static com.oracle.jvmci.code.TypeCheckHints.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
33 import static com.oracle.jvmci.common.JVMCIError.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
34 import static com.oracle.jvmci.meta.DeoptimizationAction.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
35 import static com.oracle.jvmci.meta.DeoptimizationReason.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
36 import static java.lang.String.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
37
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
38 import java.util.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
39
21720
d915361cc3a1 moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21713
diff changeset
40 import com.oracle.graal.bytecode.*;
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
41 import com.oracle.graal.compiler.common.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
42 import com.oracle.graal.compiler.common.calc.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
43 import com.oracle.graal.compiler.common.type.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
44 import com.oracle.graal.graph.Graph.Mark;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
45 import com.oracle.graal.graph.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
46 import com.oracle.graal.graph.Node.ValueNumberable;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
47 import com.oracle.graal.graph.iterators.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
48 import com.oracle.graal.graphbuilderconf.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
49 import com.oracle.graal.graphbuilderconf.InlineInvokePlugin.InlineInfo;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
50 import com.oracle.graal.graphbuilderconf.InvocationPlugins.InvocationPluginReceiver;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
51 import com.oracle.graal.java.BciBlockMapping.BciBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
52 import com.oracle.graal.java.BciBlockMapping.ExceptionDispatchBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
53 import com.oracle.graal.nodeinfo.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
54 import com.oracle.graal.nodes.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
55 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
56 import com.oracle.graal.nodes.calc.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
57 import com.oracle.graal.nodes.extended.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
58 import com.oracle.graal.nodes.java.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
59 import com.oracle.graal.nodes.spi.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
60 import com.oracle.graal.nodes.type.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
61 import com.oracle.graal.nodes.util.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
62 import com.oracle.graal.phases.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
63 import com.oracle.jvmci.code.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
64 import com.oracle.jvmci.common.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
65 import com.oracle.jvmci.debug.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
66 import com.oracle.jvmci.debug.Debug.Scope;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
67 import com.oracle.jvmci.meta.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
68 import com.oracle.jvmci.options.*;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
69
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
70 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
71 * The {@code GraphBuilder} class parses the bytecode of a method and builds the IR graph.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
72 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
73 public class BytecodeParser implements GraphBuilderContext {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
74
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
75 public static class Options {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
76 @Option(help = "The trace level for the bytecode parser used when building a graph from bytecode", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
77 public static final OptionValue<Integer> TraceBytecodeParserLevel = new OptionValue<>(0);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
78
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
79 @Option(help = "Inlines trivial methods during bytecode parsing.", type = OptionType.Expert)//
21622
45dea3e24169 Enable inlining during parsing by default.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21621
diff changeset
80 public static final StableOptionValue<Boolean> InlineDuringParsing = new StableOptionValue<>(true);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
81
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
82 @Option(help = "Inlines intrinsic methods during bytecode parsing.", type = OptionType.Expert)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
83 public static final StableOptionValue<Boolean> InlineIntrinsicsDuringParsing = new StableOptionValue<>(true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
84
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
85 @Option(help = "Traces inlining performed during bytecode parsing.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
86 public static final StableOptionValue<Boolean> TraceInlineDuringParsing = new StableOptionValue<>(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
87
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
88 @Option(help = "Traces use of plugins during bytecode parsing.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
89 public static final StableOptionValue<Boolean> TraceParserPlugins = new StableOptionValue<>(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
90
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
91 @Option(help = "Maximum depth when inlining during bytecode parsing.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
92 public static final StableOptionValue<Integer> InlineDuringParsingMaxDepth = new StableOptionValue<>(10);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
93
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
94 @Option(help = "Dump graphs after non-trivial changes during bytecode parsing.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
95 public static final StableOptionValue<Boolean> DumpDuringGraphBuilding = new StableOptionValue<>(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
96
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
97 @Option(help = "Max number of loop explosions per method.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
98 public static final OptionValue<Integer> MaximumLoopExplosionCount = new OptionValue<>(10000);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
99
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
100 @Option(help = "Do not bail out but throw an exception on failed loop explosion.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
101 public static final OptionValue<Boolean> FailedLoopExplosionIsFatal = new OptionValue<>(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
102
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
103 @Option(help = "When creating info points hide the methods of the substitutions.", type = OptionType.Debug)//
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
104 public static final OptionValue<Boolean> HideSubstitutionStates = new OptionValue<>(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
105 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
106
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
107 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
108 * The minimum value to which {@link Options#TraceBytecodeParserLevel} must be set to trace the
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
109 * bytecode instructions as they are parsed.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
110 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
111 public static final int TRACELEVEL_INSTRUCTIONS = 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
112
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
113 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
114 * The minimum value to which {@link Options#TraceBytecodeParserLevel} must be set to trace the
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
115 * frame state before each bytecode instruction as it is parsed.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
116 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
117 public static final int TRACELEVEL_STATE = 2;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
118
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
119 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
120 * Meters the number of actual bytecodes parsed.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
121 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
122 public static final DebugMetric BytecodesParsed = Debug.metric("BytecodesParsed");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
123
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
124 protected static final DebugMetric EXPLICIT_EXCEPTIONS = Debug.metric("ExplicitExceptions");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
125
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
126 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
127 * A scoped object for tasks to be performed after parsing an intrinsic such as processing
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
128 * {@linkplain BytecodeFrame#isPlaceholderBci(int) placeholder} frames states.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
129 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
130 static class IntrinsicScope implements AutoCloseable {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
131 FrameState stateBefore;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
132 final Mark mark;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
133 final BytecodeParser parser;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
134
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
135 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
136 * Creates a scope for root parsing an intrinsic.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
137 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
138 * @param parser the parsing context of the intrinsic
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
139 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
140 public IntrinsicScope(BytecodeParser parser) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
141 this.parser = parser;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
142 assert parser.parent == null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
143 assert parser.bci() == 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
144 mark = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
145 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
146
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
147 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
148 * Creates a scope for parsing an intrinsic during graph builder inlining.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
149 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
150 * @param parser the parsing context of the (non-intrinsic) method calling the intrinsic
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
151 * @param args the arguments to the call
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
152 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
153 public IntrinsicScope(BytecodeParser parser, Kind[] argSlotKinds, ValueNode[] args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
154 assert !parser.parsingIntrinsic();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
155 this.parser = parser;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
156 mark = parser.getGraph().getMark();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
157 stateBefore = parser.frameState.create(parser.bci(), parser.getNonIntrinsicAncestor(), false, argSlotKinds, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
158 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
159
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
160 public void close() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
161 IntrinsicContext intrinsic = parser.intrinsicContext;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
162 if (intrinsic != null && intrinsic.isPostParseInlined()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
163 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
164 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
165
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
166 processPlaceholderFrameStates(intrinsic);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
167 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
168
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
169 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
170 * Fixes up the {@linkplain BytecodeFrame#isPlaceholderBci(int) placeholder} frame states
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
171 * added to the graph while parsing/inlining the intrinsic for which this object exists.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
172 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
173 private void processPlaceholderFrameStates(IntrinsicContext intrinsic) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
174 FrameState stateAfterReturn = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
175 StructuredGraph graph = parser.getGraph();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
176 for (Node node : graph.getNewNodes(mark)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
177 if (node instanceof FrameState) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
178 FrameState frameState = (FrameState) node;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
179 if (BytecodeFrame.isPlaceholderBci(frameState.bci)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
180 if (frameState.bci == BytecodeFrame.AFTER_BCI) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
181 FrameStateBuilder frameStateBuilder = parser.frameState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
182 if (frameState.stackSize() != 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
183 assert frameState.usages().count() == 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
184 ValueNode returnVal = frameState.stackAt(0);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
185 assert returnVal == frameState.usages().first();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
186
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
187 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
188 * Swap the top-of-stack value with the side-effect return value
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
189 * using the frame state.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
190 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
191 Kind returnKind = parser.currentInvokeReturnType.getKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
192 ValueNode tos = frameStateBuilder.pop(returnKind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
193 assert tos.getKind() == returnVal.getKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
194 FrameState newFrameState = frameStateBuilder.create(parser.stream.nextBCI(), parser.getNonIntrinsicAncestor(), false, new Kind[]{returnKind},
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
195 new ValueNode[]{returnVal});
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
196 frameState.replaceAndDelete(newFrameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
197 frameStateBuilder.push(returnKind, tos);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
198 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
199 if (stateAfterReturn == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
200 if (intrinsic != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
201 assert intrinsic.isCompilationRoot();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
202 stateAfterReturn = graph.add(new FrameState(BytecodeFrame.INVALID_FRAMESTATE_BCI));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
203 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
204 stateAfterReturn = frameStateBuilder.create(parser.stream.nextBCI(), null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
205 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
206 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
207 frameState.replaceAndDelete(stateAfterReturn);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
208 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
209 } else if (frameState.bci == BytecodeFrame.BEFORE_BCI) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
210 if (stateBefore == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
211 stateBefore = graph.start().stateAfter();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
212 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
213 if (stateBefore != frameState) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
214 frameState.replaceAndDelete(stateBefore);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
215 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
216 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
217 assert frameState.bci == BytecodeFrame.INVALID_FRAMESTATE_BCI;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
218 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
219 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
220 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
221 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
222 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
223 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
224
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
225 private static class Target {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
226 FixedNode fixed;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
227 FrameStateBuilder state;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
228
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
229 public Target(FixedNode fixed, FrameStateBuilder state) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
230 this.fixed = fixed;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
231 this.state = state;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
232 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
233 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
234
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
235 private static class ExplodedLoopContext {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
236 private BciBlock header;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
237 private int[] targetPeelIteration;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
238 private int peelIteration;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
239 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
240
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
241 @SuppressWarnings("serial")
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
242 public static class BytecodeParserError extends JVMCIError {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
243
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
244 public BytecodeParserError(Throwable cause) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
245 super(cause);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
246 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
247
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
248 public BytecodeParserError(String msg, Object... args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
249 super(msg, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
250 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
251 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
252
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
253 private final GraphBuilderPhase.Instance graphBuilderInstance;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
254 protected final StructuredGraph graph;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
255
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
256 private BciBlockMapping blockMap;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
257 private LocalLiveness liveness;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
258 protected final int entryBCI;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
259 private final BytecodeParser parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
260
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
261 private LineNumberTable lnt;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
262 private int previousLineNumber;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
263 private int currentLineNumber;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
264
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
265 private ValueNode methodSynchronizedObject;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
266
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
267 private ValueNode returnValue;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
268 private FixedWithNextNode beforeReturnNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
269 private ValueNode unwindValue;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
270 private FixedWithNextNode beforeUnwindNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
271
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
272 private FixedWithNextNode lastInstr; // the last instruction added
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
273 private final boolean explodeLoops;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
274 private final boolean mergeExplosions;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
275 private final Map<FrameStateBuilder, Integer> mergeExplosionsMap;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
276 private Deque<ExplodedLoopContext> explodeLoopsContext;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
277 private int nextPeelIteration = 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
278 private boolean controlFlowSplit;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
279 private final InvocationPluginReceiver invocationPluginReceiver = new InvocationPluginReceiver(this);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
280
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
281 private FixedWithNextNode[] firstInstructionArray;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
282 private FrameStateBuilder[] entryStateArray;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
283 private FixedWithNextNode[][] firstInstructionMatrix;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
284 private FrameStateBuilder[][] entryStateMatrix;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
285
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
286 protected BytecodeParser(GraphBuilderPhase.Instance graphBuilderInstance, StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI, IntrinsicContext intrinsicContext) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
287 this.graphBuilderInstance = graphBuilderInstance;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
288 this.graph = graph;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
289 this.graphBuilderConfig = graphBuilderInstance.graphBuilderConfig;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
290 this.optimisticOpts = graphBuilderInstance.optimisticOpts;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
291 this.metaAccess = graphBuilderInstance.metaAccess;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
292 this.stampProvider = graphBuilderInstance.stampProvider;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
293 this.constantReflection = graphBuilderInstance.constantReflection;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
294 this.stream = new BytecodeStream(method.getCode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
295 this.profilingInfo = (graphBuilderConfig.getUseProfiling() ? method.getProfilingInfo() : null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
296 this.constantPool = method.getConstantPool();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
297 this.method = method;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
298 this.intrinsicContext = intrinsicContext;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
299 this.entryBCI = entryBCI;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
300 this.parent = parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
301
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
302 assert method.getCode() != null : "method must contain bytecodes: " + method;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
303
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
304 if (graphBuilderConfig.insertNonSafepointDebugInfo() && !parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
305 lnt = method.getLineNumberTable();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
306 previousLineNumber = -1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
307 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
308
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
309 LoopExplosionPlugin loopExplosionPlugin = graphBuilderConfig.getPlugins().getLoopExplosionPlugin();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
310 if (loopExplosionPlugin != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
311 explodeLoops = loopExplosionPlugin.shouldExplodeLoops(method);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
312 if (explodeLoops) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
313 mergeExplosions = loopExplosionPlugin.shouldMergeExplosions(method);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
314 mergeExplosionsMap = new HashMap<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
315 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
316 mergeExplosions = false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
317 mergeExplosionsMap = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
318 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
319 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
320 explodeLoops = false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
321 mergeExplosions = false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
322 mergeExplosionsMap = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
323 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
324 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
325
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
326 public ValueNode getReturnValue() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
327 return returnValue;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
328 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
329
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
330 public FixedWithNextNode getBeforeReturnNode() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
331 return this.beforeReturnNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
332 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
333
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
334 public ValueNode getUnwindValue() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
335 return unwindValue;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
336 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
337
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
338 public FixedWithNextNode getBeforeUnwindNode() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
339 return this.beforeUnwindNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
340 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
341
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
342 protected void buildRootMethod() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
343 FrameStateBuilder startFrameState = new FrameStateBuilder(this, method, graph);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
344 startFrameState.initializeForMethodStart(graphBuilderConfig.eagerResolving() || intrinsicContext != null, graphBuilderConfig.getPlugins().getParameterPlugins());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
345
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
346 try (IntrinsicScope s = intrinsicContext != null ? new IntrinsicScope(this) : null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
347 build(graph.start(), startFrameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
348 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
349
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
350 cleanupFinalGraph();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
351 ComputeLoopFrequenciesClosure.compute(graph);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
352 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
353
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
354 protected void build(FixedWithNextNode startInstruction, FrameStateBuilder startFrameState) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
355 if (PrintProfilingInformation.getValue() && profilingInfo != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
356 TTY.println("Profiling info for " + method.format("%H.%n(%p)"));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
357 TTY.println(MetaUtil.indent(profilingInfo.toString(method, CodeUtil.NEW_LINE), " "));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
358 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
359
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
360 try (Indent indent = Debug.logAndIndent("build graph for %s", method)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
361
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
362 // compute the block map, setup exception handlers and get the entrypoint(s)
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
363 BciBlockMapping newMapping = BciBlockMapping.create(stream, method);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
364 this.blockMap = newMapping;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
365 this.firstInstructionArray = new FixedWithNextNode[blockMap.getBlockCount()];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
366 this.entryStateArray = new FrameStateBuilder[blockMap.getBlockCount()];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
367
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
368 /*
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
369 * Configure the assertion checking behavior of the FrameStateBuilder. This needs to be
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
370 * done only when assertions are enabled, so it is wrapped in an assertion itself.
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
371 */
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
372 assert computeKindVerification(startFrameState);
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
373
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
374 try (Scope s = Debug.scope("LivenessAnalysis")) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
375 int maxLocals = method.getMaxLocals();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
376 liveness = LocalLiveness.compute(stream, blockMap.getBlocks(), maxLocals, blockMap.getLoopCount());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
377 } catch (Throwable e) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
378 throw Debug.handle(e);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
379 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
380
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
381 lastInstr = startInstruction;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
382 this.setCurrentFrameState(startFrameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
383 stream.setBCI(0);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
384
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
385 BciBlock startBlock = blockMap.getStartBlock();
21621
993853d22c14 Fix in the bytecode parser: Do not overwrite the stateAfter of the start instruction.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21611
diff changeset
386 if (this.parent == null) {
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
387 StartNode startNode = graph.start();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
388 if (method.isSynchronized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
389 assert !parsingIntrinsic();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
390 startNode.setStateAfter(createFrameState(BytecodeFrame.BEFORE_BCI, startNode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
391 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
392 if (!parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
393 if (graph.method() != null && graph.method().isJavaLangObjectInit()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
394 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
395 * Don't clear the receiver when Object.<init> is the compilation root.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
396 * The receiver is needed as input to RegisterFinalizerNode.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
397 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
398 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
399 frameState.clearNonLiveLocals(startBlock, liveness, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
400 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
401 assert bci() == 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
402 startNode.setStateAfter(createFrameState(bci(), startNode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
403 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
404 if (startNode.stateAfter() == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
405 FrameState stateAfterStart = createStateAfterStartOfReplacementGraph();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
406 startNode.setStateAfter(stateAfterStart);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
407 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
408 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
409 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
410 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
411
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
412 if (method.isSynchronized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
413 // add a monitor enter to the start block
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
414 methodSynchronizedObject = synchronizedObject(frameState, method);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
415 frameState.clearNonLiveLocals(startBlock, liveness, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
416 assert bci() == 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
417 genMonitorEnter(methodSynchronizedObject, bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
418 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
419
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
420 finishPrepare(lastInstr);
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
421
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
422 if (graphBuilderConfig.insertNonSafepointDebugInfo() && !parsingIntrinsic()) {
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
423 genInfoPointNode(InfopointReason.METHOD_START, null);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
424 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
425
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
426 currentBlock = blockMap.getStartBlock();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
427 setEntryState(startBlock, 0, frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
428 if (startBlock.isLoopHeader && !explodeLoops) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
429 appendGoto(startBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
430 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
431 setFirstInstruction(startBlock, 0, lastInstr);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
432 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
433
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
434 int index = 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
435 BciBlock[] blocks = blockMap.getBlocks();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
436 while (index < blocks.length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
437 BciBlock block = blocks[index];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
438 index = iterateBlock(blocks, block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
439 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
440
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
441 if (this.mergeExplosions) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
442 Debug.dump(graph, "Before loop detection");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
443 detectLoops(startInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
444 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
445
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
446 if (Debug.isDumpEnabled() && DumpDuringGraphBuilding.getValue() && this.beforeReturnNode != startInstruction) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
447 Debug.dump(graph, "Bytecodes parsed: " + method.getDeclaringClass().getUnqualifiedName() + "." + method.getName());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
448 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
449 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
450 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
451
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
452 private boolean computeKindVerification(FrameStateBuilder startFrameState) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
453 if (blockMap.hasJsrBytecodes) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
454 /*
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
455 * The JSR return address is an int value, but stored using the astore bytecode. Instead
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
456 * of weakening the kind assertion checking for all methods, we disable it completely
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
457 * for methods that contain a JSR bytecode.
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
458 */
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
459 startFrameState.disableKindVerification();
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
460 }
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
461
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
462 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
463 if (plugin.canChangeStackKind(this)) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
464 /*
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
465 * We have a plugin that can change the kind of values, so no kind assertion
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
466 * checking is possible.
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
467 */
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
468 startFrameState.disableKindVerification();
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
469 }
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
470 }
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
471 return true;
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
472 }
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
473
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
474 /**
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
475 * Hook for subclasses to modify the graph start instruction or append new instructions to it.
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
476 *
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
477 * @param startInstr the start instruction of the graph
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
478 */
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
479 protected void finishPrepare(FixedWithNextNode startInstr) {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
480 }
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
481
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
482 protected void cleanupFinalGraph() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
483 GraphUtil.normalizeLoops(graph);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
484
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
485 // Remove dead parameters.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
486 for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
487 if (param.hasNoUsages()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
488 assert param.inputs().isEmpty();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
489 param.safeDelete();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
490 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
491 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
492
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
493 // Remove redundant begin nodes.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
494 Debug.dump(graph, "Before removing redundant begins");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
495 for (BeginNode beginNode : graph.getNodes(BeginNode.TYPE)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
496 Node predecessor = beginNode.predecessor();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
497 if (predecessor instanceof ControlSplitNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
498 // The begin node is necessary.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
499 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
500 if (beginNode.hasUsages()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
501 reanchorGuardedNodes(beginNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
502 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
503 GraphUtil.unlinkFixedNode(beginNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
504 beginNode.safeDelete();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
505 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
506 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
507 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
508
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
509 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
510 * Removes {@link GuardedNode}s from {@code beginNode}'s usages and re-attaches them to an
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
511 * appropriate preceeding {@link GuardingNode}.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
512 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
513 protected void reanchorGuardedNodes(BeginNode beginNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
514 // Find the new guarding node
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
515 GuardingNode guarding = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
516 Node pred = beginNode.predecessor();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
517 while (pred != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
518 if (pred instanceof BeginNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
519 if (pred.predecessor() instanceof ControlSplitNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
520 guarding = (GuardingNode) pred;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
521 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
522 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
523 } else if (pred.getNodeClass().getAllowedUsageTypes().contains(InputType.Guard)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
524 guarding = (GuardingNode) pred;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
525 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
526 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
527 pred = pred.predecessor();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
528 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
529
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
530 // Reset the guard for all of beginNode's usages
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
531 for (Node usage : beginNode.usages().snapshot()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
532 GuardedNode guarded = (GuardedNode) usage;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
533 assert guarded.getGuard() == beginNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
534 guarded.setGuard(guarding);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
535 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
536 assert beginNode.hasNoUsages() : beginNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
537 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
538
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
539 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
540 * Creates the frame state after the start node of a graph for an {@link IntrinsicContext
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
541 * intrinsic} that is the parse root (either for root compiling or for post-parse inlining).
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
542 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
543 private FrameState createStateAfterStartOfReplacementGraph() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
544 assert parent == null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
545 assert frameState.getMethod().equals(intrinsicContext.getIntrinsicMethod());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
546 assert bci() == 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
547 assert frameState.stackSize() == 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
548 FrameState stateAfterStart;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
549 if (intrinsicContext.isPostParseInlined()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
550 stateAfterStart = graph.add(new FrameState(BytecodeFrame.BEFORE_BCI));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
551 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
552 ResolvedJavaMethod original = intrinsicContext.getOriginalMethod();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
553 ValueNode[] locals;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
554 if (original.getMaxLocals() == frameState.localsSize() || original.isNative()) {
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
555 locals = new ValueNode[original.getMaxLocals()];
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
556 for (int i = 0; i < locals.length; i++) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
557 ValueNode node = frameState.locals[i];
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
558 if (node == FrameState.TWO_SLOT_MARKER) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
559 node = null;
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
560 }
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
561 locals[i] = node;
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
562 }
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
563 locals = frameState.locals;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
564 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
565 locals = new ValueNode[original.getMaxLocals()];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
566 int parameterCount = original.getSignature().getParameterCount(!original.isStatic());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
567 for (int i = 0; i < parameterCount; i++) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
568 ValueNode param = frameState.locals[i];
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
569 if (param == FrameState.TWO_SLOT_MARKER) {
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
570 param = null;
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
571 }
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
572 locals[i] = param;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
573 assert param == null || param instanceof ParameterNode || param.isConstant();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
574 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
575 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
576 ValueNode[] stack = {};
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
577 int stackSize = 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
578 ValueNode[] locks = {};
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
579 List<MonitorIdNode> monitorIds = Collections.emptyList();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
580 stateAfterStart = graph.add(new FrameState(null, original, 0, locals, stack, stackSize, locks, monitorIds, false, false));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
581 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
582 return stateAfterStart;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
583 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
584
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
585 private void detectLoops(FixedNode startInstruction) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
586 NodeBitMap visited = graph.createNodeBitMap();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
587 NodeBitMap active = graph.createNodeBitMap();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
588 Deque<Node> stack = new ArrayDeque<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
589 stack.add(startInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
590 visited.mark(startInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
591 while (!stack.isEmpty()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
592 Node next = stack.peek();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
593 assert next.isDeleted() || visited.isMarked(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
594 if (next.isDeleted() || active.isMarked(next)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
595 stack.pop();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
596 if (!next.isDeleted()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
597 active.clear(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
598 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
599 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
600 active.mark(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
601 for (Node n : next.cfgSuccessors()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
602 if (active.contains(n)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
603 // Detected cycle.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
604 assert n instanceof MergeNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
605 assert next instanceof EndNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
606 MergeNode merge = (MergeNode) n;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
607 EndNode endNode = (EndNode) next;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
608 merge.removeEnd(endNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
609 FixedNode afterMerge = merge.next();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
610 if (!(afterMerge instanceof EndNode) || !(((EndNode) afterMerge).merge() instanceof LoopBeginNode)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
611 merge.setNext(null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
612 LoopBeginNode newLoopBegin = this.appendLoopBegin(merge);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
613 newLoopBegin.setNext(afterMerge);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
614 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
615 LoopBeginNode loopBegin = (LoopBeginNode) ((EndNode) merge.next()).merge();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
616 LoopEndNode loopEnd = graph.add(new LoopEndNode(loopBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
617 if (parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
618 loopEnd.disableSafepoint();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
619 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
620 endNode.replaceAndDelete(loopEnd);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
621 } else if (visited.contains(n)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
622 // Normal merge into a branch we are already exploring.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
623 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
624 visited.mark(n);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
625 stack.push(n);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
626 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
627 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
628 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
629 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
630
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
631 Debug.dump(graph, "After loops detected");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
632 insertLoopEnds(startInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
633 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
634
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
635 private void insertLoopEnds(FixedNode startInstruction) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
636 NodeBitMap visited = graph.createNodeBitMap();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
637 Deque<Node> stack = new ArrayDeque<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
638 stack.add(startInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
639 visited.mark(startInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
640 List<LoopBeginNode> loopBegins = new ArrayList<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
641 while (!stack.isEmpty()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
642 Node next = stack.pop();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
643 assert visited.isMarked(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
644 if (next instanceof LoopBeginNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
645 loopBegins.add((LoopBeginNode) next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
646 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
647 for (Node n : next.cfgSuccessors()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
648 if (visited.contains(n)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
649 // Nothing to do.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
650 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
651 visited.mark(n);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
652 stack.push(n);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
653 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
654 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
655 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
656
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
657 IdentityHashMap<LoopBeginNode, List<LoopBeginNode>> innerLoopsMap = new IdentityHashMap<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
658 for (int i = loopBegins.size() - 1; i >= 0; --i) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
659 LoopBeginNode loopBegin = loopBegins.get(i);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
660 insertLoopExits(loopBegin, innerLoopsMap);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
661 if (DumpDuringGraphBuilding.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
662 Debug.dump(graph, "After building loop exits for %s.", loopBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
663 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
664 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
665
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
666 // Remove degenerated merges with only one predecessor.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
667 for (LoopBeginNode loopBegin : loopBegins) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
668 Node pred = loopBegin.forwardEnd().predecessor();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
669 if (pred instanceof MergeNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
670 MergeNode.removeMergeIfDegenerated((MergeNode) pred);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
671 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
672 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
673 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
674
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
675 private void insertLoopExits(LoopBeginNode loopBegin, IdentityHashMap<LoopBeginNode, List<LoopBeginNode>> innerLoopsMap) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
676 NodeBitMap visited = graph.createNodeBitMap();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
677 Deque<Node> stack = new ArrayDeque<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
678 for (LoopEndNode loopEnd : loopBegin.loopEnds()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
679 stack.push(loopEnd);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
680 visited.mark(loopEnd);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
681 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
682
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
683 List<ControlSplitNode> controlSplits = new ArrayList<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
684 List<LoopBeginNode> innerLoopBegins = new ArrayList<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
685
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
686 while (!stack.isEmpty()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
687 Node current = stack.pop();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
688 if (current == loopBegin) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
689 continue;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
690 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
691 for (Node pred : current.cfgPredecessors()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
692 if (!visited.isMarked(pred)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
693 visited.mark(pred);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
694 if (pred instanceof LoopExitNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
695 // Inner loop
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
696 LoopExitNode loopExitNode = (LoopExitNode) pred;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
697 LoopBeginNode innerLoopBegin = loopExitNode.loopBegin();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
698 if (!visited.isMarked(innerLoopBegin)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
699 stack.push(innerLoopBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
700 visited.mark(innerLoopBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
701 innerLoopBegins.add(innerLoopBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
702 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
703 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
704 if (pred instanceof ControlSplitNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
705 ControlSplitNode controlSplitNode = (ControlSplitNode) pred;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
706 controlSplits.add(controlSplitNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
707 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
708 stack.push(pred);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
709 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
710 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
711 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
712 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
713
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
714 for (ControlSplitNode controlSplit : controlSplits) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
715 for (Node succ : controlSplit.cfgSuccessors()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
716 if (!visited.isMarked(succ)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
717 LoopExitNode loopExit = graph.add(new LoopExitNode(loopBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
718 FixedNode next = ((FixedWithNextNode) succ).next();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
719 next.replaceAtPredecessor(loopExit);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
720 loopExit.setNext(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
721 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
722 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
723 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
724
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
725 for (LoopBeginNode inner : innerLoopBegins) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
726 addLoopExits(loopBegin, inner, innerLoopsMap, visited);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
727 if (DumpDuringGraphBuilding.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
728 Debug.dump(graph, "After adding loop exits for %s.", inner);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
729 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
730 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
731
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
732 innerLoopsMap.put(loopBegin, innerLoopBegins);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
733 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
734
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
735 private void addLoopExits(LoopBeginNode loopBegin, LoopBeginNode inner, IdentityHashMap<LoopBeginNode, List<LoopBeginNode>> innerLoopsMap, NodeBitMap visited) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
736 for (LoopExitNode exit : inner.loopExits()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
737 if (!visited.isMarked(exit)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
738 LoopExitNode newLoopExit = graph.add(new LoopExitNode(loopBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
739 FixedNode next = exit.next();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
740 next.replaceAtPredecessor(newLoopExit);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
741 newLoopExit.setNext(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
742 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
743 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
744
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
745 for (LoopBeginNode innerInner : innerLoopsMap.get(inner)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
746 addLoopExits(loopBegin, innerInner, innerLoopsMap, visited);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
747 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
748 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
749
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
750 private int iterateBlock(BciBlock[] blocks, BciBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
751 if (block.isLoopHeader && this.explodeLoops) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
752 return iterateExplodedLoopHeader(blocks, block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
753 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
754 processBlock(this, block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
755 return block.getId() + 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
756 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
757 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
758
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
759 private int iterateExplodedLoopHeader(BciBlock[] blocks, BciBlock header) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
760 if (explodeLoopsContext == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
761 explodeLoopsContext = new ArrayDeque<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
762 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
763
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
764 ExplodedLoopContext context = new ExplodedLoopContext();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
765 context.header = header;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
766 context.peelIteration = this.getCurrentDimension();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
767 if (this.mergeExplosions) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
768 this.addToMergeCache(getEntryState(context.header, context.peelIteration), context.peelIteration);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
769 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
770 explodeLoopsContext.push(context);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
771 if (Debug.isDumpEnabled() && DumpDuringGraphBuilding.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
772 Debug.dump(graph, "before loop explosion dimension " + context.peelIteration);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
773 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
774 peelIteration(blocks, header, context);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
775 explodeLoopsContext.pop();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
776 return header.loopEnd + 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
777 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
778
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
779 private void addToMergeCache(FrameStateBuilder key, int dimension) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
780 mergeExplosionsMap.put(key, dimension);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
781 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
782
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
783 private void peelIteration(BciBlock[] blocks, BciBlock header, ExplodedLoopContext context) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
784 while (true) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
785 if (TraceParserPlugins.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
786 traceWithContext("exploding loop, iteration %d", context.peelIteration);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
787 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
788 processBlock(this, header);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
789 int j = header.getId() + 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
790 while (j <= header.loopEnd) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
791 BciBlock block = blocks[j];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
792 j = iterateBlock(blocks, block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
793 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
794
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
795 int[] targets = context.targetPeelIteration;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
796 if (targets != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
797 // We were reaching the backedge during explosion. Explode further.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
798 for (int i = 0; i < targets.length; ++i) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
799 context.peelIteration = targets[i];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
800 context.targetPeelIteration = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
801 if (Debug.isDumpEnabled() && DumpDuringGraphBuilding.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
802 Debug.dump(graph, "next loop explosion iteration " + context.peelIteration);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
803 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
804 if (i < targets.length - 1) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
805 peelIteration(blocks, header, context);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
806 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
807 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
808 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
809 // We did not reach the backedge. Exit.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
810 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
811 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
812 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
813 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
814
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
815 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
816 * @param type the unresolved type of the constant
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
817 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
818 protected void handleUnresolvedLoadConstant(JavaType type) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
819 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
820 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
821 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
822
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
823 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
824 * @param type the unresolved type of the type check
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
825 * @param object the object value whose type is being checked against {@code type}
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
826 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
827 protected void handleUnresolvedCheckCast(JavaType type, ValueNode object) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
828 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
829 append(new FixedGuardNode(graph.unique(new IsNullNode(object)), Unresolved, InvalidateRecompile));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
830 frameState.push(Kind.Object, appendConstant(JavaConstant.NULL_POINTER));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
831 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
832
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
833 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
834 * @param type the unresolved type of the type check
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
835 * @param object the object value whose type is being checked against {@code type}
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
836 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
837 protected void handleUnresolvedInstanceOf(JavaType type, ValueNode object) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
838 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
839 AbstractBeginNode successor = graph.add(new BeginNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
840 DeoptimizeNode deopt = graph.add(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
841 append(new IfNode(graph.unique(new IsNullNode(object)), successor, deopt, 1));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
842 lastInstr = successor;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
843 frameState.push(Kind.Int, appendConstant(JavaConstant.INT_0));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
844 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
845
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
846 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
847 * @param type the type being instantiated
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
848 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
849 protected void handleUnresolvedNewInstance(JavaType type) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
850 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
851 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
852 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
853
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
854 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
855 * @param type the type of the array being instantiated
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
856 * @param length the length of the array
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
857 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
858 protected void handleUnresolvedNewObjectArray(JavaType type, ValueNode length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
859 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
860 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
861 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
862
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
863 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
864 * @param type the type being instantiated
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
865 * @param dims the dimensions for the multi-array
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
866 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
867 protected void handleUnresolvedNewMultiArray(JavaType type, List<ValueNode> dims) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
868 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
869 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
870 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
871
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
872 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
873 * @param field the unresolved field
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
874 * @param receiver the object containing the field or {@code null} if {@code field} is static
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
875 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
876 protected void handleUnresolvedLoadField(JavaField field, ValueNode receiver) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
877 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
878 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
879 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
880
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
881 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
882 * @param field the unresolved field
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
883 * @param value the value being stored to the field
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
884 * @param receiver the object containing the field or {@code null} if {@code field} is static
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
885 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
886 protected void handleUnresolvedStoreField(JavaField field, ValueNode value, ValueNode receiver) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
887 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
888 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
889 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
890
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
891 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
892 * @param type
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
893 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
894 protected void handleUnresolvedExceptionType(JavaType type) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
895 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
896 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
897 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
898
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
899 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
900 * @param javaMethod
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
901 * @param invokeKind
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
902 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
903 protected void handleUnresolvedInvoke(JavaMethod javaMethod, InvokeKind invokeKind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
904 assert !graphBuilderConfig.eagerResolving();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
905 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
906 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
907
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
908 private DispatchBeginNode handleException(ValueNode exceptionObject, int bci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
909 assert bci == BytecodeFrame.BEFORE_BCI || bci == bci() : "invalid bci";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
910 Debug.log("Creating exception dispatch edges at %d, exception object=%s, exception seen=%s", bci, exceptionObject, (profilingInfo == null ? "" : profilingInfo.getExceptionSeen(bci)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
911
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
912 BciBlock dispatchBlock = currentBlock.exceptionDispatchBlock();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
913 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
914 * The exception dispatch block is always for the last bytecode of a block, so if we are not
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
915 * at the endBci yet, there is no exception handler for this bci and we can unwind
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
916 * immediately.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
917 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
918 if (bci != currentBlock.endBci || dispatchBlock == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
919 dispatchBlock = blockMap.getUnwindBlock();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
920 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
921
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
922 FrameStateBuilder dispatchState = frameState.copy();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
923 dispatchState.clearStack();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
924
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
925 DispatchBeginNode dispatchBegin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
926 if (exceptionObject == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
927 dispatchBegin = graph.add(new ExceptionObjectNode(metaAccess));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
928 dispatchState.push(Kind.Object, dispatchBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
929 dispatchState.setRethrowException(true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
930 dispatchBegin.setStateAfter(dispatchState.create(bci, dispatchBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
931 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
932 dispatchBegin = graph.add(new DispatchBeginNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
933 dispatchState.push(Kind.Object, exceptionObject);
21751
1524f4f7894d fix rethrowException flag in exception dispatch state
Andreas Woess <andreas.woess@oracle.com>
parents: 21720
diff changeset
934 dispatchState.setRethrowException(true);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
935 dispatchBegin.setStateAfter(dispatchState.create(bci, dispatchBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
936 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
937 this.controlFlowSplit = true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
938 FixedNode target = createTarget(dispatchBlock, dispatchState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
939 FixedWithNextNode finishedDispatch = finishInstruction(dispatchBegin, dispatchState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
940 finishedDispatch.setNext(target);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
941 return dispatchBegin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
942 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
943
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
944 protected ValueNode genLoadIndexed(ValueNode array, ValueNode index, Kind kind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
945 return LoadIndexedNode.create(array, index, kind, metaAccess, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
946 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
947
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
948 protected void genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
949 add(new StoreIndexedNode(array, index, kind, value));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
950 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
951
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
952 protected ValueNode genIntegerAdd(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
953 return AddNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
954 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
955
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
956 protected ValueNode genIntegerSub(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
957 return SubNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
958 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
959
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
960 protected ValueNode genIntegerMul(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
961 return MulNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
962 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
963
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
964 protected ValueNode genFloatAdd(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
965 return AddNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
966 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
967
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
968 protected ValueNode genFloatSub(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
969 return SubNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
970 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
971
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
972 protected ValueNode genFloatMul(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
973 return MulNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
974 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
975
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
976 protected ValueNode genFloatDiv(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
977 return DivNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
978 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
979
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
980 protected ValueNode genFloatRem(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
981 return new RemNode(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
982 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
983
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
984 protected ValueNode genIntegerDiv(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
985 return new IntegerDivNode(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
986 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
987
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
988 protected ValueNode genIntegerRem(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
989 return new IntegerRemNode(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
990 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
991
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
992 protected ValueNode genNegateOp(ValueNode x) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
993 return (new NegateNode(x));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
994 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
995
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
996 protected ValueNode genLeftShift(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
997 return new LeftShiftNode(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
998 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
999
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1000 protected ValueNode genRightShift(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1001 return new RightShiftNode(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1002 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1003
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1004 protected ValueNode genUnsignedRightShift(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1005 return new UnsignedRightShiftNode(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1006 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1007
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1008 protected ValueNode genAnd(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1009 return AndNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1010 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1011
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1012 protected ValueNode genOr(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1013 return OrNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1014 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1015
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1016 protected ValueNode genXor(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1017 return XorNode.create(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1018 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1019
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1020 protected ValueNode genNormalizeCompare(ValueNode x, ValueNode y, boolean isUnorderedLess) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1021 return NormalizeCompareNode.create(x, y, isUnorderedLess, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1022 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1023
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1024 protected ValueNode genFloatConvert(FloatConvert op, ValueNode input) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1025 return FloatConvertNode.create(op, input);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1026 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1027
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1028 protected ValueNode genNarrow(ValueNode input, int bitCount) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1029 return NarrowNode.create(input, bitCount);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1030 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1031
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1032 protected ValueNode genSignExtend(ValueNode input, int bitCount) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1033 return SignExtendNode.create(input, bitCount);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1034 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1035
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1036 protected ValueNode genZeroExtend(ValueNode input, int bitCount) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1037 return ZeroExtendNode.create(input, bitCount);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1038 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1039
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1040 protected void genGoto() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1041 appendGoto(currentBlock.getSuccessor(0));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1042 assert currentBlock.numNormalSuccessors() == 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1043 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1044
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1045 protected LogicNode genObjectEquals(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1046 return ObjectEqualsNode.create(x, y, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1047 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1048
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1049 protected LogicNode genIntegerEquals(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1050 return IntegerEqualsNode.create(x, y, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1051 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1052
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1053 protected LogicNode genIntegerLessThan(ValueNode x, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1054 return IntegerLessThanNode.create(x, y, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1055 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1056
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1057 protected ValueNode genUnique(ValueNode x) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1058 return (ValueNode) graph.unique((Node & ValueNumberable) x);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1059 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1060
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1061 protected ValueNode genIfNode(LogicNode condition, FixedNode falseSuccessor, FixedNode trueSuccessor, double d) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1062 return new IfNode(condition, falseSuccessor, trueSuccessor, d);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1063 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1064
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1065 protected void genThrow() {
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
1066 genInfoPointNode(InfopointReason.LINE_NUMBER, null);
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
1067
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1068 ValueNode exception = frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1069 append(new FixedGuardNode(graph.unique(new IsNullNode(exception)), NullCheckException, InvalidateReprofile, true));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1070 lastInstr.setNext(handleException(exception, bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1071 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1072
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1073 protected ValueNode createCheckCast(ResolvedJavaType type, ValueNode object, JavaTypeProfile profileForTypeCheck, boolean forStoreCheck) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1074 return CheckCastNode.create(type, object, profileForTypeCheck, forStoreCheck, graph.getAssumptions());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1075 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1076
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1077 protected ValueNode createInstanceOf(ResolvedJavaType type, ValueNode object, JavaTypeProfile profileForTypeCheck) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1078 return InstanceOfNode.create(type, object, profileForTypeCheck);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1079 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1080
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1081 protected ValueNode genConditional(ValueNode x) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1082 return new ConditionalNode((LogicNode) x);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1083 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1084
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1085 protected NewInstanceNode createNewInstance(ResolvedJavaType type, boolean fillContents) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1086 return new NewInstanceNode(type, fillContents);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1087 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1088
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1089 protected NewArrayNode createNewArray(ResolvedJavaType elementType, ValueNode length, boolean fillContents) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1090 return new NewArrayNode(elementType, length, fillContents);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1091 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1092
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1093 protected NewMultiArrayNode createNewMultiArray(ResolvedJavaType type, List<ValueNode> dimensions) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1094 return new NewMultiArrayNode(type, dimensions.toArray(new ValueNode[0]));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1095 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1096
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1097 protected ValueNode genLoadField(ValueNode receiver, ResolvedJavaField field) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1098 return new LoadFieldNode(receiver, field);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1099 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1100
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1101 protected ValueNode emitExplicitNullCheck(ValueNode receiver) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1102 if (StampTool.isPointerNonNull(receiver.stamp())) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1103 return receiver;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1104 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1105 BytecodeExceptionNode exception = graph.add(new BytecodeExceptionNode(metaAccess, NullPointerException.class));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1106 AbstractBeginNode falseSucc = graph.add(new BeginNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1107 PiNode nonNullReceiver = graph.unique(new PiNode(receiver, receiver.stamp().join(objectNonNull())));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1108 nonNullReceiver.setGuard(falseSucc);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1109 append(new IfNode(graph.unique(new IsNullNode(receiver)), exception, falseSucc, 0.01));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1110 lastInstr = falseSucc;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1111
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1112 exception.setStateAfter(createFrameState(bci(), exception));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1113 exception.setNext(handleException(exception, bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1114 return nonNullReceiver;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1115 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1116
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1117 protected void emitExplicitBoundsCheck(ValueNode index, ValueNode length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1118 AbstractBeginNode trueSucc = graph.add(new BeginNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1119 BytecodeExceptionNode exception = graph.add(new BytecodeExceptionNode(metaAccess, ArrayIndexOutOfBoundsException.class, index));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1120 append(new IfNode(graph.unique(IntegerBelowNode.create(index, length, constantReflection)), trueSucc, exception, 0.99));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1121 lastInstr = trueSucc;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1122
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1123 exception.setStateAfter(createFrameState(bci(), exception));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1124 exception.setNext(handleException(exception, bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1125 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1126
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1127 protected ValueNode genArrayLength(ValueNode x) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1128 return ArrayLengthNode.create(x, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1129 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1130
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1131 protected void genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1132 StoreFieldNode storeFieldNode = new StoreFieldNode(receiver, field, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1133 append(storeFieldNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1134 storeFieldNode.setStateAfter(this.createFrameState(stream.nextBCI(), storeFieldNode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1135 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1136
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1137 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1138 * Ensure that concrete classes are at least linked before generating an invoke. Interfaces may
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1139 * never be linked so simply return true for them.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1140 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1141 * @param target
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1142 * @return true if the declared holder is an interface or is linked
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1143 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1144 private static boolean callTargetIsResolved(JavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1145 if (target instanceof ResolvedJavaMethod) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1146 ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1147 ResolvedJavaType resolvedType = resolvedTarget.getDeclaringClass();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1148 return resolvedType.isInterface() || resolvedType.isLinked();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1149 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1150 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1151 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1152
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1153 protected void genInvokeStatic(JavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1154 if (callTargetIsResolved(target)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1155 ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1156 ResolvedJavaType holder = resolvedTarget.getDeclaringClass();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1157 if (!holder.isInitialized() && ResolveClassBeforeStaticInvoke.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1158 handleUnresolvedInvoke(target, InvokeKind.Static);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1159 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1160 ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1161 appendInvoke(InvokeKind.Static, resolvedTarget, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1162 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1163 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1164 handleUnresolvedInvoke(target, InvokeKind.Static);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1165 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1166 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1167
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1168 protected void genInvokeInterface(JavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1169 if (callTargetIsResolved(target)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1170 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1171 appendInvoke(InvokeKind.Interface, (ResolvedJavaMethod) target, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1172 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1173 handleUnresolvedInvoke(target, InvokeKind.Interface);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1174 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1175 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1176
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1177 protected void genInvokeDynamic(JavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1178 if (target instanceof ResolvedJavaMethod) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1179 JavaConstant appendix = constantPool.lookupAppendix(stream.readCPI4(), Bytecodes.INVOKEDYNAMIC);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1180 if (appendix != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1181 frameState.push(Kind.Object, ConstantNode.forConstant(appendix, metaAccess, graph));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1182 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1183 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(false));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1184 appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1185 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1186 handleUnresolvedInvoke(target, InvokeKind.Static);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1187 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1188 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1189
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1190 protected void genInvokeVirtual(JavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1191 if (callTargetIsResolved(target)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1192 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1193 * Special handling for runtimes that rewrite an invocation of MethodHandle.invoke(...)
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1194 * or MethodHandle.invokeExact(...) to a static adapter. HotSpot does this - see
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1195 * https://wikis.oracle.com/display/HotSpotInternals/Method+handles +and+invokedynamic
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1196 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1197 boolean hasReceiver = !((ResolvedJavaMethod) target).isStatic();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1198 JavaConstant appendix = constantPool.lookupAppendix(stream.readCPI(), Bytecodes.INVOKEVIRTUAL);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1199 if (appendix != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1200 frameState.push(Kind.Object, ConstantNode.forConstant(appendix, metaAccess, graph));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1201 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1202 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(hasReceiver));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1203 if (hasReceiver) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1204 appendInvoke(InvokeKind.Virtual, (ResolvedJavaMethod) target, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1205 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1206 appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1207 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1208 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1209 handleUnresolvedInvoke(target, InvokeKind.Virtual);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1210 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1211
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1212 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1213
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1214 protected void genInvokeSpecial(JavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1215 if (callTargetIsResolved(target)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1216 assert target != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1217 assert target.getSignature() != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1218 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1219 appendInvoke(InvokeKind.Special, (ResolvedJavaMethod) target, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1220 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1221 handleUnresolvedInvoke(target, InvokeKind.Special);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1222 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1223 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1224
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1225 private InvokeKind currentInvokeKind;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1226 private JavaType currentInvokeReturnType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1227 protected FrameStateBuilder frameState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1228 protected BciBlock currentBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1229 protected final BytecodeStream stream;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1230 protected final GraphBuilderConfiguration graphBuilderConfig;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1231 protected final ResolvedJavaMethod method;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1232 protected final ProfilingInfo profilingInfo;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1233 protected final OptimisticOptimizations optimisticOpts;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1234 protected final ConstantPool constantPool;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1235 protected final MetaAccessProvider metaAccess;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1236 private final ConstantReflectionProvider constantReflection;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1237 private final StampProvider stampProvider;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1238 protected final IntrinsicContext intrinsicContext;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1239
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1240 public InvokeKind getInvokeKind() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1241 return currentInvokeKind;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1242 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1243
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1244 public JavaType getInvokeReturnType() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1245 return currentInvokeReturnType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1246 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1247
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1248 public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1249 appendInvoke(invokeKind, targetMethod, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1250 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1251
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1252 private void appendInvoke(InvokeKind initialInvokeKind, ResolvedJavaMethod initialTargetMethod, ValueNode[] args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1253 ResolvedJavaMethod targetMethod = initialTargetMethod;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1254 InvokeKind invokeKind = initialInvokeKind;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1255 if (initialInvokeKind.isIndirect()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1256 ResolvedJavaType contextType = this.frameState.getMethod().getDeclaringClass();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1257 ResolvedJavaMethod specialCallTarget = MethodCallTargetNode.findSpecialCallTarget(initialInvokeKind, args[0], initialTargetMethod, contextType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1258 if (specialCallTarget != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1259 invokeKind = InvokeKind.Special;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1260 targetMethod = specialCallTarget;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1261 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1262 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1263
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1264 Kind resultType = targetMethod.getSignature().getReturnKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1265 if (DeoptALot.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1266 append(new DeoptimizeNode(DeoptimizationAction.None, RuntimeConstraint));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1267 frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, graph));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1268 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1269 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1270
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1271 JavaType returnType = targetMethod.getSignature().getReturnType(method.getDeclaringClass());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1272 if (graphBuilderConfig.eagerResolving() || parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1273 returnType = returnType.resolve(targetMethod.getDeclaringClass());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1274 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1275 if (invokeKind.hasReceiver()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1276 args[0] = emitExplicitExceptions(args[0], null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1277 if (invokeKind.isIndirect() && profilingInfo != null && this.optimisticOpts.useTypeCheckHints()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1278 JavaTypeProfile profile = profilingInfo.getTypeProfile(bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1279 args[0] = TypeProfileProxyNode.proxify(args[0], profile);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1280 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1281
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1282 if (args[0].isNullConstant()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1283 append(new DeoptimizeNode(InvalidateRecompile, NullCheckException));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1284 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1285 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1286 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1287
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1288 try {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1289 currentInvokeReturnType = returnType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1290 currentInvokeKind = invokeKind;
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
1291 if (tryNodePluginForInvocation(args, targetMethod)) {
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1292 if (TraceParserPlugins.getValue()) {
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
1293 traceWithContext("used node plugin for %s", targetMethod.format("%h.%n(%p)"));
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1294 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1295 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1296 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1297
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1298 if (invokeKind.isDirect()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1299 if (tryInvocationPlugin(args, targetMethod, resultType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1300 if (TraceParserPlugins.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1301 traceWithContext("used invocation plugin for %s", targetMethod.format("%h.%n(%p)"));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1302 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1303 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1304 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1305
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1306 if (tryInline(args, targetMethod, returnType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1307 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1308 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1309 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1310 } finally {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1311 currentInvokeReturnType = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1312 currentInvokeKind = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1313 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1314
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1315 MethodCallTargetNode callTarget = graph.add(createMethodCallTarget(invokeKind, targetMethod, args, returnType));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1316
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1317 // be conservative if information was not recorded (could result in endless
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1318 // recompiles otherwise)
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1319 Invoke invoke;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1320 if (graphBuilderConfig.omitAllExceptionEdges() ||
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1321 (!StressInvokeWithExceptionNode.getValue() && optimisticOpts.useExceptionProbability() && profilingInfo != null && profilingInfo.getExceptionSeen(bci()) == TriState.FALSE)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1322 invoke = createInvoke(callTarget, resultType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1323 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1324 invoke = createInvokeWithException(callTarget, resultType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1325 AbstractBeginNode beginNode = graph.add(new KillingBeginNode(LocationIdentity.any()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1326 invoke.setNext(beginNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1327 lastInstr = beginNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1328 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1329
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1330 for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1331 plugin.notifyNotInlined(this, targetMethod, invoke);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1332 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1333 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1334
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1335 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1336 * Contains all the assertion checking logic around the application of an
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1337 * {@link InvocationPlugin}. This class is only loaded when assertions are enabled.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1338 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1339 class InvocationPluginAssertions {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1340 final InvocationPlugin plugin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1341 final ValueNode[] args;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1342 final ResolvedJavaMethod targetMethod;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1343 final Kind resultType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1344 final int beforeStackSize;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1345 final boolean needsNullCheck;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1346 final int nodeCount;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1347 final Mark mark;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1348
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1349 public InvocationPluginAssertions(InvocationPlugin plugin, ValueNode[] args, ResolvedJavaMethod targetMethod, Kind resultType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1350 guarantee(assertionsEnabled(), "%s should only be loaded and instantiated if assertions are enabled", getClass().getSimpleName());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1351 this.plugin = plugin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1352 this.targetMethod = targetMethod;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1353 this.args = args;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1354 this.resultType = resultType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1355 this.beforeStackSize = frameState.stackSize();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1356 this.needsNullCheck = !targetMethod.isStatic() && args[0].getKind() == Kind.Object && !StampTool.isPointerNonNull(args[0].stamp());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1357 this.nodeCount = graph.getNodeCount();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1358 this.mark = graph.getMark();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1359 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1360
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1361 String error(String format, Object... a) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1362 return String.format(format, a) + String.format("%n\tplugin at %s", plugin.getApplySourceLocation(metaAccess));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1363 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1364
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1365 boolean check(boolean pluginResult) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1366 if (pluginResult == true) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1367 int expectedStackSize = beforeStackSize + resultType.getSlotCount();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1368 assert expectedStackSize == frameState.stackSize() : error("plugin manipulated the stack incorrectly: expected=%d, actual=%d", expectedStackSize, frameState.stackSize());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1369 NodeIterable<Node> newNodes = graph.getNewNodes(mark);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1370 assert !needsNullCheck || isPointerNonNull(args[0].stamp()) : error("plugin needs to null check the receiver of %s: receiver=%s", targetMethod.format("%H.%n(%p)"), args[0]);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1371 for (Node n : newNodes) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1372 if (n instanceof StateSplit) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1373 StateSplit stateSplit = (StateSplit) n;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1374 assert stateSplit.stateAfter() != null || !stateSplit.hasSideEffect() : error("%s node added by plugin for %s need to have a non-null frame state: %s",
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1375 StateSplit.class.getSimpleName(), targetMethod.format("%H.%n(%p)"), stateSplit);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1376 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1377 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1378 try {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1379 graphBuilderConfig.getPlugins().getInvocationPlugins().checkNewNodes(BytecodeParser.this, plugin, newNodes);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1380 } catch (Throwable t) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1381 throw new AssertionError(error("Error in plugin"), t);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1382 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1383 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1384 assert nodeCount == graph.getNodeCount() : error("plugin that returns false must not create new nodes");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1385 assert beforeStackSize == frameState.stackSize() : error("plugin that returns false must not modify the stack");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1386 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1387 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1388 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1389 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1390
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1391 private boolean tryInvocationPlugin(ValueNode[] args, ResolvedJavaMethod targetMethod, Kind resultType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1392 InvocationPlugin plugin = graphBuilderConfig.getPlugins().getInvocationPlugins().lookupInvocation(targetMethod);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1393 if (plugin != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1394
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1395 if (intrinsicContext != null && intrinsicContext.isCallToOriginal(targetMethod)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1396 // Self recursive intrinsic means the original
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1397 // method should be called.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1398 assert !targetMethod.hasBytecodes() : "TODO: when does this happen?";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1399 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1400 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1401
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1402 InvocationPluginAssertions assertions = assertionsEnabled() ? new InvocationPluginAssertions(plugin, args, targetMethod, resultType) : null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1403 if (plugin.execute(this, targetMethod, invocationPluginReceiver.init(targetMethod, args), args)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1404 assert assertions.check(true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1405 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1406 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1407 assert assertions.check(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1408 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1409 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1410 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1411
21683
c74d3c9b9de7 Use a marker value in second slot of a two-slot value during parsing; improve assertion checking in FrameStateBuilder
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21660
diff changeset
1412 private boolean tryNodePluginForInvocation(ValueNode[] args, ResolvedJavaMethod targetMethod) {
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1413 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1414 if (plugin.handleInvoke(this, targetMethod, args)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1415 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1416 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1417 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1418 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1419 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1420
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1421 private boolean tryInline(ValueNode[] args, ResolvedJavaMethod targetMethod, JavaType returnType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1422 boolean canBeInlined = parsingIntrinsic() || targetMethod.canBeInlined();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1423 if (!canBeInlined) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1424 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1425 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1426 for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1427 InlineInfo inlineInfo = plugin.shouldInlineInvoke(this, targetMethod, args, returnType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1428 if (inlineInfo != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1429 if (inlineInfo.getMethodToInline() == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1430 /* Do not inline, and do not ask the remaining plugins. */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1431 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1432 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1433 return inline(targetMethod, inlineInfo.getMethodToInline(), inlineInfo.isIntrinsic(), args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1434 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1435 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1436 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1437 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1438 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1439
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1440 public void intrinsify(ResolvedJavaMethod targetMethod, ResolvedJavaMethod substitute, ValueNode[] args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1441 boolean res = inline(targetMethod, substitute, true, args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1442 assert res : "failed to inline " + substitute;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1443 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1444
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1445 private boolean inline(ResolvedJavaMethod targetMethod, ResolvedJavaMethod inlinedMethod, boolean isIntrinsic, ValueNode[] args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1446 if (TraceInlineDuringParsing.getValue() || TraceParserPlugins.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1447 if (targetMethod.equals(inlinedMethod)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1448 traceWithContext("inlining call to %s", inlinedMethod.format("%h.%n(%p)"));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1449 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1450 traceWithContext("inlining call to %s as intrinsic for %s", inlinedMethod.format("%h.%n(%p)"), targetMethod.format("%h.%n(%p)"));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1451 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1452 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1453 IntrinsicContext intrinsic = this.intrinsicContext;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1454 if (intrinsic != null && intrinsic.isCallToOriginal(targetMethod)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1455 if (intrinsic.isCompilationRoot()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1456 // A root compiled intrinsic needs to deoptimize
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1457 // if the slow path is taken. During frame state
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1458 // assignment, the deopt node will get its stateBefore
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1459 // from the start node of the intrinsic
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1460 append(new DeoptimizeNode(InvalidateRecompile, RuntimeConstraint));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1461 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1462 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1463 // Otherwise inline the original method. Any frame state created
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1464 // during the inlining will exclude frame(s) in the
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1465 // intrinsic method (see HIRFrameStateBuilder.create(int bci)).
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1466 if (intrinsic.getOriginalMethod().isNative()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1467 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1468 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1469 parseAndInlineCallee(intrinsic.getOriginalMethod(), args, null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1470 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1471 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1472 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1473 if (intrinsic == null && isIntrinsic) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1474 assert !inlinedMethod.equals(targetMethod);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1475 intrinsic = new IntrinsicContext(targetMethod, inlinedMethod, INLINE_DURING_PARSING);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1476 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1477 if (inlinedMethod.hasBytecodes()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1478 for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) {
21701
8b03b940c29d InlineInvokePlugin#notify{Before,After}Inline should be called with inlinedMethod
Andreas Woess <andreas.woess@oracle.com>
parents: 21683
diff changeset
1479 plugin.notifyBeforeInline(inlinedMethod);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1480 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1481 parseAndInlineCallee(inlinedMethod, args, intrinsic);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1482 for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) {
21701
8b03b940c29d InlineInvokePlugin#notify{Before,After}Inline should be called with inlinedMethod
Andreas Woess <andreas.woess@oracle.com>
parents: 21683
diff changeset
1483 plugin.notifyAfterInline(inlinedMethod);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1484 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1485 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1486 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1487 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1488 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1489 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1490 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1491
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1492 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1493 * Prints a line to {@link TTY} with a prefix indicating the current parse context. The prefix
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1494 * is of the form:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1495 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1496 * <pre>
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1497 * {SPACE * n} {name of method being parsed} "(" {file name} ":" {line number} ")"
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1498 * </pre>
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1499 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1500 * where {@code n} is the current inlining depth.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1501 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1502 * @param format a format string
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1503 * @param args arguments to the format string
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1504 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1505
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1506 protected void traceWithContext(String format, Object... args) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1507 StackTraceElement where = method.asStackTraceElement(bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1508 TTY.println(format("%s%s (%s:%d) %s", nSpaces(getDepth()), method.isConstructor() ? method.format("%h.%n") : method.getName(), where.getFileName(), where.getLineNumber(), format(format, args)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1509 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1510
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1511 protected BytecodeParserError asParserError(Throwable e) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1512 if (e instanceof BytecodeParserError) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1513 return (BytecodeParserError) e;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1514 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1515 BytecodeParser bp = this;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1516 BytecodeParserError res = new BytecodeParserError(e);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1517 while (bp != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1518 res.addContext("parsing " + bp.method.asStackTraceElement(bp.bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1519 bp = bp.parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1520 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1521 return res;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1522 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1523
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1524 private void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args, IntrinsicContext calleeIntrinsicContext) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1525 try (IntrinsicScope s = calleeIntrinsicContext != null && !parsingIntrinsic() ? new IntrinsicScope(this, targetMethod.getSignature().toParameterKinds(!targetMethod.isStatic()), args) : null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1526
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1527 BytecodeParser parser = graphBuilderInstance.createBytecodeParser(graph, this, targetMethod, INVOCATION_ENTRY_BCI, calleeIntrinsicContext);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1528 FrameStateBuilder startFrameState = new FrameStateBuilder(parser, targetMethod, graph);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1529 if (!targetMethod.isStatic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1530 args[0] = nullCheckedValue(args[0]);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1531 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1532 startFrameState.initializeFromArgumentsArray(args);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1533 parser.build(this.lastInstr, startFrameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1534
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1535 FixedWithNextNode calleeBeforeReturnNode = parser.getBeforeReturnNode();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1536 this.lastInstr = calleeBeforeReturnNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1537 Kind calleeReturnKind = targetMethod.getSignature().getReturnKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1538 if (calleeBeforeReturnNode != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1539 ValueNode calleeReturnValue = parser.getReturnValue();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1540 if (calleeReturnValue != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1541 frameState.push(calleeReturnKind.getStackKind(), calleeReturnValue);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1542 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1543 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1544
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1545 FixedWithNextNode calleeBeforeUnwindNode = parser.getBeforeUnwindNode();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1546 if (calleeBeforeUnwindNode != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1547 ValueNode calleeUnwindValue = parser.getUnwindValue();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1548 assert calleeUnwindValue != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1549 calleeBeforeUnwindNode.setNext(handleException(calleeUnwindValue, bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1550 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1551
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1552 // Record inlined method dependency in the graph
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1553 graph.recordInlinedMethod(targetMethod);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1554 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1555 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1556
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1557 protected MethodCallTargetNode createMethodCallTarget(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, JavaType returnType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1558 return new MethodCallTargetNode(invokeKind, targetMethod, args, returnType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1559 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1560
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1561 protected InvokeNode createInvoke(CallTargetNode callTarget, Kind resultType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1562 InvokeNode invoke = append(new InvokeNode(callTarget, bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1563 frameState.pushReturn(resultType, invoke);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1564 invoke.setStateAfter(createFrameState(stream.nextBCI(), invoke));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1565 return invoke;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1566 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1567
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1568 protected InvokeWithExceptionNode createInvokeWithException(CallTargetNode callTarget, Kind resultType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1569 if (currentBlock != null && stream.nextBCI() > currentBlock.endBci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1570 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1571 * Clear non-live locals early so that the exception handler entry gets the cleared
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1572 * state.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1573 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1574 frameState.clearNonLiveLocals(currentBlock, liveness, false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1575 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1576
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1577 DispatchBeginNode exceptionEdge = handleException(null, bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1578 InvokeWithExceptionNode invoke = append(new InvokeWithExceptionNode(callTarget, exceptionEdge, bci()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1579 frameState.pushReturn(resultType, invoke);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1580 invoke.setStateAfter(createFrameState(stream.nextBCI(), invoke));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1581 return invoke;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1582 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1583
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1584 protected void genReturn(ValueNode returnVal, Kind returnKind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1585 if (parsingIntrinsic() && returnVal != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1586 if (returnVal instanceof StateSplit) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1587 StateSplit stateSplit = (StateSplit) returnVal;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1588 FrameState stateAfter = stateSplit.stateAfter();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1589 if (stateSplit.hasSideEffect()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1590 assert stateSplit != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1591 if (stateAfter.bci == BytecodeFrame.AFTER_BCI) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1592 assert stateAfter.usages().count() == 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1593 assert stateAfter.usages().first() == stateSplit;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1594 stateAfter.replaceAtUsages(graph.add(new FrameState(BytecodeFrame.AFTER_BCI, returnVal)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1595 GraphUtil.killWithUnusedFloatingInputs(stateAfter);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1596 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1597 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1598 * This must be the return value from within a partial intrinsification.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1599 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1600 assert !BytecodeFrame.isPlaceholderBci(stateAfter.bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1601 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1602 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1603 assert stateAfter == null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1604 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1605 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1606 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1607 if (parent == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1608 frameState.setRethrowException(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1609 frameState.clearStack();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1610 beforeReturn(returnVal, returnKind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1611 append(new ReturnNode(returnVal));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1612 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1613 if (blockMap.getReturnCount() == 1 || !controlFlowSplit) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1614 // There is only a single return.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1615 beforeReturn(returnVal, returnKind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1616 this.returnValue = returnVal;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1617 this.beforeReturnNode = this.lastInstr;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1618 this.lastInstr = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1619 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1620 frameState.setRethrowException(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1621 frameState.clearStack();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1622 if (returnVal != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1623 frameState.push(returnKind, returnVal);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1624 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1625 assert blockMap.getReturnCount() > 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1626 appendGoto(blockMap.getReturnBlock());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1627 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1628 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1629 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1630
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1631 private void beforeReturn(ValueNode x, Kind kind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1632 if (graph.method() != null && graph.method().isJavaLangObjectInit()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1633 append(new RegisterFinalizerNode(frameState.loadLocal(0, Kind.Object)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1634 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1635 if (graphBuilderConfig.insertNonSafepointDebugInfo() && !parsingIntrinsic()) {
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
1636 genInfoPointNode(InfopointReason.METHOD_END, x);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1637 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1638
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1639 synchronizedEpilogue(BytecodeFrame.AFTER_BCI, x, kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1640 if (frameState.lockDepth() != 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1641 throw bailout("unbalanced monitors");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1642 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1643 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1644
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1645 protected void genMonitorEnter(ValueNode x, int bci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1646 MonitorIdNode monitorId = graph.add(new MonitorIdNode(frameState.lockDepth()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1647 MonitorEnterNode monitorEnter = append(new MonitorEnterNode(x, monitorId));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1648 frameState.pushLock(x, monitorId);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1649 monitorEnter.setStateAfter(createFrameState(bci, monitorEnter));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1650 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1651
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1652 protected void genMonitorExit(ValueNode x, ValueNode escapedReturnValue, int bci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1653 MonitorIdNode monitorId = frameState.peekMonitorId();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1654 ValueNode lockedObject = frameState.popLock();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1655 if (GraphUtil.originalValue(lockedObject) != GraphUtil.originalValue(x)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1656 throw bailout(String.format("unbalanced monitors: mismatch at monitorexit, %s != %s", GraphUtil.originalValue(x), GraphUtil.originalValue(lockedObject)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1657 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1658 MonitorExitNode monitorExit = append(new MonitorExitNode(x, monitorId, escapedReturnValue));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1659 monitorExit.setStateAfter(createFrameState(bci, monitorExit));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1660 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1661
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1662 protected void genJsr(int dest) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1663 BciBlock successor = currentBlock.getJsrSuccessor();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1664 assert successor.startBci == dest : successor.startBci + " != " + dest + " @" + bci();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1665 JsrScope scope = currentBlock.getJsrScope();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1666 int nextBci = getStream().nextBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1667 if (!successor.getJsrScope().pop().equals(scope)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1668 throw new JsrNotSupportedBailout("unstructured control flow (internal limitation)");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1669 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1670 if (successor.getJsrScope().nextReturnAddress() != nextBci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1671 throw new JsrNotSupportedBailout("unstructured control flow (internal limitation)");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1672 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1673 ConstantNode nextBciNode = getJsrConstant(nextBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1674 frameState.push(Kind.Object, nextBciNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1675 appendGoto(successor);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1676 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1677
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1678 protected void genRet(int localIndex) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1679 BciBlock successor = currentBlock.getRetSuccessor();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1680 ValueNode local = frameState.loadLocal(localIndex, Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1681 JsrScope scope = currentBlock.getJsrScope();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1682 int retAddress = scope.nextReturnAddress();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1683 ConstantNode returnBciNode = getJsrConstant(retAddress);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1684 LogicNode guard = IntegerEqualsNode.create(local, returnBciNode, constantReflection);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1685 guard = graph.unique(guard);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1686 append(new FixedGuardNode(guard, JavaSubroutineMismatch, InvalidateReprofile));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1687 if (!successor.getJsrScope().equals(scope.pop())) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1688 throw new JsrNotSupportedBailout("unstructured control flow (ret leaves more than one scope)");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1689 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1690 appendGoto(successor);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1691 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1692
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1693 private ConstantNode getJsrConstant(long bci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1694 JavaConstant nextBciConstant = new RawConstant(bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1695 Stamp nextBciStamp = StampFactory.forConstant(nextBciConstant);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1696 ConstantNode nextBciNode = new ConstantNode(nextBciConstant, nextBciStamp);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1697 return graph.unique(nextBciNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1698 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1699
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1700 protected void genIntegerSwitch(ValueNode value, ArrayList<BciBlock> actualSuccessors, int[] keys, double[] keyProbabilities, int[] keySuccessors) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1701 if (value.isConstant()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1702 JavaConstant constant = (JavaConstant) value.asConstant();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1703 int constantValue = constant.asInt();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1704 for (int i = 0; i < keys.length; ++i) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1705 if (keys[i] == constantValue) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1706 appendGoto(actualSuccessors.get(keySuccessors[i]));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1707 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1708 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1709 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1710 appendGoto(actualSuccessors.get(keySuccessors[keys.length]));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1711 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1712 this.controlFlowSplit = true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1713 double[] successorProbabilities = successorProbabilites(actualSuccessors.size(), keySuccessors, keyProbabilities);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1714 IntegerSwitchNode switchNode = append(new IntegerSwitchNode(value, actualSuccessors.size(), keys, keyProbabilities, keySuccessors));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1715 for (int i = 0; i < actualSuccessors.size(); i++) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1716 switchNode.setBlockSuccessor(i, createBlockTarget(successorProbabilities[i], actualSuccessors.get(i), frameState));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1717 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1718 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1719 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1720
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1721 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1722 * Helper function that sums up the probabilities of all keys that lead to a specific successor.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1723 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1724 * @return an array of size successorCount with the accumulated probability for each successor.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1725 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1726 private static double[] successorProbabilites(int successorCount, int[] keySuccessors, double[] keyProbabilities) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1727 double[] probability = new double[successorCount];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1728 for (int i = 0; i < keySuccessors.length; i++) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1729 probability[keySuccessors[i]] += keyProbabilities[i];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1730 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1731 return probability;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1732 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1733
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1734 protected ConstantNode appendConstant(JavaConstant constant) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1735 assert constant != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1736 return ConstantNode.forConstant(constant, metaAccess, graph);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1737 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1738
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1739 @Override
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1740 public <T extends ValueNode> T append(T v) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1741 if (v.graph() != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1742 return v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1743 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1744 T added = graph.addOrUnique(v);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1745 if (added == v) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1746 updateLastInstruction(v);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1747 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1748 return added;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1749 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1750
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1751 public <T extends ValueNode> T recursiveAppend(T v) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1752 if (v.graph() != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1753 return v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1754 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1755 T added = graph.addOrUniqueWithInputs(v);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1756 if (added == v) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1757 updateLastInstruction(v);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1758 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1759 return added;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1760 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1761
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1762 private <T extends ValueNode> void updateLastInstruction(T v) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1763 if (v instanceof FixedNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1764 FixedNode fixedNode = (FixedNode) v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1765 lastInstr.setNext(fixedNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1766 if (fixedNode instanceof FixedWithNextNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1767 FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) fixedNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1768 assert fixedWithNextNode.next() == null : "cannot append instruction to instruction which isn't end";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1769 lastInstr = fixedWithNextNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1770 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1771 lastInstr = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1772 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1773 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1774 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1775
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1776 private Target checkLoopExit(FixedNode target, BciBlock targetBlock, FrameStateBuilder state) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1777 if (currentBlock != null && !explodeLoops) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1778 long exits = currentBlock.loops & ~targetBlock.loops;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1779 if (exits != 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1780 LoopExitNode firstLoopExit = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1781 LoopExitNode lastLoopExit = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1782
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1783 int pos = 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1784 ArrayList<BciBlock> exitLoops = new ArrayList<>(Long.bitCount(exits));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1785 do {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1786 long lMask = 1L << pos;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1787 if ((exits & lMask) != 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1788 exitLoops.add(blockMap.getLoopHeader(pos));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1789 exits &= ~lMask;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1790 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1791 pos++;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1792 } while (exits != 0);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1793
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1794 Collections.sort(exitLoops, new Comparator<BciBlock>() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1795
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1796 @Override
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1797 public int compare(BciBlock o1, BciBlock o2) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1798 return Long.bitCount(o2.loops) - Long.bitCount(o1.loops);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1799 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1800 });
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1801
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1802 int bci = targetBlock.startBci;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1803 if (targetBlock instanceof ExceptionDispatchBlock) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1804 bci = ((ExceptionDispatchBlock) targetBlock).deoptBci;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1805 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1806 FrameStateBuilder newState = state.copy();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1807 for (BciBlock loop : exitLoops) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1808 LoopBeginNode loopBegin = (LoopBeginNode) getFirstInstruction(loop, this.getCurrentDimension());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1809 LoopExitNode loopExit = graph.add(new LoopExitNode(loopBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1810 if (lastLoopExit != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1811 lastLoopExit.setNext(loopExit);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1812 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1813 if (firstLoopExit == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1814 firstLoopExit = loopExit;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1815 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1816 lastLoopExit = loopExit;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1817 Debug.log("Target %s Exits %s, scanning framestates...", targetBlock, loop);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1818 newState.insertLoopProxies(loopExit, getEntryState(loop, this.getCurrentDimension()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1819 loopExit.setStateAfter(newState.create(bci, loopExit));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1820 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1821
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1822 lastLoopExit.setNext(target);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1823 return new Target(firstLoopExit, newState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1824 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1825 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1826 return new Target(target, state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1827 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1828
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1829 private FrameStateBuilder getEntryState(BciBlock block, int dimension) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1830 int id = block.id;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1831 if (dimension == 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1832 return entryStateArray[id];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1833 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1834 return getEntryStateMultiDimension(dimension, id);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1835 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1836 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1837
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1838 private FrameStateBuilder getEntryStateMultiDimension(int dimension, int id) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1839 if (entryStateMatrix != null && dimension - 1 < entryStateMatrix.length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1840 FrameStateBuilder[] entryStateArrayEntry = entryStateMatrix[dimension - 1];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1841 if (entryStateArrayEntry == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1842 return null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1843 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1844 return entryStateArrayEntry[id];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1845 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1846 return null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1847 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1848 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1849
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1850 private void setEntryState(BciBlock block, int dimension, FrameStateBuilder entryState) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1851 int id = block.id;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1852 if (dimension == 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1853 this.entryStateArray[id] = entryState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1854 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1855 setEntryStateMultiDimension(dimension, entryState, id);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1856 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1857 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1858
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1859 private void setEntryStateMultiDimension(int dimension, FrameStateBuilder entryState, int id) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1860 if (entryStateMatrix == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1861 entryStateMatrix = new FrameStateBuilder[4][];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1862 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1863 if (dimension - 1 < entryStateMatrix.length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1864 // We are within bounds.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1865 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1866 // We are out of bounds.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1867 entryStateMatrix = Arrays.copyOf(entryStateMatrix, Math.max(entryStateMatrix.length * 2, dimension));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1868 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1869 if (entryStateMatrix[dimension - 1] == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1870 entryStateMatrix[dimension - 1] = new FrameStateBuilder[blockMap.getBlockCount()];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1871 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1872 entryStateMatrix[dimension - 1][id] = entryState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1873 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1874
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1875 private void setFirstInstruction(BciBlock block, int dimension, FixedWithNextNode firstInstruction) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1876 int id = block.id;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1877 if (dimension == 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1878 this.firstInstructionArray[id] = firstInstruction;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1879 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1880 setFirstInstructionMultiDimension(dimension, firstInstruction, id);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1881 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1882 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1883
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1884 private void setFirstInstructionMultiDimension(int dimension, FixedWithNextNode firstInstruction, int id) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1885 if (firstInstructionMatrix == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1886 firstInstructionMatrix = new FixedWithNextNode[4][];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1887 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1888 if (dimension - 1 < firstInstructionMatrix.length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1889 // We are within bounds.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1890 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1891 // We are out of bounds.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1892 firstInstructionMatrix = Arrays.copyOf(firstInstructionMatrix, Math.max(firstInstructionMatrix.length * 2, dimension));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1893 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1894 if (firstInstructionMatrix[dimension - 1] == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1895 firstInstructionMatrix[dimension - 1] = new FixedWithNextNode[blockMap.getBlockCount()];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1896 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1897 firstInstructionMatrix[dimension - 1][id] = firstInstruction;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1898 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1899
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1900 private FixedWithNextNode getFirstInstruction(BciBlock block, int dimension) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1901 int id = block.id;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1902 if (dimension == 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1903 return firstInstructionArray[id];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1904 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1905 return getFirstInstructionMultiDimension(dimension, id);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1906 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1907 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1908
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1909 private FixedWithNextNode getFirstInstructionMultiDimension(int dimension, int id) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1910 if (firstInstructionMatrix != null && dimension - 1 < firstInstructionMatrix.length) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1911 FixedWithNextNode[] firstInstructionArrayEntry = firstInstructionMatrix[dimension - 1];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1912 if (firstInstructionArrayEntry == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1913 return null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1914 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1915 return firstInstructionArrayEntry[id];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1916 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1917 return null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1918 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1919 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1920
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1921 private FixedNode createTarget(double probability, BciBlock block, FrameStateBuilder stateAfter) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1922 assert probability >= 0 && probability <= 1.01 : probability;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1923 if (isNeverExecutedCode(probability)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1924 return graph.add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1925 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1926 assert block != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1927 return createTarget(block, stateAfter);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1928 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1929 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1930
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1931 private FixedNode createTarget(BciBlock block, FrameStateBuilder state) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1932 return createTarget(block, state, false, false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1933 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1934
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1935 private FixedNode createTarget(BciBlock block, FrameStateBuilder state, boolean canReuseInstruction, boolean canReuseState) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1936 assert block != null && state != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1937 assert !block.isExceptionEntry || state.stackSize() == 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1938
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1939 int operatingDimension = findOperatingDimension(block, state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1940
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1941 if (getFirstInstruction(block, operatingDimension) == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1942 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1943 * This is the first time we see this block as a branch target. Create and return a
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1944 * placeholder that later can be replaced with a MergeNode when we see this block again.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1945 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1946 FixedNode targetNode;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1947 if (canReuseInstruction && (block.getPredecessorCount() == 1 || !controlFlowSplit) && !block.isLoopHeader && (currentBlock.loops & ~block.loops) == 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1948 setFirstInstruction(block, operatingDimension, lastInstr);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1949 lastInstr = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1950 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1951 setFirstInstruction(block, operatingDimension, graph.add(new BeginNode()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1952 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1953 targetNode = getFirstInstruction(block, operatingDimension);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1954 Target target = checkLoopExit(targetNode, block, state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1955 FixedNode result = target.fixed;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1956 FrameStateBuilder currentEntryState = target.state == state ? (canReuseState ? state : state.copy()) : target.state;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1957 setEntryState(block, operatingDimension, currentEntryState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1958 currentEntryState.clearNonLiveLocals(block, liveness, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1959
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1960 Debug.log("createTarget %s: first visit, result: %s", block, targetNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1961 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1962 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1963
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1964 // We already saw this block before, so we have to merge states.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1965 if (!getEntryState(block, operatingDimension).isCompatibleWith(state)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1966 throw bailout("stacks do not match; bytecodes would not verify");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1967 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1968
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1969 if (getFirstInstruction(block, operatingDimension) instanceof LoopBeginNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1970 assert this.explodeLoops || (block.isLoopHeader && currentBlock.getId() >= block.getId()) : "must be backward branch";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1971 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1972 * Backward loop edge. We need to create a special LoopEndNode and merge with the loop
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1973 * begin node created before.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1974 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1975 LoopBeginNode loopBegin = (LoopBeginNode) getFirstInstruction(block, operatingDimension);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1976 LoopEndNode loopEnd = graph.add(new LoopEndNode(loopBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1977 if (parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1978 loopEnd.disableSafepoint();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1979 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1980 Target target = checkLoopExit(loopEnd, block, state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1981 FixedNode result = target.fixed;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1982 getEntryState(block, operatingDimension).merge(loopBegin, target.state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1983
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1984 Debug.log("createTarget %s: merging backward branch to loop header %s, result: %s", block, loopBegin, result);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1985 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1986 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1987 assert currentBlock == null || currentBlock.getId() < block.getId() || this.mergeExplosions : "must not be backward branch";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1988 assert getFirstInstruction(block, operatingDimension).next() == null || this.mergeExplosions : "bytecodes already parsed for block";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1989
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1990 if (getFirstInstruction(block, operatingDimension) instanceof AbstractBeginNode && !(getFirstInstruction(block, operatingDimension) instanceof AbstractMergeNode)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1991 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1992 * This is the second time we see this block. Create the actual MergeNode and the End
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1993 * Node for the already existing edge.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1994 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1995 AbstractBeginNode beginNode = (AbstractBeginNode) getFirstInstruction(block, operatingDimension);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1996
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1997 // The EndNode for the already existing edge.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1998 EndNode end = graph.add(new EndNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1999 // The MergeNode that replaces the placeholder.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2000 AbstractMergeNode mergeNode = graph.add(new MergeNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2001 FixedNode next = beginNode.next();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2002
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2003 if (beginNode.predecessor() instanceof ControlSplitNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2004 beginNode.setNext(end);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2005 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2006 beginNode.replaceAtPredecessor(end);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2007 beginNode.safeDelete();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2008 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2009
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2010 mergeNode.addForwardEnd(end);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2011 mergeNode.setNext(next);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2012
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2013 setFirstInstruction(block, operatingDimension, mergeNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2014 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2015
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2016 AbstractMergeNode mergeNode = (AbstractMergeNode) getFirstInstruction(block, operatingDimension);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2017
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2018 // The EndNode for the newly merged edge.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2019 EndNode newEnd = graph.add(new EndNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2020 Target target = checkLoopExit(newEnd, block, state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2021 FixedNode result = target.fixed;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2022 getEntryState(block, operatingDimension).merge(mergeNode, target.state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2023 mergeNode.addForwardEnd(newEnd);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2024
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2025 Debug.log("createTarget %s: merging state, result: %s", block, result);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2026 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2027 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2028
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2029 private int findOperatingDimension(BciBlock block, FrameStateBuilder state) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2030 if (this.explodeLoops && this.explodeLoopsContext != null && !this.explodeLoopsContext.isEmpty()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2031 return findOperatingDimensionWithLoopExplosion(block, state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2032 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2033 return this.getCurrentDimension();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2034 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2035
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2036 private int findOperatingDimensionWithLoopExplosion(BciBlock block, FrameStateBuilder state) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2037 for (ExplodedLoopContext context : explodeLoopsContext) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2038 if (context.header == block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2039
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2040 if (this.mergeExplosions) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2041 state.clearNonLiveLocals(block, liveness, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2042 Integer cachedDimension = mergeExplosionsMap.get(state);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2043 if (cachedDimension != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2044 return cachedDimension;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2045 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2046 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2047
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2048 // We have a hit on our current explosion context loop begin.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2049 if (context.targetPeelIteration == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2050 context.targetPeelIteration = new int[1];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2051 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2052 context.targetPeelIteration = Arrays.copyOf(context.targetPeelIteration, context.targetPeelIteration.length + 1);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2053 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2054
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2055 // This is the first hit => allocate a new dimension and at the same
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2056 // time mark the context loop begin as hit during the current
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2057 // iteration.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2058 if (this.mergeExplosions) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2059 this.addToMergeCache(state, nextPeelIteration);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2060 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2061 context.targetPeelIteration[context.targetPeelIteration.length - 1] = nextPeelIteration++;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2062 if (nextPeelIteration > MaximumLoopExplosionCount.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2063 String message = "too many loop explosion iterations - does the explosion not terminate for method " + method + "?";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2064 if (FailedLoopExplosionIsFatal.getValue()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2065 throw new RuntimeException(message);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2066 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2067 throw bailout(message);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2068 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2069 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2070
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2071 // Operate on the target dimension.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2072 return context.targetPeelIteration[context.targetPeelIteration.length - 1];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2073 } else if (block.getId() > context.header.getId() && block.getId() <= context.header.loopEnd) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2074 // We hit the range of this context.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2075 return context.peelIteration;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2076 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2077 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2078
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2079 // No dimension found.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2080 return 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2081 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2082
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2083 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2084 * Returns a block begin node with the specified state. If the specified probability is 0, the
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2085 * block deoptimizes immediately.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2086 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2087 private AbstractBeginNode createBlockTarget(double probability, BciBlock block, FrameStateBuilder stateAfter) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2088 FixedNode target = createTarget(probability, block, stateAfter);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2089 AbstractBeginNode begin = BeginNode.begin(target);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2090
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2091 assert !(target instanceof DeoptimizeNode && begin instanceof BeginStateSplitNode && ((BeginStateSplitNode) begin).stateAfter() != null) : "We are not allowed to set the stateAfter of the begin node, because we have to deoptimize "
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2092 + "to a bci _before_ the actual if, so that the interpreter can update the profiling information.";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2093 return begin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2094 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2095
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2096 private ValueNode synchronizedObject(FrameStateBuilder state, ResolvedJavaMethod target) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2097 if (target.isStatic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2098 return appendConstant(target.getDeclaringClass().getJavaClass());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2099 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2100 return state.loadLocal(0, Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2101 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2102 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2103
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2104 protected void processBlock(BytecodeParser parser, BciBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2105 // Ignore blocks that have no predecessors by the time their bytecodes are parsed
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2106 int currentDimension = this.getCurrentDimension();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2107 FixedWithNextNode firstInstruction = getFirstInstruction(block, currentDimension);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2108 if (firstInstruction == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2109 Debug.log("Ignoring block %s", block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2110 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2111 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2112 try (Indent indent = Debug.logAndIndent("Parsing block %s firstInstruction: %s loopHeader: %b", block, firstInstruction, block.isLoopHeader)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2113
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2114 lastInstr = firstInstruction;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2115 frameState = getEntryState(block, currentDimension);
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2116 frameState.cleanDeletedNodes();
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2117 parser.setCurrentFrameState(frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2118 currentBlock = block;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2119
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2120 if (firstInstruction instanceof AbstractMergeNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2121 setMergeStateAfter(block, firstInstruction);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2122 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2123
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2124 if (block == blockMap.getReturnBlock()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2125 handleReturnBlock();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2126 } else if (block == blockMap.getUnwindBlock()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2127 handleUnwindBlock();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2128 } else if (block instanceof ExceptionDispatchBlock) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2129 createExceptionDispatch((ExceptionDispatchBlock) block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2130 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2131 frameState.setRethrowException(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2132 iterateBytecodesForBlock(block);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2133 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2134 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2135 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2136
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2137 private void handleUnwindBlock() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2138 if (parent == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2139 frameState.setRethrowException(false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2140 createUnwind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2141 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2142 ValueNode exception = frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2143 this.unwindValue = exception;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2144 this.beforeUnwindNode = this.lastInstr;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2145 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2146 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2147
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2148 private void handleReturnBlock() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2149 Kind returnKind = method.getSignature().getReturnKind().getStackKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2150 ValueNode x = returnKind == Kind.Void ? null : frameState.pop(returnKind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2151 assert frameState.stackSize() == 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2152 beforeReturn(x, returnKind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2153 this.returnValue = x;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2154 this.beforeReturnNode = this.lastInstr;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2155 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2156
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2157 private void setMergeStateAfter(BciBlock block, FixedWithNextNode firstInstruction) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2158 AbstractMergeNode abstractMergeNode = (AbstractMergeNode) firstInstruction;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2159 if (abstractMergeNode.stateAfter() == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2160 int bci = block.startBci;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2161 if (block instanceof ExceptionDispatchBlock) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2162 bci = ((ExceptionDispatchBlock) block).deoptBci;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2163 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2164 abstractMergeNode.setStateAfter(createFrameState(bci, abstractMergeNode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2165 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2166 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2167
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2168 private void createUnwind() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2169 assert frameState.stackSize() == 1 : frameState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2170 ValueNode exception = frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2171 synchronizedEpilogue(BytecodeFrame.AFTER_EXCEPTION_BCI, null, null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2172 append(new UnwindNode(exception));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2173 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2174
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2175 private void synchronizedEpilogue(int bci, ValueNode currentReturnValue, Kind currentReturnValueKind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2176 if (method.isSynchronized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2177 if (currentReturnValue != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2178 frameState.push(currentReturnValueKind, currentReturnValue);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2179 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2180 genMonitorExit(methodSynchronizedObject, currentReturnValue, bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2181 assert !frameState.rethrowException();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2182 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2183 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2184
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2185 private void createExceptionDispatch(ExceptionDispatchBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2186 assert frameState.stackSize() == 1 : frameState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2187 if (block.handler.isCatchAll()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2188 assert block.getSuccessorCount() == 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2189 appendGoto(block.getSuccessor(0));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2190 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2191 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2192
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2193 JavaType catchType = block.handler.getCatchType();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2194 if (graphBuilderConfig.eagerResolving()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2195 catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2196 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2197 boolean initialized = (catchType instanceof ResolvedJavaType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2198 if (initialized && graphBuilderConfig.getSkippedExceptionTypes() != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2199 ResolvedJavaType resolvedCatchType = (ResolvedJavaType) catchType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2200 for (ResolvedJavaType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2201 if (skippedType.isAssignableFrom(resolvedCatchType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2202 BciBlock nextBlock = block.getSuccessorCount() == 1 ? blockMap.getUnwindBlock() : block.getSuccessor(1);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2203 ValueNode exception = frameState.stack[0];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2204 FixedNode trueSuccessor = graph.add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2205 FixedNode nextDispatch = createTarget(nextBlock, frameState);
21765
a7a1b9b65bce Small improvement and clean up of InstanceOfNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21751
diff changeset
2206 append(new IfNode(graph.unique(InstanceOfNode.create((ResolvedJavaType) catchType, exception, null)), trueSuccessor, nextDispatch, 0));
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2207 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2208 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2209 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2210 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2211
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2212 if (initialized) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2213 BciBlock nextBlock = block.getSuccessorCount() == 1 ? blockMap.getUnwindBlock() : block.getSuccessor(1);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2214 ValueNode exception = frameState.stack[0];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2215 CheckCastNode checkCast = graph.add(new CheckCastNode((ResolvedJavaType) catchType, exception, null, false));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2216 frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2217 frameState.push(Kind.Object, checkCast);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2218 FixedNode catchSuccessor = createTarget(block.getSuccessor(0), frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2219 frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2220 frameState.push(Kind.Object, exception);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2221 FixedNode nextDispatch = createTarget(nextBlock, frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2222 checkCast.setNext(catchSuccessor);
21766
bb72c486714a Lower TypeCheck node in first lowering.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21765
diff changeset
2223 append(new IfNode(graph.unique(InstanceOfNode.create((ResolvedJavaType) catchType, exception, null)), checkCast, nextDispatch, 0.5));
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2224 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2225 handleUnresolvedExceptionType(catchType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2226 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2227 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2228
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2229 private void appendGoto(BciBlock successor) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2230 FixedNode targetInstr = createTarget(successor, frameState, true, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2231 if (lastInstr != null && lastInstr != targetInstr) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2232 lastInstr.setNext(targetInstr);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2233 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2234 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2235
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2236 protected void iterateBytecodesForBlock(BciBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2237 if (block.isLoopHeader && !explodeLoops) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2238 // Create the loop header block, which later will merge the backward branches of
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2239 // the loop.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2240 controlFlowSplit = true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2241 LoopBeginNode loopBegin = appendLoopBegin(this.lastInstr);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2242 lastInstr = loopBegin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2243
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2244 // Create phi functions for all local variables and operand stack slots.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2245 frameState.insertLoopPhis(liveness, block.loopId, loopBegin, forceLoopPhis());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2246 loopBegin.setStateAfter(createFrameState(block.startBci, loopBegin));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2247
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2248 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2249 * We have seen all forward branches. All subsequent backward branches will merge to the
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2250 * loop header. This ensures that the loop header has exactly one non-loop predecessor.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2251 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2252 setFirstInstruction(block, this.getCurrentDimension(), loopBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2253 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2254 * We need to preserve the frame state builder of the loop header so that we can merge
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2255 * values for phi functions, so make a copy of it.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2256 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2257 setEntryState(block, this.getCurrentDimension(), frameState.copy());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2258
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2259 Debug.log(" created loop header %s", loopBegin);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2260 } else if (block.isLoopHeader && explodeLoops && this.mergeExplosions) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2261 frameState = frameState.copy();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2262 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2263 assert lastInstr.next() == null : "instructions already appended at block " + block;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2264 Debug.log(" frameState: %s", frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2265
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2266 lastInstr = finishInstruction(lastInstr, frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2267
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2268 int endBCI = stream.endBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2269
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2270 stream.setBCI(block.startBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2271 int bci = block.startBci;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2272 BytecodesParsed.add(block.endBci - bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2273
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2274 /* Reset line number for new block */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2275 if (graphBuilderConfig.insertSimpleDebugInfo()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2276 previousLineNumber = -1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2277 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2278
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2279 while (bci < endBCI) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2280 if (graphBuilderConfig.insertNonSafepointDebugInfo() && !parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2281 currentLineNumber = lnt != null ? lnt.getLineNumber(bci) : (graphBuilderConfig.insertFullDebugInfo() ? -1 : bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2282 if (currentLineNumber != previousLineNumber) {
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2283 genInfoPointNode(InfopointReason.LINE_NUMBER, null);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2284 previousLineNumber = currentLineNumber;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2285 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2286 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2287
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2288 // read the opcode
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2289 int opcode = stream.currentBC();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2290 assert traceState();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2291 assert traceInstruction(bci, opcode, bci == block.startBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2292 if (parent == null && bci == entryBCI) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2293 if (block.getJsrScope() != JsrScope.EMPTY_SCOPE) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2294 throw new BailoutException("OSR into a JSR scope is not supported");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2295 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2296 EntryMarkerNode x = append(new EntryMarkerNode());
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2297 frameState.insertProxies(value -> ProxyNode.forValue(value, x, graph));
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2298 x.setStateAfter(createFrameState(bci, x));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2299 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2300
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2301 try {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2302 processBytecode(bci, opcode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2303 } catch (Throwable e) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2304 throw asParserError(e);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2305 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2306
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2307 if (lastInstr == null || lastInstr.next() != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2308 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2309 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2310
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2311 stream.next();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2312 bci = stream.currentBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2313
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2314 assert block == currentBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2315 assert checkLastInstruction();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2316 lastInstr = finishInstruction(lastInstr, frameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2317 if (bci < endBCI) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2318 if (bci > block.endBci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2319 assert !block.getSuccessor(0).isExceptionEntry;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2320 assert block.numNormalSuccessors() == 1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2321 // we fell through to the next block, add a goto and break
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2322 appendGoto(block.getSuccessor(0));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2323 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2324 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2325 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2326 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2327 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2328
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2329 /* Also a hook for subclasses. */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2330 protected boolean forceLoopPhis() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2331 return graph.isOSR();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2332 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2333
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2334 protected boolean checkLastInstruction() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2335 if (lastInstr instanceof BeginNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2336 // ignore
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2337 } else if (lastInstr instanceof StateSplit) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2338 StateSplit stateSplit = (StateSplit) lastInstr;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2339 if (stateSplit.hasSideEffect()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2340 assert stateSplit.stateAfter() != null : "side effect " + lastInstr + " requires a non-null stateAfter";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2341 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2342 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2343 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2344 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2345
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2346 private LoopBeginNode appendLoopBegin(FixedWithNextNode fixedWithNext) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2347 EndNode preLoopEnd = graph.add(new EndNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2348 LoopBeginNode loopBegin = graph.add(new LoopBeginNode());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2349 fixedWithNext.setNext(preLoopEnd);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2350 // Add the single non-loop predecessor of the loop header.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2351 loopBegin.addForwardEnd(preLoopEnd);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2352 return loopBegin;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2353 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2354
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2355 /**
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2356 * Hook for subclasses to modify the last instruction or add other instructions.
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2357 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2358 * @param instr The last instruction (= fixed node) which was added.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2359 * @param state The current frame state.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2360 * @return Returns the (new) last instruction.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2361 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2362 protected FixedWithNextNode finishInstruction(FixedWithNextNode instr, FrameStateBuilder state) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2363 return instr;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2364 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2365
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2366 private void genInfoPointNode(InfopointReason reason, ValueNode escapedReturnValue) {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2367 if (!parsingIntrinsic()) {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2368 if (graphBuilderConfig.insertFullDebugInfo()) {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2369 append(new FullInfopointNode(reason, createFrameState(bci(), null), escapedReturnValue));
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2370 } else {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2371 BytecodePosition position = createBytecodePosition();
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2372 // Update the previous infopoint position if no new fixed nodes were inserted
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2373 if (lastInstr instanceof SimpleInfopointNode) {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2374 SimpleInfopointNode lastInfopoint = (SimpleInfopointNode) lastInstr;
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2375 if (lastInfopoint.getReason() == reason) {
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2376 lastInfopoint.setPosition(position);
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2377 }
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2378 }
21611
d246f7b59166 Make BytecodeParser more extensible
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21609
diff changeset
2379 append(new SimpleInfopointNode(reason, position));
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2380 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2381 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2382 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2383
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2384 private boolean traceState() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2385 if (Debug.isEnabled() && Options.TraceBytecodeParserLevel.getValue() >= TRACELEVEL_STATE && Debug.isLogEnabled()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2386 frameState.traceState();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2387 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2388 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2389 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2390
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2391 protected void genIf(ValueNode x, Condition cond, ValueNode y) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2392 assert x.getKind().getStackKind() == y.getKind().getStackKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2393 assert currentBlock.getSuccessorCount() == 2;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2394 BciBlock trueBlock = currentBlock.getSuccessor(0);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2395 BciBlock falseBlock = currentBlock.getSuccessor(1);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2396 if (trueBlock == falseBlock) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2397 // The target block is the same independent of the condition.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2398 appendGoto(trueBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2399 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2400 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2401
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2402 ValueNode a = x;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2403 ValueNode b = y;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2404
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2405 // Check whether the condition needs to mirror the operands.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2406 if (cond.canonicalMirror()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2407 a = y;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2408 b = x;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2409 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2410
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2411 // Create the logic node for the condition.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2412 LogicNode condition = createLogicNode(cond, a, b);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2413
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2414 // Check whether the condition needs to negate the result.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2415 boolean negate = cond.canonicalNegate();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2416
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2417 // Remove a logic negation node and fold it into the negate boolean.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2418 if (condition instanceof LogicNegationNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2419 LogicNegationNode logicNegationNode = (LogicNegationNode) condition;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2420 negate = !negate;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2421 condition = logicNegationNode.getValue();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2422 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2423
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2424 if (condition instanceof LogicConstantNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2425 genConstantTargetIf(trueBlock, falseBlock, negate, condition);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2426 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2427 if (condition.graph() == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2428 condition = graph.unique(condition);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2429 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2430
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2431 // Need to get probability based on current bci.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2432 double probability = branchProbability();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2433
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2434 if (negate) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2435 BciBlock tmpBlock = trueBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2436 trueBlock = falseBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2437 falseBlock = tmpBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2438 probability = 1 - probability;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2439 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2440
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2441 if (isNeverExecutedCode(probability)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2442 append(new FixedGuardNode(condition, UnreachedCode, InvalidateReprofile, true));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2443 appendGoto(falseBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2444 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2445 } else if (isNeverExecutedCode(1 - probability)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2446 append(new FixedGuardNode(condition, UnreachedCode, InvalidateReprofile, false));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2447 appendGoto(trueBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2448 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2449 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2450
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2451 int oldBci = stream.currentBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2452 int trueBlockInt = checkPositiveIntConstantPushed(trueBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2453 if (trueBlockInt != -1) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2454 int falseBlockInt = checkPositiveIntConstantPushed(falseBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2455 if (falseBlockInt != -1) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2456 if (tryGenConditionalForIf(trueBlock, falseBlock, condition, oldBci, trueBlockInt, falseBlockInt)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2457 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2458 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2459 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2460 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2461
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2462 this.controlFlowSplit = true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2463 FixedNode trueSuccessor = createTarget(trueBlock, frameState, false, false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2464 FixedNode falseSuccessor = createTarget(falseBlock, frameState, false, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2465 ValueNode ifNode = genIfNode(condition, trueSuccessor, falseSuccessor, probability);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2466 append(ifNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2467 if (parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2468 if (x instanceof BranchProbabilityNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2469 ((BranchProbabilityNode) x).simplify(null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2470 } else if (y instanceof BranchProbabilityNode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2471 ((BranchProbabilityNode) y).simplify(null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2472 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2473 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2474 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2475 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2476
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2477 private boolean tryGenConditionalForIf(BciBlock trueBlock, BciBlock falseBlock, LogicNode condition, int oldBci, int trueBlockInt, int falseBlockInt) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2478 if (gotoOrFallThroughAfterConstant(trueBlock) && gotoOrFallThroughAfterConstant(falseBlock) && trueBlock.getSuccessor(0) == falseBlock.getSuccessor(0)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2479 genConditionalForIf(trueBlock, condition, oldBci, trueBlockInt, falseBlockInt, false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2480 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2481 } else if (this.parent != null && returnAfterConstant(trueBlock) && returnAfterConstant(falseBlock)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2482 genConditionalForIf(trueBlock, condition, oldBci, trueBlockInt, falseBlockInt, true);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2483 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2484 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2485 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2486 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2487
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2488 private void genConditionalForIf(BciBlock trueBlock, LogicNode condition, int oldBci, int trueBlockInt, int falseBlockInt, boolean genReturn) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2489 ConstantNode trueValue = graph.unique(ConstantNode.forInt(trueBlockInt));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2490 ConstantNode falseValue = graph.unique(ConstantNode.forInt(falseBlockInt));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2491 ValueNode conditionalNode = ConditionalNode.create(condition, trueValue, falseValue);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2492 if (conditionalNode.graph() == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2493 conditionalNode = graph.addOrUnique(conditionalNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2494 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2495 if (genReturn) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2496 Kind returnKind = method.getSignature().getReturnKind().getStackKind();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2497 this.genReturn(conditionalNode, returnKind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2498 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2499 frameState.push(Kind.Int, conditionalNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2500 appendGoto(trueBlock.getSuccessor(0));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2501 stream.setBCI(oldBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2502 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2503 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2504
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2505 private LogicNode createLogicNode(Condition cond, ValueNode a, ValueNode b) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2506 LogicNode condition;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2507 assert !a.getKind().isNumericFloat();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2508 if (cond == Condition.EQ || cond == Condition.NE) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2509 if (a.getKind() == Kind.Object) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2510 condition = genObjectEquals(a, b);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2511 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2512 condition = genIntegerEquals(a, b);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2513 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2514 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2515 assert a.getKind() != Kind.Object && !cond.isUnsigned();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2516 condition = genIntegerLessThan(a, b);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2517 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2518 return condition;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2519 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2520
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2521 private void genConstantTargetIf(BciBlock trueBlock, BciBlock falseBlock, boolean negate, LogicNode condition) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2522 LogicConstantNode constantLogicNode = (LogicConstantNode) condition;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2523 boolean value = constantLogicNode.getValue();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2524 if (negate) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2525 value = !value;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2526 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2527 BciBlock nextBlock = falseBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2528 if (value) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2529 nextBlock = trueBlock;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2530 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2531 appendGoto(nextBlock);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2532 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2533
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2534 private int checkPositiveIntConstantPushed(BciBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2535 stream.setBCI(block.startBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2536 int currentBC = stream.currentBC();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2537 if (currentBC >= Bytecodes.ICONST_0 && currentBC <= Bytecodes.ICONST_5) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2538 int constValue = currentBC - Bytecodes.ICONST_0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2539 return constValue;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2540 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2541 return -1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2542 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2543
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2544 private boolean gotoOrFallThroughAfterConstant(BciBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2545 stream.setBCI(block.startBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2546 int currentBCI = stream.nextBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2547 stream.setBCI(currentBCI);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2548 int currentBC = stream.currentBC();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2549 return stream.currentBCI() > block.endBci || currentBC == Bytecodes.GOTO || currentBC == Bytecodes.GOTO_W;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2550 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2551
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2552 private boolean returnAfterConstant(BciBlock block) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2553 stream.setBCI(block.startBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2554 int currentBCI = stream.nextBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2555 stream.setBCI(currentBCI);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2556 int currentBC = stream.currentBC();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2557 return currentBC == Bytecodes.IRETURN;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2558 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2559
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2560 public StampProvider getStampProvider() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2561 return stampProvider;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2562 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2563
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2564 public MetaAccessProvider getMetaAccess() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2565 return metaAccess;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2566 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2567
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2568 public void push(Kind slotKind, ValueNode value) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2569 assert value.isAlive();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2570 frameState.push(slotKind, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2571 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2572
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2573 private int getCurrentDimension() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2574 if (this.explodeLoopsContext == null || this.explodeLoopsContext.isEmpty()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2575 return 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2576 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2577 return this.explodeLoopsContext.peek().peelIteration;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2578 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2579 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2580
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2581 public ConstantReflectionProvider getConstantReflection() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2582 return constantReflection;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2583 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2584
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2585 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2586 * Gets the graph being processed by this builder.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2587 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2588 public StructuredGraph getGraph() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2589 return graph;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2590 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2591
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2592 public BytecodeParser getParent() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2593 return parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2594 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2595
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2596 public IntrinsicContext getIntrinsic() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2597 return intrinsicContext;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2598 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2599
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2600 @Override
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2601 public String toString() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2602 Formatter fmt = new Formatter();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2603 BytecodeParser bp = this;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2604 String indent = "";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2605 while (bp != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2606 if (bp != this) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2607 fmt.format("%n%s", indent);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2608 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2609 fmt.format("%s [bci: %d, intrinsic: %s]", bp.method.asStackTraceElement(bp.bci()), bp.bci(), bp.parsingIntrinsic());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2610 fmt.format("%n%s", new BytecodeDisassembler().disassemble(bp.method, bp.bci(), bp.bci() + 10));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2611 bp = bp.parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2612 indent += " ";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2613 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2614 return fmt.toString();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2615 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2616
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2617 public BailoutException bailout(String string) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2618 FrameState currentFrameState = createFrameState(bci(), null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2619 StackTraceElement[] elements = GraphUtil.approxSourceStackTraceElement(currentFrameState);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2620 BailoutException bailout = new BailoutException(string);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2621 throw GraphUtil.createBailoutException(string, bailout, elements);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2622 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2623
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2624 private FrameState createFrameState(int bci, StateSplit forStateSplit) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2625 if (currentBlock != null && bci > currentBlock.endBci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2626 frameState.clearNonLiveLocals(currentBlock, liveness, false);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2627 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2628 return frameState.create(bci, forStateSplit);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2629 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2630
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2631 public void setStateAfter(StateSplit sideEffect) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2632 assert sideEffect.hasSideEffect();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2633 FrameState stateAfter = createFrameState(stream.nextBCI(), sideEffect);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2634 sideEffect.setStateAfter(stateAfter);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2635 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2636
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2637 private BytecodePosition createBytecodePosition() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2638 return frameState.createBytecodePosition(bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2639 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2640
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2641 public void setCurrentFrameState(FrameStateBuilder frameState) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2642 this.frameState = frameState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2643 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2644
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2645 protected final BytecodeStream getStream() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2646 return stream;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2647 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2648
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2649 public int bci() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2650 return stream.currentBCI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2651 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2652
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2653 public void loadLocal(int index, Kind kind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2654 ValueNode value = frameState.loadLocal(index, kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2655 frameState.push(kind, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2656 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2657
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2658 public void storeLocal(Kind kind, int index) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2659 ValueNode value = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2660 frameState.storeLocal(index, kind, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2661 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2662
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2663 private void genLoadConstant(int cpi, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2664 Object con = lookupConstant(cpi, opcode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2665
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2666 if (con instanceof JavaType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2667 // this is a load of class constant which might be unresolved
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2668 JavaType type = (JavaType) con;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2669 if (type instanceof ResolvedJavaType) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2670 frameState.push(Kind.Object, appendConstant(((ResolvedJavaType) type).getJavaClass()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2671 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2672 handleUnresolvedLoadConstant(type);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2673 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2674 } else if (con instanceof JavaConstant) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2675 JavaConstant constant = (JavaConstant) con;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2676 frameState.push(constant.getKind(), appendConstant(constant));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2677 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2678 throw new Error("lookupConstant returned an object of incorrect type");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2679 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2680 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2681
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2682 private void genLoadIndexed(Kind kind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2683 ValueNode index = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2684 ValueNode array = emitExplicitExceptions(frameState.pop(Kind.Object), index);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2685
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2686 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2687 if (plugin.handleLoadIndexed(this, array, index, kind)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2688 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2689 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2690 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2691
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2692 frameState.push(kind, append(genLoadIndexed(array, index, kind)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2693 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2694
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2695 private void genStoreIndexed(Kind kind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2696 ValueNode value = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2697 ValueNode index = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2698 ValueNode array = emitExplicitExceptions(frameState.pop(Kind.Object), index);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2699
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2700 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2701 if (plugin.handleStoreIndexed(this, array, index, kind, value)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2702 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2703 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2704 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2705
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2706 genStoreIndexed(array, index, kind, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2707 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2708
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2709 private void genArithmeticOp(Kind kind, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2710 ValueNode y = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2711 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2712 ValueNode v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2713 switch (opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2714 case IADD:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2715 case LADD:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2716 v = genIntegerAdd(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2717 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2718 case FADD:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2719 case DADD:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2720 v = genFloatAdd(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2721 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2722 case ISUB:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2723 case LSUB:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2724 v = genIntegerSub(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2725 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2726 case FSUB:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2727 case DSUB:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2728 v = genFloatSub(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2729 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2730 case IMUL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2731 case LMUL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2732 v = genIntegerMul(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2733 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2734 case FMUL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2735 case DMUL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2736 v = genFloatMul(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2737 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2738 case FDIV:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2739 case DDIV:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2740 v = genFloatDiv(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2741 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2742 case FREM:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2743 case DREM:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2744 v = genFloatRem(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2745 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2746 default:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2747 throw shouldNotReachHere();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2748 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2749 frameState.push(kind, append(v));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2750 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2751
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2752 private void genIntegerDivOp(Kind kind, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2753 ValueNode y = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2754 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2755 ValueNode v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2756 switch (opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2757 case IDIV:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2758 case LDIV:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2759 v = genIntegerDiv(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2760 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2761 case IREM:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2762 case LREM:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2763 v = genIntegerRem(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2764 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2765 default:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2766 throw shouldNotReachHere();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2767 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2768 frameState.push(kind, append(v));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2769 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2770
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2771 private void genNegateOp(Kind kind) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2772 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2773 frameState.push(kind, append(genNegateOp(x)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2774 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2775
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2776 private void genShiftOp(Kind kind, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2777 ValueNode s = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2778 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2779 ValueNode v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2780 switch (opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2781 case ISHL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2782 case LSHL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2783 v = genLeftShift(x, s);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2784 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2785 case ISHR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2786 case LSHR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2787 v = genRightShift(x, s);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2788 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2789 case IUSHR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2790 case LUSHR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2791 v = genUnsignedRightShift(x, s);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2792 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2793 default:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2794 throw shouldNotReachHere();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2795 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2796 frameState.push(kind, append(v));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2797 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2798
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2799 private void genLogicOp(Kind kind, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2800 ValueNode y = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2801 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2802 ValueNode v;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2803 switch (opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2804 case IAND:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2805 case LAND:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2806 v = genAnd(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2807 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2808 case IOR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2809 case LOR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2810 v = genOr(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2811 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2812 case IXOR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2813 case LXOR:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2814 v = genXor(x, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2815 break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2816 default:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2817 throw shouldNotReachHere();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2818 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2819 frameState.push(kind, append(v));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2820 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2821
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2822 private void genCompareOp(Kind kind, boolean isUnorderedLess) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2823 ValueNode y = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2824 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2825 frameState.push(Kind.Int, append(genNormalizeCompare(x, y, isUnorderedLess)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2826 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2827
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2828 private void genFloatConvert(FloatConvert op, Kind from, Kind to) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2829 ValueNode input = frameState.pop(from);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2830 frameState.push(to, append(genFloatConvert(op, input)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2831 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2832
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2833 private void genSignExtend(Kind from, Kind to) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2834 ValueNode input = frameState.pop(from);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2835 if (from != from.getStackKind()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2836 input = append(genNarrow(input, from.getBitCount()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2837 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2838 frameState.push(to, append(genSignExtend(input, to.getBitCount())));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2839 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2840
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2841 private void genZeroExtend(Kind from, Kind to) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2842 ValueNode input = frameState.pop(from);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2843 if (from != from.getStackKind()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2844 input = append(genNarrow(input, from.getBitCount()));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2845 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2846 frameState.push(to, append(genZeroExtend(input, to.getBitCount())));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2847 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2848
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2849 private void genNarrow(Kind from, Kind to) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2850 ValueNode input = frameState.pop(from);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2851 frameState.push(to, append(genNarrow(input, to.getBitCount())));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2852 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2853
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2854 private void genIncrement() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2855 int index = getStream().readLocalIndex();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2856 int delta = getStream().readIncrement();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2857 ValueNode x = frameState.loadLocal(index, Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2858 ValueNode y = appendConstant(JavaConstant.forInt(delta));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2859 frameState.storeLocal(index, Kind.Int, append(genIntegerAdd(x, y)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2860 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2861
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2862 private void genIfZero(Condition cond) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2863 ValueNode y = appendConstant(JavaConstant.INT_0);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2864 ValueNode x = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2865 genIf(x, cond, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2866 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2867
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2868 private void genIfNull(Condition cond) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2869 ValueNode y = appendConstant(JavaConstant.NULL_POINTER);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2870 ValueNode x = frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2871 genIf(x, cond, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2872 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2873
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2874 private void genIfSame(Kind kind, Condition cond) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2875 ValueNode y = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2876 ValueNode x = frameState.pop(kind);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2877 genIf(x, cond, y);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2878 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2879
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2880 protected JavaType lookupType(int cpi, int bytecode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2881 maybeEagerlyResolve(cpi, bytecode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2882 JavaType result = constantPool.lookupType(cpi, bytecode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2883 assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaType;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2884 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2885 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2886
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2887 private JavaMethod lookupMethod(int cpi, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2888 maybeEagerlyResolve(cpi, opcode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2889 JavaMethod result = constantPool.lookupMethod(cpi, opcode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2890 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2891 * In general, one cannot assume that the declaring class being initialized is useful, since
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2892 * the actual concrete receiver may be a different class (except for static calls). Also,
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2893 * interfaces are initialized only under special circumstances, so that this assertion would
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2894 * often fail for interface calls.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2895 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2896 assert !graphBuilderConfig.unresolvedIsError() || (result instanceof ResolvedJavaMethod && (opcode != INVOKESTATIC || ((ResolvedJavaMethod) result).getDeclaringClass().isInitialized())) : result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2897 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2898 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2899
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2900 private JavaField lookupField(int cpi, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2901 maybeEagerlyResolve(cpi, opcode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2902 JavaField result = constantPool.lookupField(cpi, opcode);
21771
ed3d7af510bd BytecodeParser#lookupField: use eagerResolving instead of unresolvedIsError to guard explicit initialization.
Josef Eisl <josef.eisl@jku.at>
parents: 21766
diff changeset
2903 if (graphBuilderConfig.eagerResolving()) {
21660
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2904 assert result instanceof ResolvedJavaField : "Not resolved: " + result;
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2905 ResolvedJavaType declaringClass = ((ResolvedJavaField) result).getDeclaringClass();
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2906 if (!declaringClass.isInitialized()) {
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2907 assert declaringClass.isInterface() : "Declaring class not initialized but not an interface? " + declaringClass;
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2908 declaringClass.initialize();
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2909 }
e1ca9b57b63b BytecodeParser#lookupField: explicitly initialize interface if it is the declaring class of the field.
Josef Eisl <josef.eisl@jku.at>
parents: 21654
diff changeset
2910 }
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2911 assert !graphBuilderConfig.unresolvedIsError() || (result instanceof ResolvedJavaField && ((ResolvedJavaField) result).getDeclaringClass().isInitialized()) : result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2912 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2913 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2914
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2915 private Object lookupConstant(int cpi, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2916 maybeEagerlyResolve(cpi, opcode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2917 Object result = constantPool.lookupConstant(cpi);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2918 assert !graphBuilderConfig.eagerResolving() || !(result instanceof JavaType) || (result instanceof ResolvedJavaType) : result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2919 return result;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2920 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2921
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2922 private void maybeEagerlyResolve(int cpi, int bytecode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2923 if (graphBuilderConfig.eagerResolving() || intrinsicContext != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2924 constantPool.loadReferencedType(cpi, bytecode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2925 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2926 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2927
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2928 private JavaTypeProfile getProfileForTypeCheck(ResolvedJavaType type) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2929 if (parsingIntrinsic() || profilingInfo == null || !optimisticOpts.useTypeCheckHints() || !canHaveSubtype(type)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2930 return null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2931 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2932 return profilingInfo.getTypeProfile(bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2933 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2934 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2935
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2936 private void genCheckCast() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2937 int cpi = getStream().readCPI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2938 JavaType type = lookupType(cpi, CHECKCAST);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2939 ValueNode object = frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2940
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2941 if (!(type instanceof ResolvedJavaType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2942 handleUnresolvedCheckCast(type, object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2943 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2944 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2945 ResolvedJavaType resolvedType = (ResolvedJavaType) type;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2946 JavaTypeProfile profile = getProfileForTypeCheck(resolvedType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2947
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2948 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2949 if (plugin.handleCheckCast(this, object, resolvedType, profile)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2950 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2951 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2952 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2953
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2954 ValueNode checkCastNode = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2955 if (profile != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2956 if (profile.getNullSeen().isFalse()) {
21654
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2957 object = appendNullCheck(object);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2958 ResolvedJavaType singleType = profile.asSingleType();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2959 if (singleType != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2960 LogicNode typeCheck = append(TypeCheckNode.create(singleType, object));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2961 if (typeCheck.isTautology()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2962 checkCastNode = object;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2963 } else {
21654
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2964 FixedGuardNode fixedGuard = append(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile, false));
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2965 checkCastNode = append(new PiNode(object, StampFactory.exactNonNull(singleType), fixedGuard));
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2966 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2967 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2968 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2969 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2970 if (checkCastNode == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2971 checkCastNode = append(createCheckCast(resolvedType, object, profile, false));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2972 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2973 frameState.push(Kind.Object, checkCastNode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2974 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2975
21654
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2976 private ValueNode appendNullCheck(ValueNode object) {
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2977 IsNullNode isNull = append(new IsNullNode(object));
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2978 FixedGuardNode fixedGuard = append(new FixedGuardNode(isNull, DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true));
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2979 return append(new PiNode(object, object.stamp().join(StampFactory.objectNonNull()), fixedGuard));
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2980 }
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
2981
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2982 private void genInstanceOf() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2983 int cpi = getStream().readCPI();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2984 JavaType type = lookupType(cpi, INSTANCEOF);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2985 ValueNode object = frameState.pop(Kind.Object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2986
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2987 if (!(type instanceof ResolvedJavaType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2988 handleUnresolvedInstanceOf(type, object);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2989 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2990 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2991 ResolvedJavaType resolvedType = (ResolvedJavaType) type;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2992 JavaTypeProfile profile = getProfileForTypeCheck(resolvedType);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2993
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2994 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2995 if (plugin.handleInstanceOf(this, object, resolvedType, profile)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2996 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2997 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2998 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2999
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3000 ValueNode instanceOfNode = null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3001 if (profile != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3002 if (profile.getNullSeen().isFalse()) {
21654
cd6b1b2189a0 Remove GuardingPiNode and replace with FixedGuardNode + PiNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 21622
diff changeset
3003 object = appendNullCheck(object);
21609
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3004 ResolvedJavaType singleType = profile.asSingleType();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3005 if (singleType != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3006 LogicNode typeCheck = append(TypeCheckNode.create(singleType, object));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3007 append(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3008 instanceOfNode = LogicConstantNode.forBoolean(resolvedType.isAssignableFrom(singleType));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3009 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3010 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3011 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3012 if (instanceOfNode == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3013 instanceOfNode = createInstanceOf(resolvedType, object, profile);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3014 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3015 frameState.push(Kind.Int, append(genConditional(genUnique(instanceOfNode))));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3016 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3017
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3018 void genNewInstance(int cpi) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3019 JavaType type = lookupType(cpi, NEW);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3020
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3021 if (!(type instanceof ResolvedJavaType) || !((ResolvedJavaType) type).isInitialized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3022 handleUnresolvedNewInstance(type);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3023 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3024 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3025 ResolvedJavaType resolvedType = (ResolvedJavaType) type;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3026
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3027 ResolvedJavaType[] skippedExceptionTypes = this.graphBuilderConfig.getSkippedExceptionTypes();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3028 if (skippedExceptionTypes != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3029 for (ResolvedJavaType exceptionType : skippedExceptionTypes) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3030 if (exceptionType.isAssignableFrom(resolvedType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3031 append(new DeoptimizeNode(DeoptimizationAction.None, TransferToInterpreter));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3032 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3033 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3034 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3035 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3036
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3037 frameState.push(Kind.Object, append(createNewInstance(resolvedType, true)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3038 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3039
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3040 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3041 * Gets the kind of array elements for the array type code that appears in a
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3042 * {@link Bytecodes#NEWARRAY} bytecode.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3043 *
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3044 * @param code the array type code
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3045 * @return the kind from the array type code
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3046 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3047 private static Class<?> arrayTypeCodeToClass(int code) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3048 switch (code) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3049 case 4:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3050 return boolean.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3051 case 5:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3052 return char.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3053 case 6:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3054 return float.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3055 case 7:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3056 return double.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3057 case 8:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3058 return byte.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3059 case 9:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3060 return short.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3061 case 10:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3062 return int.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3063 case 11:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3064 return long.class;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3065 default:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3066 throw new IllegalArgumentException("unknown array type code: " + code);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3067 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3068 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3069
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3070 private void genNewPrimitiveArray(int typeCode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3071 ResolvedJavaType elementType = metaAccess.lookupJavaType(arrayTypeCodeToClass(typeCode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3072 ValueNode length = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3073 frameState.push(Kind.Object, append(createNewArray(elementType, length, true)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3074 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3075
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3076 private void genNewObjectArray(int cpi) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3077 JavaType type = lookupType(cpi, ANEWARRAY);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3078 ValueNode length = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3079
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3080 if (!(type instanceof ResolvedJavaType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3081 handleUnresolvedNewObjectArray(type, length);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3082 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3083 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3084 ResolvedJavaType resolvedType = (ResolvedJavaType) type;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3085
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3086 frameState.push(Kind.Object, append(createNewArray(resolvedType, length, true)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3087 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3088
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3089 private void genNewMultiArray(int cpi) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3090 JavaType type = lookupType(cpi, MULTIANEWARRAY);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3091 int rank = getStream().readUByte(bci() + 3);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3092 List<ValueNode> dims = new ArrayList<>(Collections.nCopies(rank, null));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3093 for (int i = rank - 1; i >= 0; i--) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3094 dims.set(i, frameState.pop(Kind.Int));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3095 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3096
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3097 if (!(type instanceof ResolvedJavaType)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3098 handleUnresolvedNewMultiArray(type, dims);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3099 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3100 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3101 ResolvedJavaType resolvedType = (ResolvedJavaType) type;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3102
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3103 frameState.push(Kind.Object, append(createNewMultiArray(resolvedType, dims)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3104 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3105
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3106 private void genGetField(JavaField field) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3107 ValueNode receiver = emitExplicitExceptions(frameState.pop(Kind.Object), null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3108
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3109 if (!(field instanceof ResolvedJavaField) || !((ResolvedJavaField) field).getDeclaringClass().isInitialized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3110 handleUnresolvedLoadField(field, receiver);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3111 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3112 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3113 ResolvedJavaField resolvedField = (ResolvedJavaField) field;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3114
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3115 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3116 if (plugin.handleLoadField(this, receiver, resolvedField)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3117 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3118 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3119 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3120
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3121 frameState.push(field.getKind(), append(genLoadField(receiver, resolvedField)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3122 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3123
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3124 /**
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3125 * @param receiver the receiver of an object based operation
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3126 * @param index the index of an array based operation that is to be tested for out of bounds.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3127 * This is null for a non-array operation.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3128 * @return the receiver value possibly modified to have a tighter stamp
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3129 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3130 protected ValueNode emitExplicitExceptions(ValueNode receiver, ValueNode index) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3131 assert receiver != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3132 if (graphBuilderConfig.omitAllExceptionEdges() || profilingInfo == null ||
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3133 (optimisticOpts.useExceptionProbabilityForOperations() && profilingInfo.getExceptionSeen(bci()) == TriState.FALSE && !GraalOptions.StressExplicitExceptionCode.getValue())) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3134 return receiver;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3135 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3136
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3137 ValueNode nonNullReceiver = emitExplicitNullCheck(receiver);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3138 if (index != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3139 ValueNode length = append(genArrayLength(nonNullReceiver));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3140 emitExplicitBoundsCheck(index, length);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3141 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3142 EXPLICIT_EXCEPTIONS.increment();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3143 return nonNullReceiver;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3144 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3145
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3146 private void genPutField(JavaField field) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3147 ValueNode value = frameState.pop(field.getKind());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3148 ValueNode receiver = emitExplicitExceptions(frameState.pop(Kind.Object), null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3149
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3150 if (!(field instanceof ResolvedJavaField) || !((ResolvedJavaField) field).getDeclaringClass().isInitialized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3151 handleUnresolvedStoreField(field, value, receiver);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3152 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3153 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3154 ResolvedJavaField resolvedField = (ResolvedJavaField) field;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3155
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3156 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3157 if (plugin.handleStoreField(this, receiver, resolvedField, value)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3158 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3159 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3160 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3161
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3162 genStoreField(receiver, resolvedField, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3163 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3164
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3165 private void genGetStatic(JavaField field) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3166 if (!(field instanceof ResolvedJavaField) || !((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3167 handleUnresolvedLoadField(field, null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3168 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3169 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3170 ResolvedJavaField resolvedField = (ResolvedJavaField) field;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3171
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3172 /*
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3173 * Javac does not allow use of "$assertionsDisabled" for a field name but Eclipse does, in
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3174 * which case a suffix is added to the generated field.
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3175 */
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3176 if ((parsingIntrinsic() || graphBuilderConfig.omitAssertions()) && resolvedField.isSynthetic() && resolvedField.getName().startsWith("$assertionsDisabled")) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3177 frameState.push(field.getKind(), ConstantNode.forBoolean(true, graph));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3178 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3179 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3180
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3181 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3182 if (plugin.handleLoadStaticField(this, resolvedField)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3183 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3184 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3185 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3186
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3187 frameState.push(field.getKind(), append(genLoadField(null, resolvedField)));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3188 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3189
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3190 private void genPutStatic(JavaField field) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3191 ValueNode value = frameState.pop(field.getKind());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3192 if (!(field instanceof ResolvedJavaField) || !((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3193 handleUnresolvedStoreField(field, value, null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3194 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3195 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3196 ResolvedJavaField resolvedField = (ResolvedJavaField) field;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3197
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3198 for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3199 if (plugin.handleStoreStaticField(this, resolvedField, value)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3200 return;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3201 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3202 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3203
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3204 genStoreField(null, resolvedField, value);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3205 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3206
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3207 private double[] switchProbability(int numberOfCases, int bci) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3208 double[] prob = (profilingInfo == null ? null : profilingInfo.getSwitchProbabilities(bci));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3209 if (prob != null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3210 assert prob.length == numberOfCases;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3211 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3212 Debug.log("Missing probability (switch) in %s at bci %d", method, bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3213 prob = new double[numberOfCases];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3214 for (int i = 0; i < numberOfCases; i++) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3215 prob[i] = 1.0d / numberOfCases;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3216 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3217 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3218 assert allPositive(prob);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3219 return prob;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3220 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3221
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3222 private static boolean allPositive(double[] a) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3223 for (double d : a) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3224 if (d < 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3225 return false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3226 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3227 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3228 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3229 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3230
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3231 static class SuccessorInfo {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3232 final int blockIndex;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3233 int actualIndex;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3234
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3235 public SuccessorInfo(int blockSuccessorIndex) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3236 this.blockIndex = blockSuccessorIndex;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3237 actualIndex = -1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3238 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3239 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3240
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3241 private void genSwitch(BytecodeSwitch bs) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3242 int bci = bci();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3243 ValueNode value = frameState.pop(Kind.Int);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3244
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3245 int nofCases = bs.numberOfCases();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3246 double[] keyProbabilities = switchProbability(nofCases + 1, bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3247
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3248 Map<Integer, SuccessorInfo> bciToBlockSuccessorIndex = new HashMap<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3249 for (int i = 0; i < currentBlock.getSuccessorCount(); i++) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3250 assert !bciToBlockSuccessorIndex.containsKey(currentBlock.getSuccessor(i).startBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3251 if (!bciToBlockSuccessorIndex.containsKey(currentBlock.getSuccessor(i).startBci)) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3252 bciToBlockSuccessorIndex.put(currentBlock.getSuccessor(i).startBci, new SuccessorInfo(i));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3253 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3254 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3255
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3256 ArrayList<BciBlock> actualSuccessors = new ArrayList<>();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3257 int[] keys = new int[nofCases];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3258 int[] keySuccessors = new int[nofCases + 1];
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3259 int deoptSuccessorIndex = -1;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3260 int nextSuccessorIndex = 0;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3261 boolean constantValue = value.isConstant();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3262 for (int i = 0; i < nofCases + 1; i++) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3263 if (i < nofCases) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3264 keys[i] = bs.keyAt(i);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3265 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3266
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3267 if (!constantValue && isNeverExecutedCode(keyProbabilities[i])) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3268 if (deoptSuccessorIndex < 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3269 deoptSuccessorIndex = nextSuccessorIndex++;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3270 actualSuccessors.add(null);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3271 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3272 keySuccessors[i] = deoptSuccessorIndex;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3273 } else {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3274 int targetBci = i >= nofCases ? bs.defaultTarget() : bs.targetAt(i);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3275 SuccessorInfo info = bciToBlockSuccessorIndex.get(targetBci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3276 if (info.actualIndex < 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3277 info.actualIndex = nextSuccessorIndex++;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3278 actualSuccessors.add(currentBlock.getSuccessor(info.blockIndex));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3279 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3280 keySuccessors[i] = info.actualIndex;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3281 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3282 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3283
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3284 genIntegerSwitch(value, actualSuccessors, keys, keyProbabilities, keySuccessors);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3285
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3286 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3287
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3288 protected boolean isNeverExecutedCode(double probability) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3289 return probability == 0 && optimisticOpts.removeNeverExecutedCode();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3290 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3291
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3292 protected double branchProbability() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3293 if (profilingInfo == null) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3294 return 0.5;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3295 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3296 assert assertAtIfBytecode();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3297 double probability = profilingInfo.getBranchTakenProbability(bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3298 if (probability < 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3299 assert probability == -1 : "invalid probability";
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3300 Debug.log("missing probability in %s at bci %d", method, bci());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3301 probability = 0.5;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3302 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3303
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3304 if (!optimisticOpts.removeNeverExecutedCode()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3305 if (probability == 0) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3306 probability = 0.0000001;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3307 } else if (probability == 1) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3308 probability = 0.999999;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3309 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3310 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3311 return probability;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3312 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3313
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3314 private boolean assertAtIfBytecode() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3315 int bytecode = stream.currentBC();
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3316 switch (bytecode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3317 case IFEQ:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3318 case IFNE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3319 case IFLT:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3320 case IFGE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3321 case IFGT:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3322 case IFLE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3323 case IF_ICMPEQ:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3324 case IF_ICMPNE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3325 case IF_ICMPLT:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3326 case IF_ICMPGE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3327 case IF_ICMPGT:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3328 case IF_ICMPLE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3329 case IF_ACMPEQ:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3330 case IF_ACMPNE:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3331 case IFNULL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3332 case IFNONNULL:
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3333 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3334 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3335 assert false : String.format("%x is not an if bytecode", bytecode);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3336 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3337 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3338
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3339 public final void processBytecode(int bci, int opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3340 int cpi;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3341
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3342 // @formatter:off
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3343 // Checkstyle: stop
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3344 switch (opcode) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3345 case NOP : /* nothing to do */ break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3346 case ACONST_NULL : frameState.push(Kind.Object, appendConstant(JavaConstant.NULL_POINTER)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3347 case ICONST_M1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3348 case ICONST_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3349 case ICONST_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3350 case ICONST_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3351 case ICONST_3 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3352 case ICONST_4 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3353 case ICONST_5 : frameState.push(Kind.Int, appendConstant(JavaConstant.forInt(opcode - ICONST_0))); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3354 case LCONST_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3355 case LCONST_1 : frameState.push(Kind.Long, appendConstant(JavaConstant.forLong(opcode - LCONST_0))); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3356 case FCONST_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3357 case FCONST_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3358 case FCONST_2 : frameState.push(Kind.Float, appendConstant(JavaConstant.forFloat(opcode - FCONST_0))); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3359 case DCONST_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3360 case DCONST_1 : frameState.push(Kind.Double, appendConstant(JavaConstant.forDouble(opcode - DCONST_0))); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3361 case BIPUSH : frameState.push(Kind.Int, appendConstant(JavaConstant.forInt(stream.readByte()))); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3362 case SIPUSH : frameState.push(Kind.Int, appendConstant(JavaConstant.forInt(stream.readShort()))); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3363 case LDC : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3364 case LDC_W : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3365 case LDC2_W : genLoadConstant(stream.readCPI(), opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3366 case ILOAD : loadLocal(stream.readLocalIndex(), Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3367 case LLOAD : loadLocal(stream.readLocalIndex(), Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3368 case FLOAD : loadLocal(stream.readLocalIndex(), Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3369 case DLOAD : loadLocal(stream.readLocalIndex(), Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3370 case ALOAD : loadLocal(stream.readLocalIndex(), Kind.Object); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3371 case ILOAD_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3372 case ILOAD_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3373 case ILOAD_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3374 case ILOAD_3 : loadLocal(opcode - ILOAD_0, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3375 case LLOAD_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3376 case LLOAD_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3377 case LLOAD_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3378 case LLOAD_3 : loadLocal(opcode - LLOAD_0, Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3379 case FLOAD_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3380 case FLOAD_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3381 case FLOAD_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3382 case FLOAD_3 : loadLocal(opcode - FLOAD_0, Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3383 case DLOAD_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3384 case DLOAD_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3385 case DLOAD_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3386 case DLOAD_3 : loadLocal(opcode - DLOAD_0, Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3387 case ALOAD_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3388 case ALOAD_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3389 case ALOAD_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3390 case ALOAD_3 : loadLocal(opcode - ALOAD_0, Kind.Object); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3391 case IALOAD : genLoadIndexed(Kind.Int ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3392 case LALOAD : genLoadIndexed(Kind.Long ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3393 case FALOAD : genLoadIndexed(Kind.Float ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3394 case DALOAD : genLoadIndexed(Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3395 case AALOAD : genLoadIndexed(Kind.Object); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3396 case BALOAD : genLoadIndexed(Kind.Byte ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3397 case CALOAD : genLoadIndexed(Kind.Char ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3398 case SALOAD : genLoadIndexed(Kind.Short ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3399 case ISTORE : storeLocal(Kind.Int, stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3400 case LSTORE : storeLocal(Kind.Long, stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3401 case FSTORE : storeLocal(Kind.Float, stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3402 case DSTORE : storeLocal(Kind.Double, stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3403 case ASTORE : storeLocal(Kind.Object, stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3404 case ISTORE_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3405 case ISTORE_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3406 case ISTORE_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3407 case ISTORE_3 : storeLocal(Kind.Int, opcode - ISTORE_0); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3408 case LSTORE_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3409 case LSTORE_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3410 case LSTORE_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3411 case LSTORE_3 : storeLocal(Kind.Long, opcode - LSTORE_0); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3412 case FSTORE_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3413 case FSTORE_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3414 case FSTORE_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3415 case FSTORE_3 : storeLocal(Kind.Float, opcode - FSTORE_0); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3416 case DSTORE_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3417 case DSTORE_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3418 case DSTORE_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3419 case DSTORE_3 : storeLocal(Kind.Double, opcode - DSTORE_0); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3420 case ASTORE_0 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3421 case ASTORE_1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3422 case ASTORE_2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3423 case ASTORE_3 : storeLocal(Kind.Object, opcode - ASTORE_0); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3424 case IASTORE : genStoreIndexed(Kind.Int ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3425 case LASTORE : genStoreIndexed(Kind.Long ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3426 case FASTORE : genStoreIndexed(Kind.Float ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3427 case DASTORE : genStoreIndexed(Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3428 case AASTORE : genStoreIndexed(Kind.Object); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3429 case BASTORE : genStoreIndexed(Kind.Byte ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3430 case CASTORE : genStoreIndexed(Kind.Char ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3431 case SASTORE : genStoreIndexed(Kind.Short ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3432 case POP : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3433 case POP2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3434 case DUP : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3435 case DUP_X1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3436 case DUP_X2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3437 case DUP2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3438 case DUP2_X1 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3439 case DUP2_X2 : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3440 case SWAP : frameState.stackOp(opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3441 case IADD : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3442 case ISUB : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3443 case IMUL : genArithmeticOp(Kind.Int, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3444 case IDIV : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3445 case IREM : genIntegerDivOp(Kind.Int, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3446 case LADD : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3447 case LSUB : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3448 case LMUL : genArithmeticOp(Kind.Long, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3449 case LDIV : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3450 case LREM : genIntegerDivOp(Kind.Long, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3451 case FADD : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3452 case FSUB : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3453 case FMUL : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3454 case FDIV : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3455 case FREM : genArithmeticOp(Kind.Float, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3456 case DADD : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3457 case DSUB : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3458 case DMUL : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3459 case DDIV : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3460 case DREM : genArithmeticOp(Kind.Double, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3461 case INEG : genNegateOp(Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3462 case LNEG : genNegateOp(Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3463 case FNEG : genNegateOp(Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3464 case DNEG : genNegateOp(Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3465 case ISHL : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3466 case ISHR : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3467 case IUSHR : genShiftOp(Kind.Int, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3468 case IAND : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3469 case IOR : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3470 case IXOR : genLogicOp(Kind.Int, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3471 case LSHL : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3472 case LSHR : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3473 case LUSHR : genShiftOp(Kind.Long, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3474 case LAND : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3475 case LOR : // fall through
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3476 case LXOR : genLogicOp(Kind.Long, opcode); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3477 case IINC : genIncrement(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3478 case I2F : genFloatConvert(FloatConvert.I2F, Kind.Int, Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3479 case I2D : genFloatConvert(FloatConvert.I2D, Kind.Int, Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3480 case L2F : genFloatConvert(FloatConvert.L2F, Kind.Long, Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3481 case L2D : genFloatConvert(FloatConvert.L2D, Kind.Long, Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3482 case F2I : genFloatConvert(FloatConvert.F2I, Kind.Float, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3483 case F2L : genFloatConvert(FloatConvert.F2L, Kind.Float, Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3484 case F2D : genFloatConvert(FloatConvert.F2D, Kind.Float, Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3485 case D2I : genFloatConvert(FloatConvert.D2I, Kind.Double, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3486 case D2L : genFloatConvert(FloatConvert.D2L, Kind.Double, Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3487 case D2F : genFloatConvert(FloatConvert.D2F, Kind.Double, Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3488 case L2I : genNarrow(Kind.Long, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3489 case I2L : genSignExtend(Kind.Int, Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3490 case I2B : genSignExtend(Kind.Byte, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3491 case I2S : genSignExtend(Kind.Short, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3492 case I2C : genZeroExtend(Kind.Char, Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3493 case LCMP : genCompareOp(Kind.Long, false); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3494 case FCMPL : genCompareOp(Kind.Float, true); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3495 case FCMPG : genCompareOp(Kind.Float, false); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3496 case DCMPL : genCompareOp(Kind.Double, true); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3497 case DCMPG : genCompareOp(Kind.Double, false); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3498 case IFEQ : genIfZero(Condition.EQ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3499 case IFNE : genIfZero(Condition.NE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3500 case IFLT : genIfZero(Condition.LT); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3501 case IFGE : genIfZero(Condition.GE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3502 case IFGT : genIfZero(Condition.GT); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3503 case IFLE : genIfZero(Condition.LE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3504 case IF_ICMPEQ : genIfSame(Kind.Int, Condition.EQ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3505 case IF_ICMPNE : genIfSame(Kind.Int, Condition.NE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3506 case IF_ICMPLT : genIfSame(Kind.Int, Condition.LT); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3507 case IF_ICMPGE : genIfSame(Kind.Int, Condition.GE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3508 case IF_ICMPGT : genIfSame(Kind.Int, Condition.GT); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3509 case IF_ICMPLE : genIfSame(Kind.Int, Condition.LE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3510 case IF_ACMPEQ : genIfSame(Kind.Object, Condition.EQ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3511 case IF_ACMPNE : genIfSame(Kind.Object, Condition.NE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3512 case GOTO : genGoto(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3513 case JSR : genJsr(stream.readBranchDest()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3514 case RET : genRet(stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3515 case TABLESWITCH : genSwitch(new BytecodeTableSwitch(getStream(), bci())); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3516 case LOOKUPSWITCH : genSwitch(new BytecodeLookupSwitch(getStream(), bci())); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3517 case IRETURN : genReturn(frameState.pop(Kind.Int), Kind.Int); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3518 case LRETURN : genReturn(frameState.pop(Kind.Long), Kind.Long); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3519 case FRETURN : genReturn(frameState.pop(Kind.Float), Kind.Float); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3520 case DRETURN : genReturn(frameState.pop(Kind.Double), Kind.Double); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3521 case ARETURN : genReturn(frameState.pop(Kind.Object), Kind.Object); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3522 case RETURN : genReturn(null, Kind.Void); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3523 case GETSTATIC : cpi = stream.readCPI(); genGetStatic(lookupField(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3524 case PUTSTATIC : cpi = stream.readCPI(); genPutStatic(lookupField(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3525 case GETFIELD : cpi = stream.readCPI(); genGetField(lookupField(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3526 case PUTFIELD : cpi = stream.readCPI(); genPutField(lookupField(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3527 case INVOKEVIRTUAL : cpi = stream.readCPI(); genInvokeVirtual(lookupMethod(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3528 case INVOKESPECIAL : cpi = stream.readCPI(); genInvokeSpecial(lookupMethod(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3529 case INVOKESTATIC : cpi = stream.readCPI(); genInvokeStatic(lookupMethod(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3530 case INVOKEINTERFACE: cpi = stream.readCPI(); genInvokeInterface(lookupMethod(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3531 case INVOKEDYNAMIC : cpi = stream.readCPI4(); genInvokeDynamic(lookupMethod(cpi, opcode)); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3532 case NEW : genNewInstance(stream.readCPI()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3533 case NEWARRAY : genNewPrimitiveArray(stream.readLocalIndex()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3534 case ANEWARRAY : genNewObjectArray(stream.readCPI()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3535 case ARRAYLENGTH : genArrayLength(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3536 case ATHROW : genThrow(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3537 case CHECKCAST : genCheckCast(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3538 case INSTANCEOF : genInstanceOf(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3539 case MONITORENTER : genMonitorEnter(frameState.pop(Kind.Object), stream.nextBCI()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3540 case MONITOREXIT : genMonitorExit(frameState.pop(Kind.Object), null, stream.nextBCI()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3541 case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3542 case IFNULL : genIfNull(Condition.EQ); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3543 case IFNONNULL : genIfNull(Condition.NE); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3544 case GOTO_W : genGoto(); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3545 case JSR_W : genJsr(stream.readBranchDest()); break;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3546 case BREAKPOINT : throw new BailoutException("concurrent setting of breakpoint");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3547 default : throw new BailoutException("Unsupported opcode %d (%s) [bci=%d]", opcode, nameOf(opcode), bci);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3548 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3549 // @formatter:on
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3550 // Checkstyle: resume
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3551 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3552
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3553 private void genArrayLength() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3554 frameState.push(Kind.Int, append(genArrayLength(frameState.pop(Kind.Object))));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3555 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3556
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3557 public ResolvedJavaMethod getMethod() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3558 return method;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3559 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3560
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3561 public FrameStateBuilder getFrameStateBuilder() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3562 return frameState;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3563 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3564
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3565 protected boolean traceInstruction(int bci, int opcode, boolean blockStart) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3566 if (Debug.isEnabled() && Options.TraceBytecodeParserLevel.getValue() >= TRACELEVEL_INSTRUCTIONS && Debug.isLogEnabled()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3567 traceInstructionHelper(bci, opcode, blockStart);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3568 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3569 return true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3570 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3571
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3572 private void traceInstructionHelper(int bci, int opcode, boolean blockStart) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3573 StringBuilder sb = new StringBuilder(40);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3574 sb.append(blockStart ? '+' : '|');
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3575 if (bci < 10) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3576 sb.append(" ");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3577 } else if (bci < 100) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3578 sb.append(' ');
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3579 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3580 sb.append(bci).append(": ").append(Bytecodes.nameOf(opcode));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3581 for (int i = bci + 1; i < stream.nextBCI(); ++i) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3582 sb.append(' ').append(stream.readUByte(i));
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3583 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3584 if (!currentBlock.getJsrScope().isEmpty()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3585 sb.append(' ').append(currentBlock.getJsrScope());
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3586 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3587 Debug.log("%s", sb);
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3588 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3589
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3590 public boolean parsingIntrinsic() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3591 return intrinsicContext != null;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3592 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3593
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3594 public BytecodeParser getNonIntrinsicAncestor() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3595 BytecodeParser ancestor = parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3596 while (ancestor != null && ancestor.parsingIntrinsic()) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3597 ancestor = ancestor.parent;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3598 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3599 return ancestor;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3600 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3601
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3602 static String nSpaces(int n) {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3603 return n == 0 ? "" : format("%" + n + "s", "");
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3604 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3605
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3606 @SuppressWarnings("all")
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3607 private static boolean assertionsEnabled() {
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3608 boolean assertionsEnabled = false;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3609 assert assertionsEnabled = true;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3610 return assertionsEnabled;
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3611 }
2221d959de64 Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3612 }