Mercurial > hg > graal-compiler
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 |
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>
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>
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>
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>
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>
diff
changeset
|
66 if (c2inCompare && !c1InCompare) { |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
67 c1 = acounters[j]; |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
68 c2 = acounters[i]; |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
69 acounters[i] = c2; |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
70 acounters[j] = c1; |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
71 } |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
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>
diff
changeset
|
75 if (c2InFramestate) { |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
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>
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>
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>
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>
diff
changeset
|
80 phi.addInput(c2.init()); |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
81 phi.addInput(add); |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
82 c2.replace(phi); |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
diff
changeset
|
83 } else { |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
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>
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>
diff
changeset
|
86 c2.replace(add); |
f9e045cd2c23
Merge, add some edge spliting around loopbegin when necessary
Gilles Duboscq <gilles.duboscq@oracle.com>
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 | 163 if (n instanceof Merge) { |
164 Merge merge = (Merge) n; | |
165 for (int i = 0; i < merge.endCount(); i++) { | |
166 workCFG.add(merge.endAt(i)); | |
167 } | |
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 } |