annotate graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java @ 3046:f9e045cd2c23

Merge, add some edge spliting around loopbegin when necessary
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Fri, 17 Jun 2011 14:53:07 +0200
parents 183389909fe3 6c95d57cb1e2
children fe7145755a91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
1 /*
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
4 *
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
8 *
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
13 * accompanied this code).
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
14 *
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
18 *
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
21 * questions.
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
22 */
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
23 package com.oracle.max.graal.compiler.phases;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
24
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
25 import java.util.*;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
26
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
27 import com.oracle.max.graal.compiler.ir.*;
3046
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
28 import com.oracle.max.graal.compiler.util.*;
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
29 import com.oracle.max.graal.compiler.value.*;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
30 import com.oracle.max.graal.graph.*;
2986
ed63c8695fad Fix LoopCounter merging
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2984
diff changeset
31 import com.sun.cri.ci.*;
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
32
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
33
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
34 public class LoopPhase extends Phase {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
35
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
36 @Override
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
37 protected void run(Graph graph) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
38 List<Node> nodes = new ArrayList<Node>(graph.getNodes());
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
39 for (Node n : nodes) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
40 if (n instanceof LoopBegin) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
41 doLoop((LoopBegin) n);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
42 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
43 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
44 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
45
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
46 private void doLoop(LoopBegin loopBegin) {
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
47 NodeBitMap loopNodes = computeLoopNodes(loopBegin);
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
48 List<LoopCounter> counters = findLoopCounters(loopBegin, loopNodes);
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
49 mergeLoopCounters(counters, loopBegin);
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
50 }
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
51
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
52 private void mergeLoopCounters(List<LoopCounter> counters, LoopBegin loopBegin) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
53 Graph graph = loopBegin.graph();
3046
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
54 FrameState stateAfter = loopBegin.stateAfter();
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
55 LoopCounter[] acounters = counters.toArray(new LoopCounter[counters.size()]);
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
56 for (int i = 0; i < acounters.length; i++) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
57 LoopCounter c1 = acounters[i];
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
58 if (c1 == null) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
59 continue;
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
60 }
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
61 for (int j = i + 1; j < acounters.length; j++) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
62 LoopCounter c2 = acounters[j];
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
63 if (c2 != null && c1.stride().valueEqual(c2.stride())) {
3046
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
64 boolean c1InCompare = Util.filter(c1.usages(), Compare.class).size() > 0;
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
65 boolean c2inCompare = Util.filter(c2.usages(), Compare.class).size() > 0;
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
66 if (c2inCompare && !c1InCompare) {
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
67 c1 = acounters[j];
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
68 c2 = acounters[i];
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
69 acounters[i] = c2;
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
70 acounters[j] = c1;
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
71 }
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
72 boolean c2InFramestate = stateAfter != null ? stateAfter.inputs().contains(c2) : false;
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
73 acounters[j] = null;
2986
ed63c8695fad Fix LoopCounter merging
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2984
diff changeset
74 CiKind kind = c1.kind;
3046
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
75 if (c2InFramestate) {
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
76 IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
77 IntegerAdd addStride = new IntegerAdd(kind, sub, c1.stride(), graph);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
78 IntegerAdd add = new IntegerAdd(kind, c1, addStride, graph);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
79 Phi phi = new Phi(kind, loopBegin, graph); // TODO (gd) assumes order on loopBegin preds
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
80 phi.addInput(c2.init());
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
81 phi.addInput(add);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
82 c2.replace(phi);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
83 } else {
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
84 IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
85 IntegerAdd add = new IntegerAdd(kind, c1, sub, graph);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
86 c2.replace(add);
f9e045cd2c23 Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 3042 3000
diff changeset
87 }
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
88 }
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
89 }
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
90 }
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
91 }
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
92
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
93 private List<LoopCounter> findLoopCounters(LoopBegin loopBegin, NodeBitMap loopNodes) {
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
94 LoopEnd loopEnd = loopBegin.loopEnd();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
95 List<Node> usages = new ArrayList<Node>(loopBegin.usages());
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
96 List<LoopCounter> counters = new LinkedList<LoopCounter>();
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
97 for (Node usage : usages) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
98 if (usage instanceof Phi) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
99 Phi phi = (Phi) usage;
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
100 if (phi.valueCount() == 2) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
101 Value backEdge = phi.valueAt(1);
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
102 Value init = phi.valueAt(0);
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
103 if (loopNodes.isMarked(init)) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
104 // try to reverse init/backEdge order
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
105 Value tmp = backEdge;
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
106 backEdge = init;
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
107 init = tmp;
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
108 }
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
109 Value stride = null;
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
110 boolean useCounterAfterAdd = false;
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
111 if (!loopNodes.isMarked(init) && backEdge instanceof IntegerAdd && loopNodes.isMarked(backEdge)) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
112 IntegerAdd add = (IntegerAdd) backEdge;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
113 int addUsageCount = 0;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
114 for (Node u : add.usages()) {
3000
6c95d57cb1e2 Removed usage of stateBefore. Now framestate is always a successor of its associated node.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2986
diff changeset
115 if (u != loopEnd.stateAfter() && u != phi) {
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
116 addUsageCount++;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
117 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
118 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
119 if (add.x() == phi) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
120 stride = add.y();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
121 } else if (add.y() == phi) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
122 stride = add.x();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
123 }
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
124 if (addUsageCount > 0) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
125 useCounterAfterAdd = true;
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
126 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
127 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
128 if (stride != null && !loopNodes.isMarked(stride)) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
129 Graph graph = loopBegin.graph();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
130 LoopCounter counter = new LoopCounter(init.kind, init, stride, loopBegin, graph);
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
131 counters.add(counter);
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
132 phi.replace(counter);
3000
6c95d57cb1e2 Removed usage of stateBefore. Now framestate is always a successor of its associated node.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2986
diff changeset
133 loopEnd.stateAfter().inputs().replace(backEdge, counter);
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
134 if (useCounterAfterAdd) {
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
135 /*IntegerAdd otherInit = new IntegerAdd(init.kind, init, stride, graph); // would be nice to canonicalize
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
136 LoopCounter otherCounter = new LoopCounter(init.kind, otherInit, stride, loopBegin, graph);
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
137 backEdge.replace(otherCounter);*/
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
138 } else {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
139 backEdge.delete();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
140 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
141 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
142 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
143 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
144 }
2983
11dfbb40ca69 LoopCounter, WIP
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2982
diff changeset
145 return counters;
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
146 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
147
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
148 private NodeBitMap computeLoopNodes(LoopBegin loopBegin) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
149 LoopEnd loopEnd = loopBegin.loopEnd();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
150 NodeBitMap loopNodes = loopBegin.graph().createNodeBitMap();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
151 NodeFlood workCFG = loopBegin.graph().createNodeFlood();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
152 NodeFlood workData = loopBegin.graph().createNodeFlood();
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
153 workCFG.add(loopEnd);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
154 for (Node n : workCFG) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
155 workData.add(n);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
156 loopNodes.mark(n);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
157 if (n == loopBegin) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
158 continue;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
159 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
160 for (Node pred : n.predecessors()) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
161 workCFG.add(pred);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
162 }
2984
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2983
diff changeset
163 if (n instanceof Merge) {
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2983
diff changeset
164 Merge merge = (Merge) n;
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2983
diff changeset
165 for (int i = 0; i < merge.endCount(); i++) {
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2983
diff changeset
166 workCFG.add(merge.endAt(i));
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2983
diff changeset
167 }
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2983
diff changeset
168 }
2981
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
169 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
170 for (Node n : workData) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
171 loopNodes.mark(n);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
172 for (Node usage : n.usages()) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
173 if (usage instanceof FrameState) {
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
174 continue;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
175 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
176 workData.add(usage);
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
177 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
178 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
179 return loopNodes;
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
180 }
42681ed31c4d Some LoopCounter work
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
181 }