@@ -85,7 +85,7 @@ public void meetInto(CPFact fact, CPFact target) {
85
85
target .update (var , meetValue (fact .get (var ), value ));
86
86
});
87
87
fact .forEach ((Var var , Value value ) -> {
88
- fact .update (var , meetValue (target .get (var ), value ));
88
+ target .update (var , meetValue (target .get (var ), value ));
89
89
});
90
90
}
91
91
@@ -110,14 +110,16 @@ public Value meetValue(Value v1, Value v2) {
110
110
public boolean transferNode (Stmt stmt , CPFact in , CPFact out ) {
111
111
// TODO - finish me
112
112
var gen = stmt .getDef ();
113
- CPFact old_out = new CPFact ();
114
- old_out = out .copy ( );
113
+ CPFact old_out = out . copy ();
114
+ out .copyFrom ( in );
115
115
if (gen .isPresent () && gen .get () instanceof Var ) {
116
- if (canHoldInt ((Var ) gen .get ()) && ((DefinitionStmt <?, ?>) stmt ).getRValue () instanceof Var ) {
116
+ if (canHoldInt ((Var ) gen .get ()) && ((DefinitionStmt <?, ?>) stmt ).getRValue () != null ) {
117
117
out .update ((Var ) gen .get (), evaluate (((DefinitionStmt <?, ?>) stmt ).getRValue (), in ));
118
+ System .out .println ((((DefinitionStmt <?, ?>) stmt ).getRValue ()).toString ());
118
119
} else {
119
120
out .update ((Var ) gen .get (), Value .getNAC ());
120
121
}
122
+ System .out .println ("transferred (old_out:" + old_out .toString () + ")" + stmt .toString () + " from" + in .toString () + "->" + out .toString ());
121
123
}
122
124
return out .equals (old_out );
123
125
}
@@ -150,12 +152,20 @@ public static boolean canHoldInt(Var var) {
150
152
public static Value evaluate (Exp exp , CPFact in ) {
151
153
// TODO - finish me
152
154
if (exp instanceof Var ){
153
- return in .get ((Var ) exp );
155
+ if (canHoldInt ((Var ) exp )) {
156
+ System .out .println ("Evaluate Var " + exp .toString () + "==" + in .get ((Var ) exp ).toString ());
157
+ return in .get ((Var ) exp );
158
+ } else {
159
+ return Value .getNAC ();
160
+ }
154
161
} else if (exp instanceof IntLiteral ){
155
162
return Value .makeConstant (((IntLiteral )exp ).getValue ());
156
163
} else if (exp instanceof BinaryExp ){
157
164
Value op1 = evaluate (((BinaryExp ) exp ).getOperand1 (), in );
158
165
Value op2 = evaluate (((BinaryExp ) exp ).getOperand2 (), in );
166
+ if ( !op1 .isConstant () || !op2 .isConstant ()){
167
+ return Value .getNAC ();
168
+ }
159
169
BinaryExp .Op op = ((BinaryExp ) exp ).getOperator ();
160
170
if (op instanceof ArithmeticExp .Op ) {
161
171
switch ((ArithmeticExp .Op )op ) {
@@ -217,9 +227,19 @@ public static Value evaluate(Exp exp, CPFact in) {
217
227
}
218
228
}
219
229
}
220
- if (op instanceof BitwiseExp .Op ){
221
- // maybe no need to process it?
222
- ;
230
+ if (op instanceof BitwiseExp .Op ) {
231
+ // maybe no need to process it? NO!!!
232
+ switch ((BitwiseExp .Op )op ){
233
+ case OR -> {
234
+ return Value .makeConstant (op1 .getConstant () | op2 .getConstant ());
235
+ }
236
+ case AND -> {
237
+ return Value .makeConstant (op1 .getConstant () & op2 .getConstant ());
238
+ }
239
+ case XOR -> {
240
+ return Value .makeConstant (op1 .getConstant () ^ op2 .getConstant ());
241
+ }
242
+ }
223
243
}
224
244
}
225
245
return Value .getNAC ();
0 commit comments