33 import org.graalvm.compiler.graph.Node;
34 import org.graalvm.compiler.nodeinfo.Verbosity;
35 import org.graalvm.compiler.nodes.AbstractBeginNode;
36 import org.graalvm.compiler.nodes.BeginNode;
37 import org.graalvm.compiler.nodes.FixedNode;
38 import org.graalvm.compiler.nodes.FixedWithNextNode;
39 import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
40 import org.graalvm.compiler.nodes.LoopBeginNode;
41 import org.graalvm.compiler.nodes.LoopEndNode;
42 import org.graalvm.compiler.nodes.LoopExitNode;
43 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
44 import jdk.internal.vm.compiler.word.LocationIdentity;
45
46 public final class Block extends AbstractBlockBase<Block> {
47 public static final Block[] EMPTY_ARRAY = new Block[0];
48
49 protected final AbstractBeginNode beginNode;
50
51 protected FixedNode endNode;
52
53 protected double probability;
54 private Loop<Block> loop;
55
56 protected Block postdominator;
57 private LocationSet killLocations;
58 private LocationSet killLocationsBetweenThisAndDominator;
59
60 public Block(AbstractBeginNode node) {
61 this.beginNode = node;
62 }
63
64 public AbstractBeginNode getBeginNode() {
65 return beginNode;
66 }
67
68 public FixedNode getEndNode() {
69 return endNode;
70 }
71
72 /**
73 * Return the {@link LoopExitNode} for this block if it exists.
219 }
220 sb.append('B').append(getSuccessors()[i].getId());
221 }
222 sb.append(']');
223 }
224
225 if (getPredecessorCount() > 0) {
226 sb.append(" <-[");
227 for (int i = 0; i < getPredecessorCount(); ++i) {
228 if (i != 0) {
229 sb.append(',');
230 }
231 sb.append('B').append(getPredecessors()[i].getId());
232 }
233 sb.append(']');
234 }
235 }
236 return sb.toString();
237 }
238
239 @Override
240 public double probability() {
241 return probability;
242 }
243
244 public void setProbability(double probability) {
245 assert probability >= 0 && Double.isFinite(probability);
246 this.probability = probability;
247 }
248
249 @Override
250 public Block getDominator(int distance) {
251 Block result = this;
252 for (int i = 0; i < distance; ++i) {
253 result = result.getDominator();
254 }
255 return result;
256 }
257
258 public boolean canKill(LocationIdentity location) {
259 if (location.isImmutable()) {
260 return false;
261 }
262 return getKillLocations().contains(location);
263 }
264
265 public LocationSet getKillLocations() {
266 if (killLocations == null) {
|
33 import org.graalvm.compiler.graph.Node;
34 import org.graalvm.compiler.nodeinfo.Verbosity;
35 import org.graalvm.compiler.nodes.AbstractBeginNode;
36 import org.graalvm.compiler.nodes.BeginNode;
37 import org.graalvm.compiler.nodes.FixedNode;
38 import org.graalvm.compiler.nodes.FixedWithNextNode;
39 import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
40 import org.graalvm.compiler.nodes.LoopBeginNode;
41 import org.graalvm.compiler.nodes.LoopEndNode;
42 import org.graalvm.compiler.nodes.LoopExitNode;
43 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
44 import jdk.internal.vm.compiler.word.LocationIdentity;
45
46 public final class Block extends AbstractBlockBase<Block> {
47 public static final Block[] EMPTY_ARRAY = new Block[0];
48
49 protected final AbstractBeginNode beginNode;
50
51 protected FixedNode endNode;
52
53 protected double relativeFrequency;
54 private Loop<Block> loop;
55
56 protected Block postdominator;
57 private LocationSet killLocations;
58 private LocationSet killLocationsBetweenThisAndDominator;
59
60 public Block(AbstractBeginNode node) {
61 this.beginNode = node;
62 }
63
64 public AbstractBeginNode getBeginNode() {
65 return beginNode;
66 }
67
68 public FixedNode getEndNode() {
69 return endNode;
70 }
71
72 /**
73 * Return the {@link LoopExitNode} for this block if it exists.
219 }
220 sb.append('B').append(getSuccessors()[i].getId());
221 }
222 sb.append(']');
223 }
224
225 if (getPredecessorCount() > 0) {
226 sb.append(" <-[");
227 for (int i = 0; i < getPredecessorCount(); ++i) {
228 if (i != 0) {
229 sb.append(',');
230 }
231 sb.append('B').append(getPredecessors()[i].getId());
232 }
233 sb.append(']');
234 }
235 }
236 return sb.toString();
237 }
238
239 /**
240 * The execution frequency of this block relative to the start block as estimated by the
241 * profiling information.
242 */
243 @Override
244 public double getRelativeFrequency() {
245 return relativeFrequency;
246 }
247
248 public void setRelativeFrequency(double relativeFrequency) {
249 assert relativeFrequency >= 0 && Double.isFinite(relativeFrequency);
250 this.relativeFrequency = relativeFrequency;
251 }
252
253 @Override
254 public Block getDominator(int distance) {
255 Block result = this;
256 for (int i = 0; i < distance; ++i) {
257 result = result.getDominator();
258 }
259 return result;
260 }
261
262 public boolean canKill(LocationIdentity location) {
263 if (location.isImmutable()) {
264 return false;
265 }
266 return getKillLocations().contains(location);
267 }
268
269 public LocationSet getKillLocations() {
270 if (killLocations == null) {
|