annotate graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java @ 2888:224412c24426

Changed C1X=>Graal and c1x=>graal in Java code.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 08 Jun 2011 13:35:43 +0200
parents d7416eab9ddc
children 434d71eec7a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1 /*
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
2 * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
4 *
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
7 * published by the Free Software Foundation.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
8 *
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
13 * accompanied this code).
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
14 *
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
18 *
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
21 * questions.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
22 */
2879
7f584bf507ed Renamed and moved phase subclasses.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2875
diff changeset
23 package com.oracle.max.graal.compiler.phases;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
24
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
25 import static com.sun.cri.bytecode.Bytecodes.*;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
26 import static java.lang.reflect.Modifier.*;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
27
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
28 import java.lang.reflect.*;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
29 import java.util.*;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
30
2874
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
31 import com.oracle.max.graal.compiler.*;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
32 import com.oracle.max.graal.compiler.debug.*;
2879
7f584bf507ed Renamed and moved phase subclasses.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2875
diff changeset
33 import com.oracle.max.graal.compiler.graph.*;
2874
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
34 import com.oracle.max.graal.compiler.graph.BlockMap.*;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
35 import com.oracle.max.graal.compiler.graph.BlockMap.Block;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
36 import com.oracle.max.graal.compiler.ir.*;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
37 import com.oracle.max.graal.compiler.schedule.*;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
38 import com.oracle.max.graal.compiler.util.*;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
39 import com.oracle.max.graal.compiler.value.*;
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
40 import com.oracle.max.graal.graph.*;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
41 import com.sun.cri.bytecode.*;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
42 import com.sun.cri.ci.*;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
43 import com.sun.cri.ri.*;
2872
0341b6424579 Project renaming.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2869
diff changeset
44 import com.sun.cri.ri.RiType.*;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
45
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
46 /**
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
47 * The {@code GraphBuilder} class parses the bytecode of a method and builds the IR graph.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
48 * A number of optimizations may be performed during parsing of the bytecode, including value
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
49 * numbering, inlining, constant folding, strength reduction, etc.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
50 */
2879
7f584bf507ed Renamed and moved phase subclasses.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2875
diff changeset
51 public final class GraphBuilderPhase extends Phase {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
52
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
53 /**
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
54 * The minimum value to which {@link GraalOptions#TraceBytecodeParserLevel} must be set to trace
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
55 * the bytecode instructions as they are parsed.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
56 */
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
57 public static final int TRACELEVEL_INSTRUCTIONS = 1;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
58
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
59 /**
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
60 * The minimum value to which {@link GraalOptions#TraceBytecodeParserLevel} must be set to trace
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
61 * the frame state before each bytecode instruction as it is parsed.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
62 */
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
63 public static final int TRACELEVEL_STATE = 2;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
64
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
65 private final GraalCompilation compilation;
2875
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
66 private CompilerGraph graph;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
67
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
68 private final CiStatistics stats;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
69 private final RiRuntime runtime;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
70 private final RiMethod method;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
71 private final RiConstantPool constantPool;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
72
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
73 private final BytecodeStream stream; // the bytecode stream
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
74 private final LogStream log;
2875
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
75 private FrameStateBuilder frameState; // the current execution state
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
76
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
77 // bci-to-block mapping
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
78 private Block[] blockFromBci;
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
79 private ArrayList<Block> blockList;
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
80
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
81 private int nextBlockNumber;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
82
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
83 private Value methodSynchronizedObject;
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
84 private CiExceptionHandler syncHandler;
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
85
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
86 private Block unwindBlock;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
87 private Block returnBlock;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
88
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
89 // the worklist of blocks, sorted by depth first number
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
90 private final PriorityQueue<Block> workList = new PriorityQueue<Block>(10, new Comparator<Block>() {
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
91 public int compare(Block o1, Block o2) {
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
92 return o1.blockID - o2.blockID;
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
93 }
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
94 });
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
95
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
96 private Instruction lastInstr; // the last instruction added
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
97
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
98 private final Set<Block> blocksOnWorklist = new HashSet<Block>();
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
99 private final Set<Block> blocksVisited = new HashSet<Block>();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
100
2875
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
101 private final boolean createUnwind;
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
102
2586
421da5f53b5e more Op2 changes
Lukas Stadler <lukas.stadler@jku.at>
parents: 2582
diff changeset
103
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
104 /**
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
105 * Creates a new, initialized, {@code GraphBuilder} instance for a given compilation.
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
106 *
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
107 * @param compilation the compilation
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
108 * @param ir the IR to build the graph into
2602
0c6564c254af new node layout: BlockBegin, BlockEnd
Lukas Stadler <lukas.stadler@jku.at>
parents: 2600
diff changeset
109 * @param graph
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
110 */
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
111 public GraphBuilderPhase(GraalCompilation compilation, RiMethod method, boolean createUnwind) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
112 this.compilation = compilation;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
113
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
114 this.runtime = compilation.runtime;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
115 this.method = method;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
116 this.stats = compilation.stats;
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
117 this.log = GraalOptions.TraceBytecodeParserLevel > 0 ? new LogStream(TTY.out()) : null;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
118 this.stream = new BytecodeStream(method.code());
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
119
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
120 this.constantPool = runtime.getConstantPool(method);
2875
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
121 this.createUnwind = createUnwind;
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
122 }
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
123
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
124 @Override
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
125 protected void run(Graph graph) {
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
126 assert graph != null;
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
127 this.graph = (CompilerGraph) graph;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
128 this.frameState = new FrameStateBuilder(method, graph);
2875
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
129 build();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
130 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
131
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
132 /**
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
133 * Builds the graph for a the specified {@code IRScope}.
2866
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
134 *
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
135 * @param createUnwind setting this to true will always generate an unwind block, even if there is no exception
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
136 * handler and the method is not synchronized
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
137 */
2875
3570f1f7903e Changed GraphBuilder to inherit from Phase.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2874
diff changeset
138 private void build() {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
139 if (log != null) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
140 log.println();
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
141 log.println("Compiling " + method);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
142 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
143
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
144 // 2. compute the block map, setup exception handlers and get the entrypoint(s)
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
145 BlockMap blockMap = compilation.getBlockMap(method);
2675
bcd20d26d52d Refactoring of BlockMap so that it doesn't create BlockBegin objects, but maintains its own Block data structure
Christian.Wimmer@Oracle.com
parents: 2671
diff changeset
146
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
147 blockList = new ArrayList<Block>(blockMap.blocks);
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
148 blockFromBci = new Block[method.code().length];
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
149 for (int i = 0; i < blockList.size(); i++) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
150 int blockID = nextBlockNumber();
2749
36440e516e44 block entry instructions created on-demand
Lukas Stadler <lukas.stadler@jku.at>
parents: 2747
diff changeset
151 assert blockID == i;
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
152 Block block = blockList.get(i);
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
153 if (block.startBci >= 0) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
154 blockFromBci[block.startBci] = block;
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
155 }
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
156 }
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
157
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
158 // 1. create the start block
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
159 Block startBlock = nextBlock(Instruction.SYNCHRONIZATION_ENTRY_BCI);
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
160 markOnWorkList(startBlock);
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
161 lastInstr = createTarget(startBlock, frameState);
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
162 graph.start().setStart(lastInstr);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
163
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
164 if (isSynchronized(method.accessFlags())) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
165 // 4A.1 add a monitor enter to the start block
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
166 methodSynchronizedObject = synchronizedObject(frameState, method);
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
167 genMonitorEnter(methodSynchronizedObject, Instruction.SYNCHRONIZATION_ENTRY_BCI);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
168 // 4A.2 finish the start block
2746
05c92e53a50d merge and clone before connecting blocks
Lukas Stadler <lukas.stadler@jku.at>
parents: 2741
diff changeset
169 finishStartBlock(startBlock);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
170
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
171 // 4A.3 setup an exception handler to unlock the root method synchronized object
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
172 syncHandler = new CiExceptionHandler(0, method.code().length, Instruction.SYNCHRONIZATION_ENTRY_BCI, 0, null);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
173 } else {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
174 // 4B.1 simply finish the start block
2746
05c92e53a50d merge and clone before connecting blocks
Lukas Stadler <lukas.stadler@jku.at>
parents: 2741
diff changeset
175 finishStartBlock(startBlock);
2866
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
176
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
177 if (createUnwind) {
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
178 syncHandler = new CiExceptionHandler(0, method.code().length, Instruction.SYNCHRONIZATION_ENTRY_BCI, 0, null);
7f14e6b48a9c added dead code elimination
Lukas Stadler <lukas.stadler@jku.at>
parents: 2842
diff changeset
179 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
180 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
181
2519
f6125fb5bfbc Removed intrinsics.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2516
diff changeset
182 // 5. SKIPPED: look for intrinsics
f6125fb5bfbc Removed intrinsics.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2516
diff changeset
183
f6125fb5bfbc Removed intrinsics.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2516
diff changeset
184 // 6B.1 do the normal parsing
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
185 addToWorkList(blockFromBci[0]);
2519
f6125fb5bfbc Removed intrinsics.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2516
diff changeset
186 iterateAllBlocks();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
187
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
188 // remove Placeholders
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
189 for (Node n : graph.getNodes()) {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
190 if (n instanceof Placeholder) {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
191 Placeholder p = (Placeholder) n;
2790
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
192 assert p.blockPredecessors().size() == 1;
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
193 Node pred = p.blockPredecessors().get(0);
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
194 int predIndex = p.predecessorsIndex().get(0);
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
195 pred.successors().setAndClear(predIndex, p, 0);
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
196 p.delete();
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
197 }
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
198 }
2783
9bc0c2eb00d6 Made graph builder removal of BlockBegin work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2781
diff changeset
199
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
200 // remove FrameStates
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
201 for (Node n : graph.getNodes()) {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
202 if (n instanceof FrameState) {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
203 boolean delete = false;
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
204 if (n.usages().size() == 0 && n.predecessors().size() == 0) {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
205 delete = true;
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
206 }
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
207 if (delete) {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
208 n.delete();
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
209 }
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
210 }
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
211 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
212 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
213
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
214 private int nextBlockNumber() {
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
215 stats.blockCount++;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
216 return nextBlockNumber++;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
217 }
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
218
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
219 private Block nextBlock(int bci) {
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
220 Block block = new Block();
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
221 block.startBci = bci;
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
222 block.endBci = bci;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
223 block.blockID = nextBlockNumber();
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
224 return block;
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
225 }
2705
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
226
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
227 private Block unwindBlock() {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
228 if (unwindBlock == null) {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
229 unwindBlock = new Block();
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
230 unwindBlock.startBci = Instruction.SYNCHRONIZATION_ENTRY_BCI;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
231 unwindBlock.endBci = Instruction.SYNCHRONIZATION_ENTRY_BCI;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
232 unwindBlock.blockID = nextBlockNumber();
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
233 addToWorkList(unwindBlock);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
234 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
235 return unwindBlock;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
236 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
237
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
238 private Block returnBlock() {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
239 if (returnBlock == null) {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
240 returnBlock = new Block();
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
241 returnBlock.startBci = Instruction.SYNCHRONIZATION_ENTRY_BCI;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
242 returnBlock.endBci = Instruction.SYNCHRONIZATION_ENTRY_BCI;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
243 returnBlock.blockID = nextBlockNumber();
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
244 addToWorkList(returnBlock);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
245 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
246 return returnBlock;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
247 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
248
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
249 private void markOnWorkList(Block block) {
2705
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
250 blocksOnWorklist.add(block);
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
251 }
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
252
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
253 private boolean isOnWorkList(Block block) {
2705
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
254 return blocksOnWorklist.contains(block);
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
255 }
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
256
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
257 private void markVisited(Block block) {
2706
5a784215351a Removed WasVisited flag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2705
diff changeset
258 blocksVisited.add(block);
5a784215351a Removed WasVisited flag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2705
diff changeset
259 }
5a784215351a Removed WasVisited flag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2705
diff changeset
260
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
261 private boolean isVisited(Block block) {
2706
5a784215351a Removed WasVisited flag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2705
diff changeset
262 return blocksVisited.contains(block);
5a784215351a Removed WasVisited flag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2705
diff changeset
263 }
5a784215351a Removed WasVisited flag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2705
diff changeset
264
2746
05c92e53a50d merge and clone before connecting blocks
Lukas Stadler <lukas.stadler@jku.at>
parents: 2741
diff changeset
265 private void finishStartBlock(Block startBlock) {
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
266 assert bci() == 0;
2774
93fd92c9f8b0 Removed usage of stateAfter on BlockEnd instructions.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2773
diff changeset
267 Instruction target = createTargetAt(0, frameState);
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
268 appendGoto(target);
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
269 }
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
270
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
271 public void mergeOrClone(Block target, FrameStateAccess newState) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
272 Instruction first = target.firstInstruction;
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
273 if (target.isLoopHeader && isVisited(target)) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
274 first = ((LoopBegin) first).loopEnd();
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
275 }
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
276 assert first instanceof StateSplit;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
277
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
278 int bci = target.startBci;
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
279
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
280 FrameState existingState = ((StateSplit) first).stateBefore();
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
281
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
282 if (existingState == null) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
283 // copy state because it is modified
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
284 FrameState duplicate = newState.duplicate(bci);
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
285
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
286 // if the block is a loop header, insert all necessary phis
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
287 if (first instanceof LoopBegin && target.isLoopHeader) {
2793
d3fc4fe063bf Rename BlockBegin to Merge, remove some Block related member from it. Made CFGPrinter work with the Block class from schedule
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2791
diff changeset
288 assert first instanceof Merge;
d3fc4fe063bf Rename BlockBegin to Merge, remove some Block related member from it. Made CFGPrinter work with the Block class from schedule
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2791
diff changeset
289 insertLoopPhis((Merge) first, duplicate);
d3fc4fe063bf Rename BlockBegin to Merge, remove some Block related member from it. Made CFGPrinter work with the Block class from schedule
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2791
diff changeset
290 ((Merge) first).setStateBefore(duplicate);
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
291 } else {
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
292 ((StateSplit) first).setStateBefore(duplicate);
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
293 }
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
294 } else {
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
295 if (!GraalOptions.AssumeVerifiedBytecode && !existingState.isCompatibleWith(newState)) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
296 // stacks or locks do not match--bytecodes would not verify
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
297 TTY.println(existingState.toString());
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
298 TTY.println(newState.duplicate(0).toString());
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
299 throw new CiBailout("stack or locks do not match");
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
300 }
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
301 assert existingState.localsSize() == newState.localsSize();
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
302 assert existingState.stackSize() == newState.stackSize();
2768
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
303
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
304 if (first instanceof Placeholder) {
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
305 assert !target.isLoopHeader;
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
306 Merge merge = new Merge(graph);
2790
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
307
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
308 Placeholder p = (Placeholder) first;
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
309 assert p.next() == null;
50677668afe3 Towards making goto removal work.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2789
diff changeset
310 p.replace(merge);
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
311 target.firstInstruction = merge;
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
312 merge.setStateBefore(existingState);
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
313 first = merge;
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
314 }
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
315
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
316 existingState.merge((Merge) first, newState);
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
317 }
2768
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
318
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
319 for (int j = 0; j < frameState.localsSize() + frameState.stackSize(); ++j) {
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
320 if (frameState.valueAt(j) != null) {
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
321 assert !frameState.valueAt(j).isDeleted();
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
322 }
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
323 }
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
324 }
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
325
2793
d3fc4fe063bf Rename BlockBegin to Merge, remove some Block related member from it. Made CFGPrinter work with the Block class from schedule
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2791
diff changeset
326 private void insertLoopPhis(Merge merge, FrameState newState) {
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
327 int stackSize = newState.stackSize();
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
328 for (int i = 0; i < stackSize; i++) {
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
329 // always insert phis for the stack
2763
5e8a69041cd7 Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2757
diff changeset
330 Value x = newState.stackAt(i);
5e8a69041cd7 Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2757
diff changeset
331 if (x != null) {
5e8a69041cd7 Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2757
diff changeset
332 newState.setupPhiForStack(merge, i).addInput(x);
5e8a69041cd7 Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2757
diff changeset
333 }
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
334 }
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
335 int localsSize = newState.localsSize();
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
336 for (int i = 0; i < localsSize; i++) {
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
337 Value x = newState.localAt(i);
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
338 if (x != null) {
2763
5e8a69041cd7 Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2757
diff changeset
339 newState.setupPhiForLocal(merge, i).addInput(x);
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
340 }
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
341 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
342 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
343
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
344 public BytecodeStream stream() {
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
345 return stream;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
346 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
347
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
348 public int bci() {
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
349 return stream.currentBCI();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
350 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
351
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
352 private void loadLocal(int index, CiKind kind) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
353 frameState.push(kind, frameState.loadLocal(index));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
354 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
355
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
356 private void storeLocal(CiKind kind, int index) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
357 frameState.storeLocal(index, frameState.pop(kind));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
358 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
359
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
360 public boolean covers(RiExceptionHandler handler, int bci) {
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
361 return handler.startBCI() <= bci && bci < handler.endBCI();
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
362 }
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
363
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
364 public boolean isCatchAll(RiExceptionHandler handler) {
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
365 return handler.catchTypeCPI() == 0;
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
366 }
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
367
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
368 private Instruction handleException(Value exceptionObject, int bci) {
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
369 assert bci == Instruction.SYNCHRONIZATION_ENTRY_BCI || bci == bci() : "invalid bci";
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
370
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
371 RiExceptionHandler firstHandler = null;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
372 RiExceptionHandler[] exceptionHandlers = method.exceptionHandlers();
2564
274360f98f97 Remove inlining (2nd part) removed IRScope
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2563
diff changeset
373 // join with all potential exception handlers
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
374 if (exceptionHandlers != null) {
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
375 for (RiExceptionHandler handler : exceptionHandlers) {
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
376 // if the handler covers this bytecode index, add it to the list
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
377 if (covers(handler, bci)) {
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
378 firstHandler = handler;
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
379 break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
380 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
381 }
2564
274360f98f97 Remove inlining (2nd part) removed IRScope
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2563
diff changeset
382 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
383
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
384 if (firstHandler == null) {
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
385 firstHandler = syncHandler;
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
386 }
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
387
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
388 if (firstHandler != null) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
389 compilation.setHasExceptionHandlers();
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
390
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
391 Block dispatchBlock = null;
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
392 for (Block block : blockList) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
393 if (block instanceof ExceptionBlock) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
394 ExceptionBlock excBlock = (ExceptionBlock) block;
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
395 if (excBlock.handler == firstHandler) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
396 dispatchBlock = block;
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
397 break;
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
398 }
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
399 }
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
400 }
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
401 // if there's no dispatch block then the catch block needs to be a catch all
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
402 if (dispatchBlock == null) {
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
403 assert isCatchAll(firstHandler);
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
404 int handlerBCI = firstHandler.handlerBCI();
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
405 if (handlerBCI == Instruction.SYNCHRONIZATION_ENTRY_BCI) {
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
406 dispatchBlock = unwindBlock();
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
407 } else {
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
408 dispatchBlock = blockFromBci[handlerBCI];
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
409 }
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
410 }
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
411 FrameState entryState = frameState.duplicateWithEmptyStack(bci);
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
412
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
413 StateSplit entry = new Placeholder(graph);
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
414 entry.setStateBefore(entryState);
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
415
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
416 Instruction currentNext = entry;
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
417 Value currentExceptionObject = exceptionObject;
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
418 if (currentExceptionObject == null) {
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
419 ExceptionObject exception = new ExceptionObject(graph);
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
420 entry.setNext(exception);
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
421 currentNext = exception;
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
422 currentExceptionObject = exception;
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
423 }
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
424 FrameState stateWithException = entryState.duplicateModified(bci, CiKind.Void, currentExceptionObject);
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
425
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
426 Instruction successor = createTarget(dispatchBlock, stateWithException);
2836
a75ef246fab3 Removed last usage of anchor in the front-end.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2833
diff changeset
427 currentNext.setNext(successor);
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
428 return entry;
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
429 }
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
430 return null;
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
431 }
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
432
2657
4a6518c4d17d Removed need for base instruction. Cleanup.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2652
diff changeset
433 private void genLoadConstant(int cpi) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
434 Object con = constantPool.lookupConstant(cpi);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
435
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
436 if (con instanceof RiType) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
437 // this is a load of class constant which might be unresolved
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
438 RiType riType = (RiType) con;
2650
ccab1d5f345e Removed TestPatching option.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2649
diff changeset
439 if (!riType.isResolved()) {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
440 append(new Deoptimize(graph));
2671
d8601d421b96 New Deoptimize node, remove ResolveClass node and replace it with deoptimization
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2669
diff changeset
441 frameState.push(CiKind.Object, append(Constant.forObject(null, graph)));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
442 } else {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
443 frameState.push(CiKind.Object, append(new Constant(riType.getEncoding(Representation.JavaClass), graph)));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
444 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
445 } else if (con instanceof CiConstant) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
446 CiConstant constant = (CiConstant) con;
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
447 frameState.push(constant.kind.stackKind(), appendConstant(constant));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
448 } else {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
449 throw new Error("lookupConstant returned an object of incorrect type");
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
450 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
451 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
452
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
453 private void genLoadIndexed(CiKind kind) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
454 Value index = frameState.ipop();
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
455 Value array = frameState.apop();
2644
4694daa6af3a Removed CSE array length.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2643
diff changeset
456 Value length = append(new ArrayLength(array, graph));
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
457 Value v = append(new LoadIndexed(array, index, length, kind, graph));
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
458 frameState.push(kind.stackKind(), v);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
459 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
460
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
461 private void genStoreIndexed(CiKind kind) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
462 Value value = frameState.pop(kind.stackKind());
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
463 Value index = frameState.ipop();
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
464 Value array = frameState.apop();
2644
4694daa6af3a Removed CSE array length.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2643
diff changeset
465 Value length = append(new ArrayLength(array, graph));
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
466 StoreIndexed result = new StoreIndexed(array, index, length, kind, value, graph);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
467 append(result);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
468 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
469
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
470 private void stackOp(int opcode) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
471 switch (opcode) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
472 case POP: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
473 frameState.xpop();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
474 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
475 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
476 case POP2: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
477 frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
478 frameState.xpop();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
479 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
480 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
481 case DUP: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
482 Value w = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
483 frameState.xpush(w);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
484 frameState.xpush(w);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
485 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
486 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
487 case DUP_X1: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
488 Value w1 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
489 Value w2 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
490 frameState.xpush(w1);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
491 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
492 frameState.xpush(w1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
493 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
494 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
495 case DUP_X2: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
496 Value w1 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
497 Value w2 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
498 Value w3 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
499 frameState.xpush(w1);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
500 frameState.xpush(w3);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
501 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
502 frameState.xpush(w1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
503 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
504 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
505 case DUP2: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
506 Value w1 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
507 Value w2 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
508 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
509 frameState.xpush(w1);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
510 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
511 frameState.xpush(w1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
512 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
513 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
514 case DUP2_X1: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
515 Value w1 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
516 Value w2 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
517 Value w3 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
518 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
519 frameState.xpush(w1);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
520 frameState.xpush(w3);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
521 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
522 frameState.xpush(w1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
523 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
524 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
525 case DUP2_X2: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
526 Value w1 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
527 Value w2 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
528 Value w3 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
529 Value w4 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
530 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
531 frameState.xpush(w1);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
532 frameState.xpush(w4);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
533 frameState.xpush(w3);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
534 frameState.xpush(w2);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
535 frameState.xpush(w1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
536 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
537 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
538 case SWAP: {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
539 Value w1 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
540 Value w2 = frameState.xpop();
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
541 frameState.xpush(w1);
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
542 frameState.xpush(w2);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
543 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
544 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
545 default:
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
546 throw Util.shouldNotReachHere();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
547 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
548
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
549 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
550
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
551 private void genArithmeticOp(CiKind kind, int opcode) {
2622
91d3952f7eb7 Framestate work : using stateAFter and reducting the number of nodes with framestates. Intermediate state (does not pass tests)
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2621
diff changeset
552 genArithmeticOp(kind, opcode, false);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
553 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
554
2877
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2876 2874
diff changeset
555 private void genArithmeticOp(CiKind result, int opcode, boolean canTrap) {
2876
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
556 Value y = frameState.pop(result);
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
557 Value x = frameState.pop(result);
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
558 boolean isStrictFP = isStrict(method.accessFlags());
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
559 Arithmetic v;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
560 switch(opcode){
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
561 case IADD:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
562 case LADD: v = new IntegerAdd(result, x, y, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
563 case FADD:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
564 case DADD: v = new FloatAdd(result, x, y, isStrictFP, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
565 case ISUB:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
566 case LSUB: v = new IntegerSub(result, x, y, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
567 case FSUB:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
568 case DSUB: v = new FloatSub(result, x, y, isStrictFP, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
569 case IMUL:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
570 case LMUL: v = new IntegerMul(result, x, y, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
571 case FMUL:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
572 case DMUL: v = new FloatMul(result, x, y, isStrictFP, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
573 case IDIV:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
574 case LDIV: v = new IntegerDiv(result, x, y, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
575 case FDIV:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
576 case DDIV: v = new FloatDiv(result, x, y, isStrictFP, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
577 case IREM:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
578 case LREM: v = new IntegerRem(result, x, y, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
579 case FREM:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
580 case DREM: v = new FloatRem(result, x, y, isStrictFP, graph); break;
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
581 default:
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
582 throw new CiBailout("should not reach");
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
583 }
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
584 Value result1 = append(v);
2867
Lukas Stadler <lukas.stadler@jku.at>
parents: 2866 2858
diff changeset
585 if (canTrap) {
Lukas Stadler <lukas.stadler@jku.at>
parents: 2866 2858
diff changeset
586 append(new ValueAnchor(result1, graph));
Lukas Stadler <lukas.stadler@jku.at>
parents: 2866 2858
diff changeset
587 }
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
588 frameState.push(result, result1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
589 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
590
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
591 private void genNegateOp(CiKind kind) {
2852
c6bdec623ef9 Move TypeCHeck to floating nodes, rename Nodes to aboid using an *Op suffix
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2850
diff changeset
592 frameState.push(kind, append(new Negate(frameState.pop(kind), graph)));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
593 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
594
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
595 private void genShiftOp(CiKind kind, int opcode) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
596 Value s = frameState.ipop();
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
597 Value x = frameState.pop(kind);
2865
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
598 Shift v;
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
599 switch(opcode){
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
600 case ISHL:
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
601 case LSHL: v = new LeftShift(kind, x, s, graph); break;
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
602 case ISHR:
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
603 case LSHR: v = new RightShift(kind, x, s, graph); break;
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
604 case IUSHR:
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
605 case LUSHR: v = new UnsignedRightShift(kind, x, s, graph); break;
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
606 default:
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
607 throw new CiBailout("should not reach");
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
608 }
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2862
diff changeset
609 frameState.push(kind, append(v));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
610 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
611
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
612 private void genLogicOp(CiKind kind, int opcode) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
613 Value y = frameState.pop(kind);
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
614 Value x = frameState.pop(kind);
2853
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
615 Logic v;
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
616 switch(opcode){
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
617 case IAND:
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
618 case LAND: v = new And(kind, x, y, graph); break;
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
619 case IOR:
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
620 case LOR: v = new Or(kind, x, y, graph); break;
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
621 case IXOR:
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
622 case LXOR: v = new Xor(kind, x, y, graph); break;
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
623 default:
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
624 throw new CiBailout("should not reach");
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
625 }
0635ba16afe4 Reintroduce Logic subclasses, creating some Canonicalization related classes
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2852
diff changeset
626 frameState.push(kind, append(v));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
627 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
628
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
629 private void genCompareOp(CiKind kind, int opcode, CiKind resultKind) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
630 Value y = frameState.pop(kind);
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
631 Value x = frameState.pop(kind);
2862
45422967cbcf Rename Materialize => NormalizeCompare
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2858
diff changeset
632 Value value = append(new NormalizeCompare(opcode, resultKind, x, y, graph));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
633 if (!resultKind.isVoid()) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
634 frameState.ipush(value);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
635 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
636 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
637
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
638 private void genConvert(int opcode, CiKind from, CiKind to) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
639 CiKind tt = to.stackKind();
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
640 frameState.push(tt, append(new Convert(opcode, frameState.pop(from.stackKind()), tt, graph)));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
641 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
642
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
643 private void genIncrement() {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
644 int index = stream().readLocalIndex();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
645 int delta = stream().readIncrement();
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
646 Value x = frameState.localAt(index);
2594
092e628ddd5d changed Constant and Convert, more StoreIndexed changes
Lukas Stadler <lukas.stadler@jku.at>
parents: 2592
diff changeset
647 Value y = append(Constant.forInt(delta, graph));
2876
7d7cf33f8466 Subclasses for arithmetic
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2865
diff changeset
648 frameState.storeLocal(index, append(new IntegerAdd(CiKind.Int, x, y, graph)));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
649 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
650
2645
b2c1e959be46 Clean up around BlockBegin / StdEntry.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2644
diff changeset
651 private void genGoto(int fromBCI, int toBCI) {
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
652 appendGoto(createTargetAt(toBCI, frameState));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
653 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
654
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
655 private void ifNode(Value x, Condition cond, Value y) {
2768
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
656 assert !x.isDeleted() && !y.isDeleted();
2862
45422967cbcf Rename Materialize => NormalizeCompare
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2858
diff changeset
657 If ifNode = new If(new Compare(x, cond, y, graph), graph);
2768
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
658 append(ifNode);
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
659 Instruction tsucc = createTargetAt(stream().readBranchDest(), frameState);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
660 ifNode.setBlockSuccessor(0, tsucc);
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
661 Instruction fsucc = createTargetAt(stream().nextBCI(), frameState);
2768
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
662 ifNode.setBlockSuccessor(1, fsucc);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
663 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
664
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
665 private void genIfZero(Condition cond) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
666 Value y = appendConstant(CiConstant.INT_0);
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
667 Value x = frameState.ipop();
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
668 ifNode(x, cond, y);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
669 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
670
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
671 private void genIfNull(Condition cond) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
672 Value y = appendConstant(CiConstant.NULL_OBJECT);
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
673 Value x = frameState.apop();
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
674 ifNode(x, cond, y);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
675 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
676
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
677 private void genIfSame(CiKind kind, Condition cond) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
678 Value y = frameState.pop(kind);
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
679 Value x = frameState.pop(kind);
2768
43ffa0e47a46 Towards removing stateAfter on BlockEnd.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2763
diff changeset
680 assert !x.isDeleted() && !y.isDeleted();
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
681 ifNode(x, cond, y);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
682 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
683
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
684 private void genThrow(int bci) {
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
685 Value exception = frameState.apop();
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
686 append(new NullCheck(exception, graph));
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
687
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
688 Instruction entry = handleException(exception, bci);
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
689 if (entry != null) {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
690 append(entry);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
691 } else {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
692 frameState.clearStack();
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
693 frameState.apush(exception);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
694 appendGoto(createTarget(unwindBlock(), frameState));
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
695 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
696 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
697
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
698 private void genCheckCast() {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
699 int cpi = stream().readCPI();
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
700 RiType type = constantPool.lookupType(cpi, CHECKCAST);
2671
d8601d421b96 New Deoptimize node, remove ResolveClass node and replace it with deoptimization
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2669
diff changeset
701 boolean isInitialized = type.isResolved();
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
702 Value typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, type, isInitialized, cpi);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
703 Value object = frameState.apop();
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
704 if (typeInstruction != null) {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
705 frameState.apush(append(new CheckCast(type, typeInstruction, object, graph)));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
706 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
707 frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
708 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
709 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
710
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
711 private void genInstanceOf() {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
712 int cpi = stream().readCPI();
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
713 RiType type = constantPool.lookupType(cpi, INSTANCEOF);
2671
d8601d421b96 New Deoptimize node, remove ResolveClass node and replace it with deoptimization
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2669
diff changeset
714 boolean isInitialized = type.isResolved();
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
715 Value typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, type, isInitialized, cpi);
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
716 Value object = frameState.apop();
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
717 if (typeInstruction != null) {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
718 frameState.ipush(append(new InstanceOf(type, typeInstruction, object, graph)));
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
719 } else {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
720 frameState.ipush(appendConstant(CiConstant.INT_0));
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
721 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
722 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
723
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
724 void genNewInstance(int cpi) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
725 RiType type = constantPool.lookupType(cpi, NEW);
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
726 if (type.isResolved()) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
727 NewInstance n = new NewInstance(type, cpi, constantPool, graph);
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
728 frameState.apush(append(n));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
729 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
730 append(new Deoptimize(graph));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
731 frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
2634
4dd0573f510b FrameState fixes.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2633
diff changeset
732 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
733 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
734
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
735 private void genNewTypeArray(int typeCode) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
736 CiKind kind = CiKind.fromArrayTypeCode(typeCode);
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
737 RiType elementType = runtime.asRiType(kind);
2634
4dd0573f510b FrameState fixes.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2633
diff changeset
738 NewTypeArray nta = new NewTypeArray(frameState.ipop(), elementType, graph);
4dd0573f510b FrameState fixes.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2633
diff changeset
739 frameState.apush(append(nta));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
740 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
741
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
742 private void genNewObjectArray(int cpi) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
743 RiType type = constantPool.lookupType(cpi, ANEWARRAY);
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
744 Value length = frameState.ipop();
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
745 if (type.isResolved()) {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
746 NewArray n = new NewObjectArray(type, length, graph);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
747 frameState.apush(append(n));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
748 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
749 append(new Deoptimize(graph));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
750 frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
2634
4dd0573f510b FrameState fixes.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2633
diff changeset
751 }
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
752
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
753 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
754
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
755 private void genNewMultiArray(int cpi) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
756 RiType type = constantPool.lookupType(cpi, MULTIANEWARRAY);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
757 int rank = stream().readUByte(bci() + 3);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
758 Value[] dims = new Value[rank];
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
759 for (int i = rank - 1; i >= 0; i--) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
760 dims[i] = frameState.ipop();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
761 }
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
762 if (type.isResolved()) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
763 NewArray n = new NewMultiArray(type, dims, cpi, constantPool, graph);
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
764 frameState.apush(append(n));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
765 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
766 append(new Deoptimize(graph));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
767 frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
768 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
769 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
770
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
771 private void genGetField(int cpi, RiField field) {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
772 CiKind kind = field.kind();
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
773 Value receiver = frameState.apop();
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
774 if (field.isResolved()) {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
775 LoadField load = new LoadField(receiver, field, graph);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
776 appendOptimizedLoadField(kind, load);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
777 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
778 append(new Deoptimize(graph));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
779 frameState.push(kind.stackKind(), append(Constant.defaultForKind(kind, graph)));
2634
4dd0573f510b FrameState fixes.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2633
diff changeset
780 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
781 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
782
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
783 private void genPutField(int cpi, RiField field) {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
784 Value value = frameState.pop(field.kind().stackKind());
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
785 Value receiver = frameState.apop();
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
786 if (field.isResolved()) {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
787 StoreField store = new StoreField(receiver, field, value, graph);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
788 appendOptimizedStoreField(store);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
789 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
790 append(new Deoptimize(graph));
2634
4dd0573f510b FrameState fixes.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2633
diff changeset
791 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
792 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
793
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
794 private void genGetStatic(int cpi, RiField field) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
795 RiType holder = field.holder();
2650
ccab1d5f345e Removed TestPatching option.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2649
diff changeset
796 boolean isInitialized = field.isResolved();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
797 CiConstant constantValue = null;
2533
c480605ef068 Removed canonicalizer.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2521
diff changeset
798 if (isInitialized) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
799 constantValue = field.constantValue(null);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
800 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
801 if (constantValue != null) {
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
802 frameState.push(constantValue.kind.stackKind(), appendConstant(constantValue));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
803 } else {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
804 Value container = genTypeOrDeopt(RiType.Representation.StaticFields, holder, isInitialized, cpi);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
805 CiKind kind = field.kind();
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
806 if (container != null) {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
807 LoadField load = new LoadField(container, field, graph);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
808 appendOptimizedLoadField(kind, load);
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
809 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
810 append(new Deoptimize(graph));
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
811 frameState.push(kind.stackKind(), append(Constant.defaultForKind(kind, graph)));
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
812 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
813 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
814 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
815
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
816 private void genPutStatic(int cpi, RiField field) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
817 RiType holder = field.holder();
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
818 Value container = genTypeOrDeopt(RiType.Representation.StaticFields, holder, field.isResolved(), cpi);
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
819 Value value = frameState.pop(field.kind().stackKind());
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
820 if (container != null) {
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
821 StoreField store = new StoreField(container, field, value, graph);
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
822 appendOptimizedStoreField(store);
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
823 } else {
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
824 append(new Deoptimize(graph));
2671
d8601d421b96 New Deoptimize node, remove ResolveClass node and replace it with deoptimization
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2669
diff changeset
825 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
826 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
827
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
828 private Value genTypeOrDeopt(RiType.Representation representation, RiType holder, boolean initialized, int cpi) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
829 if (initialized) {
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
830 return appendConstant(holder.getEncoding(representation));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
831 } else {
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
832 append(new Deoptimize(graph));
2673
98447ab8bd83 Create less nodes in case of Deopt
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2671
diff changeset
833 return null;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
834 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
835 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
836
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
837 private void appendOptimizedStoreField(StoreField store) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
838 append(store);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
839 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
840
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
841 private void appendOptimizedLoadField(CiKind kind, LoadField load) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
842 // append the load to the instruction
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
843 Value optimized = append(load);
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
844 frameState.push(kind.stackKind(), optimized);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
845 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
846
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
847 private void genInvokeStatic(RiMethod target, int cpi, RiConstantPool constantPool) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
848 RiType holder = target.holder();
2650
ccab1d5f345e Removed TestPatching option.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2649
diff changeset
849 boolean isInitialized = target.isResolved() && holder.isInitialized();
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
850 if (!isInitialized && GraalOptions.ResolveClassBeforeStaticInvoke) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
851 // Re-use the same resolution code as for accessing a static field. Even though
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
852 // the result of resolution is not used by the invocation (only the side effect
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
853 // of initialization is required), it can be commoned with static field accesses.
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
854 genTypeOrDeopt(RiType.Representation.StaticFields, holder, isInitialized, cpi);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
855 }
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
856 Value[] args = frameState.popArguments(target.signature().argumentSlots(false));
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
857 appendInvoke(INVOKESTATIC, target, args, cpi, constantPool);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
858 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
859
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
860 private void genInvokeInterface(RiMethod target, int cpi, RiConstantPool constantPool) {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
861 Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
862 genInvokeIndirect(INVOKEINTERFACE, target, args, cpi, constantPool);
2533
c480605ef068 Removed canonicalizer.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2521
diff changeset
863
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
864 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
865
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
866 private void genInvokeVirtual(RiMethod target, int cpi, RiConstantPool constantPool) {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
867 Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
868 genInvokeIndirect(INVOKEVIRTUAL, target, args, cpi, constantPool);
2533
c480605ef068 Removed canonicalizer.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2521
diff changeset
869
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
870 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
871
2649
62306ff0ccc2 Removed check for direct compare.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2647
diff changeset
872 private void genInvokeSpecial(RiMethod target, RiType knownHolder, int cpi, RiConstantPool constantPool) {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
873 Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
874 invokeDirect(target, args, knownHolder, cpi, constantPool);
2533
c480605ef068 Removed canonicalizer.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2521
diff changeset
875
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
876 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
877
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
878 private void genInvokeIndirect(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
879 Value receiver = args[0];
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
880 // attempt to devirtualize the call
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
881 if (target.isResolved()) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
882 RiType klass = target.holder();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
883
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
884 // 0. check for trivial cases
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
885 if (target.canBeStaticallyBound() && !isAbstract(target.accessFlags())) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
886 // check for trivial cases (e.g. final methods, nonvirtual methods)
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
887 invokeDirect(target, args, target.holder(), cpi, constantPool);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
888 return;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
889 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
890 // 1. check if the exact type of the receiver can be determined
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
891 RiType exact = getExactType(klass, receiver);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
892 if (exact != null && exact.isResolved()) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
893 // either the holder class is exact, or the receiver object has an exact type
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
894 invokeDirect(exact.resolveMethodImpl(target), args, exact, cpi, constantPool);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
895 return;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
896 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
897 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
898 // devirtualization failed, produce an actual invokevirtual
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
899 appendInvoke(opcode, target, args, cpi, constantPool);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
900 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
901
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
902 private CiKind returnKind(RiMethod target) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
903 return target.signature().returnKind();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
904 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
905
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
906 private void invokeDirect(RiMethod target, Value[] args, RiType knownHolder, int cpi, RiConstantPool constantPool) {
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
907 appendInvoke(INVOKESPECIAL, target, args, cpi, constantPool);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
908 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
909
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
910 private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
911 CiKind resultType = returnKind(target);
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
912 Invoke invoke = new Invoke(bci(), opcode, resultType.stackKind(), args, target, target.signature().returnType(method.holder()), graph);
2716
c1a9bf38da28 Removed bci from the Instruction class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2715
diff changeset
913 Value result = appendWithBCI(invoke);
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
914 invoke.setExceptionEdge(handleException(null, bci()));
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
915 frameState.pushReturn(resultType, result);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
916 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
917
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
918 private RiType getExactType(RiType staticType, Value receiver) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
919 RiType exact = staticType.exactType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
920 if (exact == null) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
921 exact = receiver.exactType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
922 if (exact == null) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
923 if (receiver.isConstant()) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
924 exact = runtime.getTypeOf(receiver.asConstant());
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
925 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
926 if (exact == null) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
927 RiType declared = receiver.declaredType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
928 exact = declared == null || !declared.isResolved() ? null : declared.exactType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
929 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
930 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
931 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
932 return exact;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
933 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
934
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
935 private void callRegisterFinalizer() {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
936 Value receiver = frameState.loadLocal(0);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
937 RiType declaredType = receiver.declaredType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
938 RiType receiverType = declaredType;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
939 RiType exactType = receiver.exactType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
940 if (exactType == null && declaredType != null) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
941 exactType = declaredType.exactType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
942 }
2771
056e392d63d4 Connected local variables to start node. No more need for frame state to emit locals.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2769
diff changeset
943 if (exactType == null && receiver instanceof Local && ((Local) receiver).index() == 0) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
944 // the exact type isn't known, but the receiver is parameter 0 => use holder
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
945 receiverType = method.holder();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
946 exactType = receiverType.exactType();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
947 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
948 boolean needsCheck = true;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
949 if (exactType != null) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
950 // we have an exact type
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
951 needsCheck = exactType.hasFinalizer();
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
952 } else {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
953 // if either the declared type of receiver or the holder can be assumed to have no finalizers
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
954 if (declaredType != null && !declaredType.hasFinalizableSubclass()) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
955 if (compilation.recordNoFinalizableSubclassAssumption(declaredType)) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
956 needsCheck = false;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
957 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
958 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
959
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
960 if (receiverType != null && !receiverType.hasFinalizableSubclass()) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
961 if (compilation.recordNoFinalizableSubclassAssumption(receiverType)) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
962 needsCheck = false;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
963 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
964 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
965 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
966
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
967 if (needsCheck) {
2519
f6125fb5bfbc Removed intrinsics.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2516
diff changeset
968 // append a call to the finalizer registration
2671
d8601d421b96 New Deoptimize node, remove ResolveClass node and replace it with deoptimization
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2669
diff changeset
969 append(new RegisterFinalizer(frameState.loadLocal(0), frameState.create(bci()), graph));
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
970 GraalMetrics.InlinedFinalizerChecks++;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
971 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
972 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
973
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
974 private void genReturn(Value x) {
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
975 frameState.clearStack();
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
976 if (x != null) {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
977 frameState.push(x.kind, x);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
978 }
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
979 appendGoto(createTarget(returnBlock(), frameState));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
980 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
981
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
982 private void genMonitorEnter(Value x, int bci) {
2644
4694daa6af3a Removed CSE array length.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2643
diff changeset
983 int lockNumber = frameState.locksSize();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
984 MonitorAddress lockAddress = null;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
985 if (runtime.sizeOfBasicObjectLock() != 0) {
2602
0c6564c254af new node layout: BlockBegin, BlockEnd
Lukas Stadler <lukas.stadler@jku.at>
parents: 2600
diff changeset
986 lockAddress = new MonitorAddress(lockNumber, graph);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
987 append(lockAddress);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
988 }
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
989 MonitorEnter monitorEnter = new MonitorEnter(x, lockAddress, lockNumber, graph);
2716
c1a9bf38da28 Removed bci from the Instruction class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2715
diff changeset
990 appendWithBCI(monitorEnter);
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
991 frameState.lock(x);
2640
9e30cf6dcf96 More frame state fixes. All jtt tests passing now again.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2639
diff changeset
992 if (bci == Instruction.SYNCHRONIZATION_ENTRY_BCI) {
9e30cf6dcf96 More frame state fixes. All jtt tests passing now again.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2639
diff changeset
993 monitorEnter.setStateAfter(frameState.create(0));
9e30cf6dcf96 More frame state fixes. All jtt tests passing now again.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2639
diff changeset
994 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
995 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
996
2784
e62cfea1c134 Simplified fillSyncHandler. Fixed LIRGenerator visitUnwind.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2783
diff changeset
997 private void genMonitorExit(Value x) {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
998 int lockNumber = frameState.locksSize() - 1;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
999 if (lockNumber < 0) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1000 throw new CiBailout("monitor stack underflow");
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1001 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1002 MonitorAddress lockAddress = null;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1003 if (runtime.sizeOfBasicObjectLock() != 0) {
2602
0c6564c254af new node layout: BlockBegin, BlockEnd
Lukas Stadler <lukas.stadler@jku.at>
parents: 2600
diff changeset
1004 lockAddress = new MonitorAddress(lockNumber, graph);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1005 append(lockAddress);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1006 }
2716
c1a9bf38da28 Removed bci from the Instruction class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2715
diff changeset
1007 appendWithBCI(new MonitorExit(x, lockAddress, lockNumber, graph));
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1008 frameState.unlock();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1009 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1010
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
1011 private void genJsr(int dest) {
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1012 throw new CiBailout("jsr/ret not supported");
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1013 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1014
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
1015 private void genRet(int localIndex) {
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1016 throw new CiBailout("jsr/ret not supported");
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1017 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1018
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
1019 private void genTableswitch() {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1020 int bci = bci();
2747
84f4c7dceb14 fixes for mergeOrClone move
Lukas Stadler <lukas.stadler@jku.at>
parents: 2746
diff changeset
1021 Value value = frameState.ipop();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1022 BytecodeTableSwitch ts = new BytecodeTableSwitch(stream(), bci);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1023 int max = ts.numberOfCases();
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1024 List<Instruction> list = new ArrayList<Instruction>(max + 1);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1025 List<Integer> offsetList = new ArrayList<Integer>(max + 1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1026 for (int i = 0; i < max; i++) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1027 // add all successors to the successor list
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1028 int offset = ts.offsetAt(i);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1029 list.add(null);
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1030 offsetList.add(offset);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1031 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1032 int offset = ts.defaultOffset();
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1033 list.add(null);
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1034 offsetList.add(offset);
2774
93fd92c9f8b0 Removed usage of stateAfter on BlockEnd instructions.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2773
diff changeset
1035 TableSwitch tableSwitch = new TableSwitch(value, list, ts.lowKey(), graph);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1036 for (int i = 0; i < offsetList.size(); ++i) {
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1037 tableSwitch.setBlockSuccessor(i, createTargetAt(bci + offsetList.get(i), frameState));
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1038 }
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1039 append(tableSwitch);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1040 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1041
2647
0bf54306c139 Removed accessor workaround.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2645
diff changeset
1042 private void genLookupswitch() {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1043 int bci = bci();
2747
84f4c7dceb14 fixes for mergeOrClone move
Lukas Stadler <lukas.stadler@jku.at>
parents: 2746
diff changeset
1044 Value value = frameState.ipop();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1045 BytecodeLookupSwitch ls = new BytecodeLookupSwitch(stream(), bci);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1046 int max = ls.numberOfCases();
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1047 List<Instruction> list = new ArrayList<Instruction>(max + 1);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1048 List<Integer> offsetList = new ArrayList<Integer>(max + 1);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1049 int[] keys = new int[max];
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1050 for (int i = 0; i < max; i++) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1051 // add all successors to the successor list
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1052 int offset = ls.offsetAt(i);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1053 list.add(null);
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1054 offsetList.add(offset);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1055 keys[i] = ls.keyAt(i);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1056 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1057 int offset = ls.defaultOffset();
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1058 list.add(null);
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1059 offsetList.add(offset);
2774
93fd92c9f8b0 Removed usage of stateAfter on BlockEnd instructions.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2773
diff changeset
1060 LookupSwitch lookupSwitch = new LookupSwitch(value, list, keys, graph);
2769
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1061 for (int i = 0; i < offsetList.size(); ++i) {
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1062 lookupSwitch.setBlockSuccessor(i, createTargetAt(bci + offsetList.get(i), frameState));
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1063 }
dd6419f4bfe2 Fixed several issues with incorrect predecessor count/order. One known issue around exception dispatch remaining in fop.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2768
diff changeset
1064 append(lookupSwitch);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1065 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1066
2709
7b7dbe19fafb Remove all unresolved cases from HotspotXirGenerator, use more explicit Deopt, Deopt to lastState instead of stateBefore
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2684
diff changeset
1067 private Value appendConstant(CiConstant constant) {
2805
c3f64b66fc78 Towards removing the next pointer from Constant and ArithmeticOp
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2799
diff changeset
1068 return append(new Constant(constant, graph));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1069 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1070
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1071 private Value append(Instruction x) {
2716
c1a9bf38da28 Removed bci from the Instruction class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2715
diff changeset
1072 return appendWithBCI(x);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1073 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1074
2805
c3f64b66fc78 Towards removing the next pointer from Constant and ArithmeticOp
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2799
diff changeset
1075 private Value append(Value v) {
c3f64b66fc78 Towards removing the next pointer from Constant and ArithmeticOp
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2799
diff changeset
1076 return v;
c3f64b66fc78 Towards removing the next pointer from Constant and ArithmeticOp
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2799
diff changeset
1077 }
c3f64b66fc78 Towards removing the next pointer from Constant and ArithmeticOp
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2799
diff changeset
1078
2716
c1a9bf38da28 Removed bci from the Instruction class.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2715
diff changeset
1079 private Value appendWithBCI(Instruction x) {
2833
1cd59ca9ac86 Removed Throw HIR instruction. Removed special handling for exceptions in register allocator.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2830
diff changeset
1080 assert x.predecessors().size() == 0 : "instruction should not have been appended yet";
2820
2b8ef0a06391 Clean up in the graph builder.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2805
diff changeset
1081 assert lastInstr.next() == null : "cannot append instruction to instruction which isn't end (" + lastInstr + "->" + lastInstr.next() + ")";
2b8ef0a06391 Clean up in the graph builder.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2805
diff changeset
1082 lastInstr.setNext(x);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1083
2820
2b8ef0a06391 Clean up in the graph builder.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2805
diff changeset
1084 lastInstr = x;
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
1085 if (++stats.nodeCount >= GraalOptions.MaximumInstructionCount) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1086 // bailout if we've exceeded the maximum inlining size
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1087 throw new CiBailout("Method and/or inlining is too large");
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1088 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1089
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1090 return x;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1091 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1092
2750
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1093 private Instruction createTargetAt(int bci, FrameStateAccess stateAfter) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1094 return createTarget(blockFromBci[bci], stateAfter);
2750
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1095 }
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1096
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1097 private Instruction createTarget(Block block, FrameStateAccess stateAfter) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1098 assert block != null && stateAfter != null;
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1099 assert block.isLoopHeader || block.firstInstruction == null || block.firstInstruction.next() == null : "non-loop block must be iterated after all its predecessors";
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1100
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1101 if (block.isExceptionEntry) {
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1102 assert stateAfter.stackSize() == 1;
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1103 }
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1104
2750
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1105 if (block.firstInstruction == null) {
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1106 if (block.isLoopHeader) {
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1107 // block.firstInstruction = new Merge(block.startBci, graph);
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1108
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1109 LoopBegin loopBegin = new LoopBegin(graph);
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1110 LoopEnd loopEnd = new LoopEnd(graph);
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1111 loopEnd.setLoopBegin(loopBegin);
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1112 block.firstInstruction = loopBegin;
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1113 } else {
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1114 block.firstInstruction = new Placeholder(graph);
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1115 }
2750
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1116 }
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1117 mergeOrClone(block, stateAfter);
2750
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1118 addToWorkList(block);
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1119
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1120 if (block.firstInstruction instanceof LoopBegin && isVisited(block)) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1121 return ((LoopBegin) block.firstInstruction).loopEnd();
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1122 } else {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1123 return block.firstInstruction;
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1124 }
2750
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1125 }
6048da340364 less references to BlockBegin in BlockEnd instructions
Lukas Stadler <lukas.stadler@jku.at>
parents: 2749
diff changeset
1126
2652
6d19b4f476db Removed more OSR handling stuff.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2650
diff changeset
1127 private Value synchronizedObject(FrameStateAccess state, RiMethod target) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1128 if (isStatic(target.accessFlags())) {
2594
092e628ddd5d changed Constant and Convert, more StoreIndexed changes
Lukas Stadler <lukas.stadler@jku.at>
parents: 2592
diff changeset
1129 Constant classConstant = new Constant(target.holder().getEncoding(Representation.JavaClass), graph);
2805
c3f64b66fc78 Towards removing the next pointer from Constant and ArithmeticOp
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2799
diff changeset
1130 return append(classConstant);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1131 } else {
2652
6d19b4f476db Removed more OSR handling stuff.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2650
diff changeset
1132 return state.localAt(0);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1133 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1134 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1135
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1136 private void iterateAllBlocks() {
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1137 Block block;
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1138 while ((block = removeFromWorkList()) != null) {
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
1139
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
1140 // remove blocks that have no predecessors by the time it their bytecodes are parsed
2755
80b024e75b29 small fix for dead blocks
Lukas Stadler <lukas.stadler@jku.at>
parents: 2752
diff changeset
1141 if (block.firstInstruction == null) {
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1142 markVisited(block);
2707
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
1143 continue;
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
1144 }
7ed72769d51a exception handling related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2676
diff changeset
1145
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1146 if (!isVisited(block)) {
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1147 markVisited(block);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1148 // now parse the block
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1149 frameState.initializeFrom(((StateSplit) block.firstInstruction).stateBefore());
2746
05c92e53a50d merge and clone before connecting blocks
Lukas Stadler <lukas.stadler@jku.at>
parents: 2741
diff changeset
1150 lastInstr = block.firstInstruction;
2781
bda5972a40a5 remove unnecessary BlockBegin nodes in frontend
Lukas Stadler <lukas.stadler@jku.at>
parents: 2776
diff changeset
1151 assert block.firstInstruction.next() == null : "instructions already appended at block " + block.blockID;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1152
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1153 if (block == returnBlock) {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1154 createReturnBlock(block);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1155 } else if (block == unwindBlock) {
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1156 createUnwindBlock(block);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1157 } else if (block instanceof ExceptionBlock) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1158 createExceptionDispatch((ExceptionBlock) block);
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1159 } else {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1160 iterateBytecodesForBlock(block);
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1161 }
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1162 }
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1163 }
2799
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1164 for (Block b : blocksVisited) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1165 if (b.isLoopHeader) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1166 LoopBegin begin = (LoopBegin) b.firstInstruction;
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1167 LoopEnd end = begin.loopEnd();
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1168
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1169 // This can happen with degenerated loops like this one:
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1170 // for (;;) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1171 // try {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1172 // break;
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1173 // } catch (UnresolvedException iioe) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1174 // }
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1175 // }
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1176 if (end.stateBefore() != null) {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1177 begin.stateBefore().merge(begin, end.stateBefore());
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1178 } else {
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1179 end.delete();
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1180 Merge merge = new Merge(graph);
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1181 merge.successors().setAndClear(merge.nextIndex(), begin, begin.nextIndex());
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1182 begin.replace(merge);
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1183 }
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1184 }
e1dad0edd57a first part of loop reworking
Lukas Stadler <lukas.stadler@jku.at>
parents: 2796
diff changeset
1185 }
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1186 }
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1187
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1188 private void createUnwindBlock(Block block) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1189 if (Modifier.isSynchronized(method.accessFlags())) {
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1190 genMonitorExit(methodSynchronizedObject);
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1191 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1192 append(graph.createUnwind(frameState.apop()));
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1193 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1194
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1195 private void createReturnBlock(Block block) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1196 if (method.isConstructor() && method.holder().superType() == null) {
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1197 callRegisterFinalizer();
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1198 }
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1199 CiKind returnKind = method.signature().returnKind().stackKind();
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1200 Value x = returnKind == CiKind.Void ? null : frameState.pop(returnKind);
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1201 assert frameState.stackSize() == 0;
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1202
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1203 if (Modifier.isSynchronized(method.accessFlags())) {
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1204 genMonitorExit(methodSynchronizedObject);
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1205 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1206 append(graph.createReturn(x));
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1207 }
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1208
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1209 private void createExceptionDispatch(ExceptionBlock block) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1210 if (block.handler == null) {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1211 assert frameState.stackSize() == 1 : "only exception object expected on stack, actual size: " + frameState.stackSize();
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1212 createUnwindBlock(block);
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1213 } else {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1214 assert frameState.stackSize() == 1;
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1215
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1216 Block nextBlock = block.next == null ? unwindBlock() : block.next;
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1217 if (block.handler.catchType().isResolved()) {
2830
706047ee5f2e Removed ExceptionHandler class because of clean up.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2829
diff changeset
1218 Instruction catchSuccessor = createTarget(blockFromBci[block.handler.handlerBCI()], frameState);
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1219 Instruction nextDispatch = createTarget(nextBlock, frameState);
2774
93fd92c9f8b0 Removed usage of stateAfter on BlockEnd instructions.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2773
diff changeset
1220 append(new ExceptionDispatch(frameState.stackAt(0), catchSuccessor, nextDispatch, block.handler.catchType(), graph));
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1221 } else {
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1222 Deoptimize deopt = new Deoptimize(graph);
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1223 deopt.setMessage("unresolved " + block.handler.catchType().name());
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1224 append(deopt);
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1225 Instruction nextDispatch = createTarget(nextBlock, frameState);
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1226 appendGoto(nextDispatch);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1227 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1228 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1229 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1230
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1231 private void appendGoto(Instruction target) {
2820
2b8ef0a06391 Clean up in the graph builder.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2805
diff changeset
1232 lastInstr.setNext(target);
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1233 }
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1234
2775
3b73b230b86b Removed more stateAfter usages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2774
diff changeset
1235 private void iterateBytecodesForBlock(Block block) {
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1236 assert frameState != null;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1237
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1238 stream.setBCI(block.startBci);
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1239
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1240 int endBCI = stream.endBCI();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1241 boolean blockStart = true;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1242
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1243 int bci = block.startBci;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1244 while (bci < endBCI) {
2773
27512ea6bbcb exception dispatch simplification:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2771
diff changeset
1245 Block nextBlock = blockFromBci[bci];
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1246 if (nextBlock != null && nextBlock != block) {
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1247 assert !nextBlock.isExceptionEntry;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1248 // we fell through to the next block, add a goto and break
2840
75e0d39833a0 new CompilerGraph, create only one Return and one Unwind per CompilerGraph
Lukas Stadler <lukas.stadler@jku.at>
parents: 2837
diff changeset
1249 appendGoto(createTarget(nextBlock, frameState));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1250 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1251 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1252 // read the opcode
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1253 int opcode = stream.currentBC();
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1254
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1255 traceState();
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1256 traceInstruction(bci, opcode, blockStart);
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1257 processBytecode(bci, opcode);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1258
2822
530366123e46 Invoke is a block end
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2796
diff changeset
1259 if (Schedule.isBlockEnd(lastInstr) || lastInstr.next() != null) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1260 break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1261 }
2788
df4c5254c5cc Towards goto removal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2785
diff changeset
1262
2640
9e30cf6dcf96 More frame state fixes. All jtt tests passing now again.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2639
diff changeset
1263 stream.next();
9e30cf6dcf96 More frame state fixes. All jtt tests passing now again.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2639
diff changeset
1264 bci = stream.currentBCI();
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1265 if (lastInstr instanceof StateSplit) {
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1266 StateSplit stateSplit = (StateSplit) lastInstr;
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1267 if (stateSplit.stateAfter() == null && stateSplit.needsStateAfter()) {
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1268 stateSplit.setStateAfter(frameState.create(bci));
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1269 }
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1270 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1271 blockStart = false;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1272 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1273 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1274
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1275 private void traceState() {
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
1276 if (GraalOptions.TraceBytecodeParserLevel >= TRACELEVEL_STATE && !TTY.isSuppressed()) {
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1277 log.println(String.format("| state [nr locals = %d, stack depth = %d, method = %s]", frameState.localsSize(), frameState.stackSize(), method));
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1278 for (int i = 0; i < frameState.localsSize(); ++i) {
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1279 Value value = frameState.localAt(i);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1280 log.println(String.format("| local[%d] = %-8s : %s", i, value == null ? "bogus" : value.kind.javaName, value));
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1281 }
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1282 for (int i = 0; i < frameState.stackSize(); ++i) {
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1283 Value value = frameState.stackAt(i);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1284 log.println(String.format("| stack[%d] = %-8s : %s", i, value == null ? "bogus" : value.kind.javaName, value));
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1285 }
2611
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1286 for (int i = 0; i < frameState.locksSize(); ++i) {
bd235cb4375a FrameState cleanup: split into FrameStateBuilder and fixed-size FrameState, removed MutableFrameState
Lukas Stadler <lukas.stadler@jku.at>
parents: 2603
diff changeset
1287 Value value = frameState.lockAt(i);
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1288 log.println(String.format("| lock[%d] = %-8s : %s", i, value == null ? "bogus" : value.kind.javaName, value));
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1289 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1290 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1291 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1292
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1293 private void processBytecode(int bci, int opcode) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1294 int cpi;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1295
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1296 // Checkstyle: stop
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1297 switch (opcode) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1298 case NOP : /* nothing to do */ break;
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1299 case ACONST_NULL : frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1300 case ICONST_M1 : frameState.ipush(appendConstant(CiConstant.INT_MINUS_1)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1301 case ICONST_0 : frameState.ipush(appendConstant(CiConstant.INT_0)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1302 case ICONST_1 : frameState.ipush(appendConstant(CiConstant.INT_1)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1303 case ICONST_2 : frameState.ipush(appendConstant(CiConstant.INT_2)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1304 case ICONST_3 : frameState.ipush(appendConstant(CiConstant.INT_3)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1305 case ICONST_4 : frameState.ipush(appendConstant(CiConstant.INT_4)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1306 case ICONST_5 : frameState.ipush(appendConstant(CiConstant.INT_5)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1307 case LCONST_0 : frameState.lpush(appendConstant(CiConstant.LONG_0)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1308 case LCONST_1 : frameState.lpush(appendConstant(CiConstant.LONG_1)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1309 case FCONST_0 : frameState.fpush(appendConstant(CiConstant.FLOAT_0)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1310 case FCONST_1 : frameState.fpush(appendConstant(CiConstant.FLOAT_1)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1311 case FCONST_2 : frameState.fpush(appendConstant(CiConstant.FLOAT_2)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1312 case DCONST_0 : frameState.dpush(appendConstant(CiConstant.DOUBLE_0)); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1313 case DCONST_1 : frameState.dpush(appendConstant(CiConstant.DOUBLE_1)); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1314 case BIPUSH : frameState.ipush(appendConstant(CiConstant.forInt(stream.readByte()))); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1315 case SIPUSH : frameState.ipush(appendConstant(CiConstant.forInt(stream.readShort()))); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1316 case LDC : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1317 case LDC_W : // fall through
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1318 case LDC2_W : genLoadConstant(stream.readCPI()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1319 case ILOAD : loadLocal(stream.readLocalIndex(), CiKind.Int); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1320 case LLOAD : loadLocal(stream.readLocalIndex(), CiKind.Long); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1321 case FLOAD : loadLocal(stream.readLocalIndex(), CiKind.Float); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1322 case DLOAD : loadLocal(stream.readLocalIndex(), CiKind.Double); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1323 case ALOAD : loadLocal(stream.readLocalIndex(), CiKind.Object); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1324 case ILOAD_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1325 case ILOAD_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1326 case ILOAD_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1327 case ILOAD_3 : loadLocal(opcode - ILOAD_0, CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1328 case LLOAD_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1329 case LLOAD_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1330 case LLOAD_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1331 case LLOAD_3 : loadLocal(opcode - LLOAD_0, CiKind.Long); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1332 case FLOAD_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1333 case FLOAD_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1334 case FLOAD_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1335 case FLOAD_3 : loadLocal(opcode - FLOAD_0, CiKind.Float); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1336 case DLOAD_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1337 case DLOAD_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1338 case DLOAD_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1339 case DLOAD_3 : loadLocal(opcode - DLOAD_0, CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1340 case ALOAD_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1341 case ALOAD_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1342 case ALOAD_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1343 case ALOAD_3 : loadLocal(opcode - ALOAD_0, CiKind.Object); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1344 case IALOAD : genLoadIndexed(CiKind.Int ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1345 case LALOAD : genLoadIndexed(CiKind.Long ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1346 case FALOAD : genLoadIndexed(CiKind.Float ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1347 case DALOAD : genLoadIndexed(CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1348 case AALOAD : genLoadIndexed(CiKind.Object); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1349 case BALOAD : genLoadIndexed(CiKind.Byte ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1350 case CALOAD : genLoadIndexed(CiKind.Char ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1351 case SALOAD : genLoadIndexed(CiKind.Short ); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1352 case ISTORE : storeLocal(CiKind.Int, stream.readLocalIndex()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1353 case LSTORE : storeLocal(CiKind.Long, stream.readLocalIndex()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1354 case FSTORE : storeLocal(CiKind.Float, stream.readLocalIndex()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1355 case DSTORE : storeLocal(CiKind.Double, stream.readLocalIndex()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1356 case ASTORE : storeLocal(CiKind.Object, stream.readLocalIndex()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1357 case ISTORE_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1358 case ISTORE_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1359 case ISTORE_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1360 case ISTORE_3 : storeLocal(CiKind.Int, opcode - ISTORE_0); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1361 case LSTORE_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1362 case LSTORE_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1363 case LSTORE_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1364 case LSTORE_3 : storeLocal(CiKind.Long, opcode - LSTORE_0); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1365 case FSTORE_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1366 case FSTORE_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1367 case FSTORE_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1368 case FSTORE_3 : storeLocal(CiKind.Float, opcode - FSTORE_0); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1369 case DSTORE_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1370 case DSTORE_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1371 case DSTORE_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1372 case DSTORE_3 : storeLocal(CiKind.Double, opcode - DSTORE_0); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1373 case ASTORE_0 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1374 case ASTORE_1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1375 case ASTORE_2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1376 case ASTORE_3 : storeLocal(CiKind.Object, opcode - ASTORE_0); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1377 case IASTORE : genStoreIndexed(CiKind.Int ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1378 case LASTORE : genStoreIndexed(CiKind.Long ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1379 case FASTORE : genStoreIndexed(CiKind.Float ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1380 case DASTORE : genStoreIndexed(CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1381 case AASTORE : genStoreIndexed(CiKind.Object); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1382 case BASTORE : genStoreIndexed(CiKind.Byte ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1383 case CASTORE : genStoreIndexed(CiKind.Char ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1384 case SASTORE : genStoreIndexed(CiKind.Short ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1385 case POP : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1386 case POP2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1387 case DUP : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1388 case DUP_X1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1389 case DUP_X2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1390 case DUP2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1391 case DUP2_X1 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1392 case DUP2_X2 : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1393 case SWAP : stackOp(opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1394 case IADD : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1395 case ISUB : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1396 case IMUL : genArithmeticOp(CiKind.Int, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1397 case IDIV : // fall through
2622
91d3952f7eb7 Framestate work : using stateAFter and reducting the number of nodes with framestates. Intermediate state (does not pass tests)
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2621
diff changeset
1398 case IREM : genArithmeticOp(CiKind.Int, opcode, true); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1399 case LADD : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1400 case LSUB : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1401 case LMUL : genArithmeticOp(CiKind.Long, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1402 case LDIV : // fall through
2622
91d3952f7eb7 Framestate work : using stateAFter and reducting the number of nodes with framestates. Intermediate state (does not pass tests)
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2621
diff changeset
1403 case LREM : genArithmeticOp(CiKind.Long, opcode, true); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1404 case FADD : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1405 case FSUB : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1406 case FMUL : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1407 case FDIV : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1408 case FREM : genArithmeticOp(CiKind.Float, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1409 case DADD : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1410 case DSUB : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1411 case DMUL : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1412 case DDIV : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1413 case DREM : genArithmeticOp(CiKind.Double, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1414 case INEG : genNegateOp(CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1415 case LNEG : genNegateOp(CiKind.Long); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1416 case FNEG : genNegateOp(CiKind.Float); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1417 case DNEG : genNegateOp(CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1418 case ISHL : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1419 case ISHR : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1420 case IUSHR : genShiftOp(CiKind.Int, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1421 case IAND : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1422 case IOR : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1423 case IXOR : genLogicOp(CiKind.Int, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1424 case LSHL : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1425 case LSHR : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1426 case LUSHR : genShiftOp(CiKind.Long, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1427 case LAND : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1428 case LOR : // fall through
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1429 case LXOR : genLogicOp(CiKind.Long, opcode); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1430 case IINC : genIncrement(); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1431 case I2L : genConvert(opcode, CiKind.Int , CiKind.Long ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1432 case I2F : genConvert(opcode, CiKind.Int , CiKind.Float ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1433 case I2D : genConvert(opcode, CiKind.Int , CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1434 case L2I : genConvert(opcode, CiKind.Long , CiKind.Int ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1435 case L2F : genConvert(opcode, CiKind.Long , CiKind.Float ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1436 case L2D : genConvert(opcode, CiKind.Long , CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1437 case F2I : genConvert(opcode, CiKind.Float , CiKind.Int ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1438 case F2L : genConvert(opcode, CiKind.Float , CiKind.Long ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1439 case F2D : genConvert(opcode, CiKind.Float , CiKind.Double); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1440 case D2I : genConvert(opcode, CiKind.Double, CiKind.Int ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1441 case D2L : genConvert(opcode, CiKind.Double, CiKind.Long ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1442 case D2F : genConvert(opcode, CiKind.Double, CiKind.Float ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1443 case I2B : genConvert(opcode, CiKind.Int , CiKind.Byte ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1444 case I2C : genConvert(opcode, CiKind.Int , CiKind.Char ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1445 case I2S : genConvert(opcode, CiKind.Int , CiKind.Short ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1446 case LCMP : genCompareOp(CiKind.Long, opcode, CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1447 case FCMPL : genCompareOp(CiKind.Float, opcode, CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1448 case FCMPG : genCompareOp(CiKind.Float, opcode, CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1449 case DCMPL : genCompareOp(CiKind.Double, opcode, CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1450 case DCMPG : genCompareOp(CiKind.Double, opcode, CiKind.Int); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1451 case IFEQ : genIfZero(Condition.EQ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1452 case IFNE : genIfZero(Condition.NE); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1453 case IFLT : genIfZero(Condition.LT); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1454 case IFGE : genIfZero(Condition.GE); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1455 case IFGT : genIfZero(Condition.GT); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1456 case IFLE : genIfZero(Condition.LE); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1457 case IF_ICMPEQ : genIfSame(CiKind.Int, Condition.EQ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1458 case IF_ICMPNE : genIfSame(CiKind.Int, Condition.NE); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1459 case IF_ICMPLT : genIfSame(CiKind.Int, Condition.LT); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1460 case IF_ICMPGE : genIfSame(CiKind.Int, Condition.GE); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1461 case IF_ICMPGT : genIfSame(CiKind.Int, Condition.GT); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1462 case IF_ICMPLE : genIfSame(CiKind.Int, Condition.LE); break;
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1463 case IF_ACMPEQ : genIfSame(frameState.peekKind(), Condition.EQ); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1464 case IF_ACMPNE : genIfSame(frameState.peekKind(), Condition.NE); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1465 case GOTO : genGoto(stream.currentBCI(), stream.readBranchDest()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1466 case JSR : genJsr(stream.readBranchDest()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1467 case RET : genRet(stream.readLocalIndex()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1468 case TABLESWITCH : genTableswitch(); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1469 case LOOKUPSWITCH : genLookupswitch(); break;
2616
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1470 case IRETURN : genReturn(frameState.ipop()); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1471 case LRETURN : genReturn(frameState.lpop()); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1472 case FRETURN : genReturn(frameState.fpop()); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1473 case DRETURN : genReturn(frameState.dpop()); break;
3558ca7088c0 FrameState and Graphviz changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2615
diff changeset
1474 case ARETURN : genReturn(frameState.apop()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1475 case RETURN : genReturn(null ); break;
2842
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1476 case GETSTATIC : cpi = stream.readCPI(); genGetStatic(cpi, constantPool.lookupField(cpi, opcode)); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1477 case PUTSTATIC : cpi = stream.readCPI(); genPutStatic(cpi, constantPool.lookupField(cpi, opcode)); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1478 case GETFIELD : cpi = stream.readCPI(); genGetField(cpi, constantPool.lookupField(cpi, opcode)); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1479 case PUTFIELD : cpi = stream.readCPI(); genPutField(cpi, constantPool.lookupField(cpi, opcode)); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1480 case INVOKEVIRTUAL : cpi = stream.readCPI(); genInvokeVirtual(constantPool.lookupMethod(cpi, opcode), cpi, constantPool); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1481 case INVOKESPECIAL : cpi = stream.readCPI(); genInvokeSpecial(constantPool.lookupMethod(cpi, opcode), null, cpi, constantPool); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1482 case INVOKESTATIC : cpi = stream.readCPI(); genInvokeStatic(constantPool.lookupMethod(cpi, opcode), cpi, constantPool); break;
7596ae867a7b basic inlining passes all tests, including optimistic inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 2840
diff changeset
1483 case INVOKEINTERFACE: cpi = stream.readCPI(); genInvokeInterface(constantPool.lookupMethod(cpi, opcode), cpi, constantPool); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1484 case NEW : genNewInstance(stream.readCPI()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1485 case NEWARRAY : genNewTypeArray(stream.readLocalIndex()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1486 case ANEWARRAY : genNewObjectArray(stream.readCPI()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1487 case ARRAYLENGTH : genArrayLength(); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1488 case ATHROW : genThrow(stream.currentBCI()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1489 case CHECKCAST : genCheckCast(); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1490 case INSTANCEOF : genInstanceOf(); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1491 case MONITORENTER : genMonitorEnter(frameState.apop(), stream.currentBCI()); break;
2784
e62cfea1c134 Simplified fillSyncHandler. Fixed LIRGenerator visitUnwind.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2783
diff changeset
1492 case MONITOREXIT : genMonitorExit(frameState.apop()); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1493 case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1494 case IFNULL : genIfNull(Condition.EQ); break;
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1495 case IFNONNULL : genIfNull(Condition.NE); break;
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1496 case GOTO_W : genGoto(stream.currentBCI(), stream.readFarBranchDest()); break;
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1497 case JSR_W : genJsr(stream.readFarBranchDest()); break;
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1498 case BREAKPOINT:
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1499 throw new CiBailout("concurrent setting of breakpoint");
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1500 default:
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1501 throw new CiBailout("Unsupported opcode " + opcode + " (" + nameOf(opcode) + ") [bci=" + bci + "]");
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1502 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1503 // Checkstyle: resume
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1504 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1505
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1506 private void traceInstruction(int bci, int opcode, boolean blockStart) {
2888
224412c24426 Changed C1X=>Graal and c1x=>graal in Java code.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2881
diff changeset
1507 if (GraalOptions.TraceBytecodeParserLevel >= TRACELEVEL_INSTRUCTIONS && !TTY.isSuppressed()) {
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1508 StringBuilder sb = new StringBuilder(40);
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1509 sb.append(blockStart ? '+' : '|');
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1510 if (bci < 10) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1511 sb.append(" ");
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1512 } else if (bci < 100) {
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1513 sb.append(' ');
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1514 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1515 sb.append(bci).append(": ").append(Bytecodes.nameOf(opcode));
2741
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1516 for (int i = bci + 1; i < stream.nextBCI(); ++i) {
a3cd5eb68837 more GraphBuilder cleanup, moved mergeOrClone to GraphBuilder
Lukas Stadler <lukas.stadler@jku.at>
parents: 2735
diff changeset
1517 sb.append(' ').append(stream.readUByte(i));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1518 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1519 log.println(sb.toString());
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1520 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1521 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1522
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1523 private void genArrayLength() {
2628
569228710be8 More FrameState work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2622
diff changeset
1524 frameState.ipush(append(new ArrayLength(frameState.apop(), graph)));
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1525 }
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1526
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1527 /**
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1528 * Adds a block to the worklist, if it is not already in the worklist.
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1529 * This method will keep the worklist topologically stored (i.e. the lower
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1530 * DFNs are earlier in the list).
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1531 * @param block the block to add to the work list
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1532 */
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1533 private void addToWorkList(Block block) {
2705
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
1534 if (!isOnWorkList(block)) {
d669ab61c7c7 Removed IsOnWorklistFlag
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2703
diff changeset
1535 markOnWorkList(block);
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1536 sortIntoWorkList(block);
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1537 }
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1538 }
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1539
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1540 private void sortIntoWorkList(Block top) {
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1541 workList.offer(top);
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1542 }
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1543
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1544 /**
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1545 * Removes the next block from the worklist. The list is sorted topologically, so the
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1546 * block with the lowest depth first number in the list will be removed and returned.
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1547 * @return the next block from the worklist; {@code null} if there are no blocks
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1548 * in the worklist
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1549 */
2730
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1550 private Block removeFromWorkList() {
027adfafd47e first batch of GraphBuilder changes to remove dependencies on BlockBegin
Lukas Stadler <lukas.stadler@jku.at>
parents: 2724
diff changeset
1551 return workList.poll();
2566
d524ad648049 Finish remove inlining (removed ScopeData), remove JSR support
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2565
diff changeset
1552 }
2507
9ec15d6914ca Pull over of compiler from maxine repository.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
diff changeset
1553 }