comparison graal/GraalCompiler/src/com/sun/c1x/ir/If.java @ 2602:0c6564c254af

new node layout: BlockBegin, BlockEnd -Dc1x.dot=regex for pdf output escape dot graph labels (<, >, &)
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 06 May 2011 10:25:37 +0200
parents 4a36a0bd6d18
children 3558ca7088c0
comparison
equal deleted inserted replaced
2601:224e8b4007bd 2602:0c6564c254af
20 * or visit www.oracle.com if you need additional information or have any 20 * or visit www.oracle.com if you need additional information or have any
21 * questions. 21 * questions.
22 */ 22 */
23 package com.sun.c1x.ir; 23 package com.sun.c1x.ir;
24 24
25 import com.oracle.graal.graph.*;
25 import com.sun.c1x.debug.*; 26 import com.sun.c1x.debug.*;
26 import com.sun.c1x.util.*; 27 import com.sun.c1x.util.*;
27 import com.sun.c1x.value.*; 28 import com.sun.c1x.value.*;
28 import com.sun.cri.ci.*; 29 import com.sun.cri.ci.*;
29 30
30 /** 31 /**
31 * The {@code If} instruction represents a branch that can go one of two directions 32 * The {@code If} instruction represents a branch that can go one of two directions
32 * depending on the outcome of a comparison. 33 * depending on the outcome of a comparison.
33 *
34 * @author Ben L. Titzer
35 */ 34 */
36 public final class If extends BlockEnd { 35 public final class If extends BlockEnd {
37 36
38 Value x; 37 private static final int INPUT_COUNT = 2;
39 Value y; 38 private static final int INPUT_X = 0;
39 private static final int INPUT_Y = 1;
40
41 private static final int SUCCESSOR_COUNT = 0;
42
43 @Override
44 protected int inputCount() {
45 return super.inputCount() + INPUT_COUNT;
46 }
47
48 @Override
49 protected int successorCount() {
50 return super.successorCount() + SUCCESSOR_COUNT;
51 }
52
53 /**
54 * The instruction that produces the first input to this comparison.
55 */
56 public Value x() {
57 return (Value) inputs().get(super.inputCount() + INPUT_X);
58 }
59
60 public Value setX(Value n) {
61 return (Value) inputs().set(super.inputCount() + INPUT_X, n);
62 }
63
64 /**
65 * The instruction that produces the second input to this comparison.
66 */
67 public Value y() {
68 return (Value) inputs().get(super.inputCount() + INPUT_Y);
69 }
70
71 public Value setY(Value n) {
72 return (Value) inputs().set(super.inputCount() + INPUT_Y, n);
73 }
74
40 Condition condition; 75 Condition condition;
41 boolean unorderedIsTrue; 76 boolean unorderedIsTrue;
42 77
43 /** 78 /**
44 * Constructs a new If instruction. 79 * Constructs a new If instruction.
45 * @param x the instruction producing the first input to the instruction 80 * @param x the instruction producing the first input to the instruction
46 * @param cond the condition (comparison operation) 81 * @param cond the condition (comparison operation)
47 * @param unorderedIsTrue {@code true} if unordered is treated as true (floating point operations)
48 * @param y the instruction that produces the second input to this instruction 82 * @param y the instruction that produces the second input to this instruction
49 * @param trueSucc the block representing the true successor 83 * @param trueSucc the block representing the true successor
50 * @param falseSucc the block representing the false successor 84 * @param falseSucc the block representing the false successor
51 * @param stateAfter the state before the branch but after the input values have been popped 85 * @param stateAfter the state before the branch but after the input values have been popped
52 * @param isSafepoint {@code true} if this branch should be considered a safepoint 86 * @param isSafepoint {@code true} if this branch should be considered a safepoint
87 * @param graph
53 */ 88 */
54 public If(Value x, Condition cond, Value y, 89 public If(Value x, Condition cond, Value y,
55 BlockBegin trueSucc, BlockBegin falseSucc, FrameState stateAfter, boolean isSafepoint) { 90 BlockBegin trueSucc, BlockBegin falseSucc, FrameState stateAfter, boolean isSafepoint, Graph graph) {
56 super(CiKind.Illegal, stateAfter, isSafepoint); 91 super(CiKind.Illegal, stateAfter, isSafepoint, 2, INPUT_COUNT, SUCCESSOR_COUNT, graph);
57 this.x = x; 92 assert Util.archKindsEqual(x, y);
58 this.y = y;
59 condition = cond; 93 condition = cond;
60 assert Util.archKindsEqual(x, y); 94 setX(x);
61 successors.add(trueSucc); 95 setY(y);
62 successors.add(falseSucc); 96 setBlockSuccessor(0, trueSucc);
63 } 97 setBlockSuccessor(1, falseSucc);
64
65 /**
66 * Gets the instruction that produces the first input to this comparison.
67 * @return the instruction producing the first input
68 */
69 public Value x() {
70 return x;
71 }
72
73 /**
74 * Gets the instruction that produces the second input to this comparison.
75 * @return the instruction producing the second input
76 */
77 public Value y() {
78 return y;
79 } 98 }
80 99
81 /** 100 /**
82 * Gets the condition (comparison operation) for this instruction. 101 * Gets the condition (comparison operation) for this instruction.
83 * @return the condition 102 * @return the condition
97 /** 116 /**
98 * Gets the block corresponding to the true successor. 117 * Gets the block corresponding to the true successor.
99 * @return the true successor 118 * @return the true successor
100 */ 119 */
101 public BlockBegin trueSuccessor() { 120 public BlockBegin trueSuccessor() {
102 return successors.get(0); 121 return blockSuccessor(0);
103 } 122 }
104 123
105 /** 124 /**
106 * Gets the block corresponding to the false successor. 125 * Gets the block corresponding to the false successor.
107 * @return the false successor 126 * @return the false successor
108 */ 127 */
109 public BlockBegin falseSuccessor() { 128 public BlockBegin falseSuccessor() {
110 return successors.get(1); 129 return blockSuccessor(1);
111 } 130 }
112 131
113 /** 132 /**
114 * Gets the block corresponding to the specified outcome of the branch. 133 * Gets the block corresponding to the specified outcome of the branch.
115 * @param istrue {@code true} if the true successor is requested, {@code false} otherwise 134 * @param istrue {@code true} if the true successor is requested, {@code false} otherwise
116 * @return the corresponding successor 135 * @return the corresponding successor
117 */ 136 */
118 public BlockBegin successor(boolean istrue) { 137 public BlockBegin successor(boolean istrue) {
119 return successors.get(istrue ? 0 : 1); 138 return blockSuccessor(istrue ? 0 : 1);
120 } 139 }
121 140
122 /** 141 /**
123 * Gets the successor of this instruction for the unordered case. 142 * Gets the successor of this instruction for the unordered case.
124 * @return the successor for unordered inputs 143 * @return the successor for unordered inputs
131 * Swaps the operands to this if and reverses the condition (e.g. > goes to <=). 150 * Swaps the operands to this if and reverses the condition (e.g. > goes to <=).
132 * @see Condition#mirror() 151 * @see Condition#mirror()
133 */ 152 */
134 public void swapOperands() { 153 public void swapOperands() {
135 condition = condition.mirror(); 154 condition = condition.mirror();
136 Value t = x; 155 Value t = x();
137 x = y; 156 setX(y());
138 y = t; 157 setY(t);
139 } 158 }
140 159
141 /** 160 /**
142 * Swaps the successor blocks to this if and negates the condition (e.g. == goes to !=) 161 * Swaps the successor blocks to this if and negates the condition (e.g. == goes to !=)
143 * @see Condition#negate() 162 * @see Condition#negate()
144 */ 163 */
145 public void swapSuccessors() { 164 public void swapSuccessors() {
146 unorderedIsTrue = !unorderedIsTrue; 165 unorderedIsTrue = !unorderedIsTrue;
147 condition = condition.negate(); 166 condition = condition.negate();
148 BlockBegin t = successors.get(0); 167 BlockBegin t = blockSuccessor(0);
149 BlockBegin f = successors.get(1); 168 BlockBegin f = blockSuccessor(1);
150 successors.set(0, f); 169 setBlockSuccessor(0, f);
151 successors.set(1, t); 170 setBlockSuccessor(1, t);
152 }
153
154 @Override
155 public void inputValuesDo(ValueClosure closure) {
156 x = closure.apply(x);
157 y = closure.apply(y);
158 } 171 }
159 172
160 @Override 173 @Override
161 public void accept(ValueVisitor v) { 174 public void accept(ValueVisitor v) {
162 v.visitIf(this); 175 v.visitIf(this);