annotate graal/com.oracle.max.graal.compiler/src/com/sun/c1x/graph/Inlining.java @ 2872:0341b6424579

Project renaming.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 08 Jun 2011 08:42:25 +0200
parents graal/GraalCompiler/src/com/sun/c1x/graph/Inlining.java@6d24c27902a2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2868
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
1 /*
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
4 *
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
7 * published by the Free Software Foundation.
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
8 *
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
13 * accompanied this code).
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
14 *
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
18 *
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
21 * questions.
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
22 */
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
23 package com.sun.c1x.graph;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
24
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
25 import java.lang.reflect.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
26 import java.util.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
27
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
28 import com.oracle.graal.graph.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
29 import com.sun.c1x.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
30 import com.sun.c1x.ir.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
31 import com.sun.c1x.value.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
32 import com.sun.cri.ci.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
33 import com.sun.cri.ri.*;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
34
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
35
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
36 public class Inlining extends Phase {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
37
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
38 private final C1XCompilation compilation;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
39 private final IR ir;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
40
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
41 private final Queue<Invoke> invokes = new ArrayDeque<Invoke>();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
42 private final Queue<RiMethod> methods = new ArrayDeque<RiMethod>();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
43 private int inliningSize;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
44
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
45 public Inlining(C1XCompilation compilation, IR ir) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
46 this.compilation = compilation;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
47 this.ir = ir;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
48 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
49
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
50 private void addToQueue(Invoke invoke, RiMethod method) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
51 invokes.add(invoke);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
52 methods.add(method);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
53 inliningSize += method.code().length;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
54 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
55
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
56 @Override
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
57 protected void run(Graph graph) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
58 if (!C1XOptions.Inline) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
59 return;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
60 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
61
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
62 inliningSize = compilation.method.code().length;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
63 int iterations = C1XOptions.MaximumRecursiveInlineLevel;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
64 do {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
65 for (Node node : graph.getNodes()) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
66 if (node instanceof Invoke) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
67 Invoke invoke = (Invoke) node;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
68 RiMethod target = invoke.target;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
69 if (!checkInliningConditions(invoke) || !target.isResolved() || Modifier.isNative(target.accessFlags())) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
70 continue;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
71 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
72 if (target.canBeStaticallyBound()) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
73 if (checkInliningConditions(invoke.target)) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
74 addToQueue(invoke, invoke.target);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
75 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
76 } else {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
77 RiMethod concrete = invoke.target.holder().uniqueConcreteMethod(invoke.target);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
78 if (concrete != null && concrete.isResolved() && !Modifier.isNative(concrete.accessFlags())) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
79 if (checkInliningConditions(concrete)) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
80 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
81 System.out.println("registering concrete method assumption...");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
82 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
83 compilation.assumptions.recordConcreteMethod(invoke.target, concrete);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
84 addToQueue(invoke, concrete);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
85 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
86 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
87 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
88 if (inliningSize > C1XOptions.MaximumInstructionCount) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
89 break;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
90 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
91 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
92 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
93
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
94 assert invokes.size() == methods.size();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
95 if (invokes.isEmpty()) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
96 break;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
97 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
98
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
99 Invoke invoke;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
100 while ((invoke = invokes.poll()) != null) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
101 RiMethod method = methods.remove();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
102 inlineMethod(invoke, method);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
103 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
104 DeadCodeElimination dce = new DeadCodeElimination();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
105 dce.apply(graph);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
106 if (dce.deletedNodeCount > 0) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
107 ir.verifyAndPrint("After dead code elimination");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
108 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
109 ir.verifyAndPrint("After inlining iteration");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
110
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
111 if (inliningSize > C1XOptions.MaximumInstructionCount) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
112 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
113 System.out.println("inlining stopped: MaximumInstructionCount reached");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
114 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
115 break;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
116 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
117 } while(--iterations > 0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
118 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
119
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
120 private boolean checkInliningConditions(Invoke invoke) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
121 String name = invoke.id() + ": " + CiUtil.format("%H.%n(%p):%r", invoke.target, false);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
122 if (invoke.predecessors().size() == 0) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
123 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
124 System.out.println("not inlining " + name + " because the invoke is dead code");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
125 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
126 return false;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
127 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
128 return true;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
129 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
130
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
131 private boolean checkInliningConditions(RiMethod method) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
132 String name = null;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
133 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
134 name = CiUtil.format("%H.%n(%p):%r", method, false) + " (" + method.code().length + " bytes)";
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
135 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
136 if (method.code().length > C1XOptions.MaximumInlineSize) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
137 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
138 System.out.println("not inlining " + name + " because of code size");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
139 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
140 return false;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
141 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
142 if (!method.holder().isInitialized()) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
143 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
144 System.out.println("not inlining " + name + " because of non-initialized class");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
145 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
146 return false;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
147 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
148 return true;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
149 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
150
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
151 private void inlineMethod(Invoke invoke, RiMethod method) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
152 String name = invoke.id() + ": " + CiUtil.format("%H.%n(%p):%r", method, false) + " (" + method.code().length + " bytes)";
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
153 FrameState stateAfter = invoke.stateAfter();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
154 Instruction exceptionEdge = invoke.exceptionEdge();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
155
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
156 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
157 System.out.printf("Building graph for %s, locals: %d, stack: %d\n", name, method.maxLocals(), method.maxStackSize());
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
158 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
159
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
160 CompilerGraph graph = new CompilerGraph();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
161 new GraphBuilder(compilation, method, graph).build(true);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
162
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
163 boolean withReceiver = !Modifier.isStatic(method.accessFlags());
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
164
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
165 int argumentCount = method.signature().argumentCount(false);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
166 Value[] parameters = new Value[argumentCount + (withReceiver ? 1 : 0)];
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
167 int slot = withReceiver ? 1 : 0;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
168 int param = withReceiver ? 1 : 0;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
169 for (int i = 0; i < argumentCount; i++) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
170 parameters[param++] = invoke.argument(slot);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
171 slot += method.signature().argumentKindAt(i).sizeInSlots();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
172 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
173 if (withReceiver) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
174 parameters[0] = invoke.argument(0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
175 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
176
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
177 HashMap<Node, Node> replacements = new HashMap<Node, Node>();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
178 ArrayList<Node> nodes = new ArrayList<Node>();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
179 ArrayList<Node> frameStates = new ArrayList<Node>();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
180 Return returnNode = null;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
181 Unwind unwindNode = null;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
182 StartNode startNode = graph.start();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
183 for (Node node : graph.getNodes()) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
184 if (node != null) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
185 if (node instanceof StartNode) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
186 assert startNode == node;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
187 } else if (node instanceof Local) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
188 replacements.put(node, parameters[((Local) node).index()]);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
189 } else {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
190 nodes.add(node);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
191 if (node instanceof Return) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
192 returnNode = (Return) node;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
193 } else if (node instanceof Unwind) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
194 unwindNode = (Unwind) node;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
195 } else if (node instanceof FrameState) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
196 frameStates.add(node);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
197 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
198 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
199 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
200 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
201
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
202 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
203 ir.printGraph("Subgraph " + CiUtil.format("%H.%n(%p):%r", method, false), graph);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
204 System.out.println("inlining " + name + ": " + frameStates.size() + " frame states, " + nodes.size() + " nodes");
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
205 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
206
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
207 assert invoke.predecessors().size() == 1 : "size: " + invoke.predecessors().size();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
208 Instruction pred;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
209 if (withReceiver) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
210 pred = new NullCheck(parameters[0], compilation.graph);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
211 } else {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
212 pred = new Merge(compilation.graph);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
213 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
214 invoke.predecessors().get(0).successors().replace(invoke, pred);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
215 replacements.put(startNode, pred);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
216
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
217 Map<Node, Node> duplicates = compilation.graph.addDuplicate(nodes, replacements);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
218
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
219 if (returnNode != null) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
220 List<Node> usages = new ArrayList<Node>(invoke.usages());
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
221 for (Node usage : usages) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
222 if (returnNode.result() instanceof Local) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
223 usage.inputs().replace(invoke, replacements.get(returnNode.result()));
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
224 } else {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
225 usage.inputs().replace(invoke, duplicates.get(returnNode.result()));
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
226 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
227 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
228 Node returnDuplicate = duplicates.get(returnNode);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
229 returnDuplicate.inputs().clearAll();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
230
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
231 assert returnDuplicate.predecessors().size() == 1;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
232 Node returnPred = returnDuplicate.predecessors().get(0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
233 int index = returnDuplicate.predecessorsIndex().get(0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
234 returnPred.successors().setAndClear(index, invoke, 0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
235 returnDuplicate.delete();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
236 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
237
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
238 // if (invoke.next() instanceof Merge) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
239 // ((Merge) invoke.next()).removePhiPredecessor(invoke);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
240 // }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
241 // invoke.successors().clearAll();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
242 invoke.inputs().clearAll();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
243 invoke.setExceptionEdge(null);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
244 // invoke.delete();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
245
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
246
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
247 if (exceptionEdge != null) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
248 if (unwindNode != null) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
249 assert unwindNode.predecessors().size() == 1;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
250 assert exceptionEdge.successors().size() == 1;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
251 ExceptionObject obj = (ExceptionObject) exceptionEdge;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
252
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
253 List<Node> usages = new ArrayList<Node>(obj.usages());
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
254 for (Node usage : usages) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
255 if (replacements.containsKey(unwindNode.exception())) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
256 usage.inputs().replace(obj, replacements.get(unwindNode.exception()));
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
257 } else {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
258 usage.inputs().replace(obj, duplicates.get(unwindNode.exception()));
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
259 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
260 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
261 Node unwindDuplicate = duplicates.get(unwindNode);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
262 unwindDuplicate.inputs().clearAll();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
263
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
264 assert unwindDuplicate.predecessors().size() == 1;
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
265 Node unwindPred = unwindDuplicate.predecessors().get(0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
266 int index = unwindDuplicate.predecessorsIndex().get(0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
267 unwindPred.successors().setAndClear(index, obj, 0);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
268
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
269 obj.inputs().clearAll();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
270 obj.delete();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
271 unwindDuplicate.delete();
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
272
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
273 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
274 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
275
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
276 // adjust all frame states that were copied
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
277 if (frameStates.size() > 0) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
278 FrameState outerFrameState = stateAfter.duplicateModified(invoke.bci, invoke.kind);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
279 for (Node frameState : frameStates) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
280 ((FrameState) duplicates.get(frameState)).setOuterFrameState(outerFrameState);
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
281 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
282 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
283
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
284 if (C1XOptions.TraceInlining) {
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
285 ir.verifyAndPrint("After inlining " + CiUtil.format("%H.%n(%p):%r", method, false));
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
286 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
287 }
6d24c27902a2 turned inlining into a phase, some node cloning fixes, added NodeWorklist
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
288 }