001/* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013package org.jikesrvm.compilers.opt.util; 014 015import java.util.Enumeration; 016 017 018public abstract class SortedGraphNode extends SpaceEffGraphNode { 019 020 // Return enumerator for all the in nodes. 021 public abstract Enumeration<? extends SortedGraphNode> getInNodes(); // should be overridden 022 // by a subclass 023 024 // Return enumerator for all the out nodes. 025 026 public abstract Enumeration<? extends SortedGraphNode> getOutNodes(); // should be overridden by a 027 // subclass 028 029 public SortedGraphNode getSortedNext(boolean forward) { 030 if (forward) { 031 return sortedNext; 032 } else { 033 return sortedPrev; 034 } 035 } 036 037 public SortedGraphNode getForwardSortedNext() { 038 return sortedNext; 039 } 040 041 public SortedGraphNode getBackwardSortedNext() { 042 return sortedPrev; 043 } 044 045 public void setSortedNext(SortedGraphNode next, boolean forward) { 046 if (forward) { 047 sortedNext = next; 048 } else { 049 sortedPrev = next; 050 } 051 } 052 053 // preferred interface 054 public void setForwardSortNumber(int number) { 055 forwardSortNumber = number; 056 } 057 058 public int getForwardSortNumber() { 059 return forwardSortNumber; 060 } 061 062 public void setBackwardSortNumber(int number) { 063 backwardSortNumber = number; 064 } 065 066 public int getBackwardSortNumber() { 067 return backwardSortNumber; 068 } 069 070 // probably less efficient than above, but more flexible 071 public void setSortNumber(int number, boolean forward) { 072 if (forward) { 073 forwardSortNumber = number; 074 } else { 075 backwardSortNumber = number; 076 } 077 } 078 079 public int getSortNumber(boolean forward) { 080 if (forward) { 081 return forwardSortNumber; 082 } else { 083 return backwardSortNumber; 084 } 085 } 086 087 public void setSortNumber(int number) { 088 forwardSortNumber = number; 089 } 090 091 // Do we need this? 092 // public int isForwardSorted(SortedGraphNode node) { 093 // return forwardSortNumber - node.forwardSortNumber; 094 // } 095 public static int getNewSortMarker(SortedGraphNode anchor) { 096 if (currentSortMarker == Integer.MAX_VALUE) { 097 SortedGraphNode current; 098 for (current = anchor; current != null; current = current.sortedPrev) { 099 current.sortMarker = Integer.MIN_VALUE; 100 } 101 for (current = anchor; current != null; current = current.sortedNext) { 102 current.sortMarker = Integer.MIN_VALUE; 103 } 104 currentSortMarker = Integer.MIN_VALUE; 105 } 106 return ++currentSortMarker; 107 } 108 109 int sortMarker = Integer.MIN_VALUE; 110 private static int currentSortMarker = Integer.MIN_VALUE; 111 112 public int getSortMarker() { 113 return sortMarker; 114 } 115 116 public void setSortMarker(int sortMarker) { 117 this.sortMarker = sortMarker; 118 } 119 120 public boolean isSortMarkedWith(int sortMarker) { 121 return (this.sortMarker >= sortMarker); 122 } 123 124 public SortedGraphNode sortedPrev = null; 125 public SortedGraphNode sortedNext = null; 126 protected int forwardSortNumber; 127 protected int backwardSortNumber; 128}