comparison graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java @ 9467:3531cdfddff6

Ensure probabilities are never negative. Add additional assertions.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 01 May 2013 16:30:52 +0200
parents ee3279c0f9a0
children 8c37649cbb62
comparison
equal deleted inserted replaced
9466:b8cae7920bca 9467:3531cdfddff6
63 63
64 public IfNode(LogicNode condition, AbstractBeginNode trueSuccessor, AbstractBeginNode falseSuccessor, double trueSuccessorProbability) { 64 public IfNode(LogicNode condition, AbstractBeginNode trueSuccessor, AbstractBeginNode falseSuccessor, double trueSuccessorProbability) {
65 super(StampFactory.forVoid()); 65 super(StampFactory.forVoid());
66 this.condition = condition; 66 this.condition = condition;
67 this.falseSuccessor = falseSuccessor; 67 this.falseSuccessor = falseSuccessor;
68 this.trueSuccessorProbability = trueSuccessorProbability;
69 this.trueSuccessor = trueSuccessor; 68 this.trueSuccessor = trueSuccessor;
69 setTrueSuccessorProbability(trueSuccessorProbability);
70 70
71 } 71 }
72 72
73 /** 73 /**
74 * Gets the true successor. 74 * Gets the true successor.
115 AbstractBeginNode falseSucc = falseSuccessor(); 115 AbstractBeginNode falseSucc = falseSuccessor();
116 setTrueSuccessor(null); 116 setTrueSuccessor(null);
117 setFalseSuccessor(null); 117 setFalseSuccessor(null);
118 setTrueSuccessor(falseSucc); 118 setTrueSuccessor(falseSucc);
119 setFalseSuccessor(trueSucc); 119 setFalseSuccessor(trueSucc);
120 trueSuccessorProbability = 1 - trueSuccessorProbability; 120 setTrueSuccessorProbability(1 - trueSuccessorProbability);
121 return this; 121 return this;
122 } 122 }
123 123
124 public void setTrueSuccessorProbability(double prob) { 124 public void setTrueSuccessorProbability(double prob) {
125 assert prob >= 0.0 && prob <= 1.0;
125 trueSuccessorProbability = prob; 126 trueSuccessorProbability = prob;
126 } 127 }
127 128
128 @Override 129 @Override
129 public double probability(AbstractBeginNode successor) { 130 public double probability(AbstractBeginNode successor) {
187 this.replaceAtPredecessor(nextIf); 188 this.replaceAtPredecessor(nextIf);
188 nextIf.setFalseSuccessor(intermediateBegin); 189 nextIf.setFalseSuccessor(intermediateBegin);
189 intermediateBegin.setNext(this); 190 intermediateBegin.setNext(this);
190 this.setFalseSuccessor(bothFalseBegin); 191 this.setFalseSuccessor(bothFalseBegin);
191 nextIf.setTrueSuccessorProbability(probabilityB); 192 nextIf.setTrueSuccessorProbability(probabilityB);
192 double newProbability = this.trueSuccessorProbability / (1.0 - probabilityB); 193 if (probabilityB == 1.0) {
193 this.setTrueSuccessorProbability(newProbability); 194 this.setTrueSuccessorProbability(0.0);
195 } else {
196 double newProbability = this.trueSuccessorProbability / (1.0 - probabilityB);
197 this.setTrueSuccessorProbability(Math.min(1.0, newProbability));
198 }
194 return; 199 return;
195 } 200 }
196 } 201 }
197 } 202 }
198 } 203 }