Skip to content

Commit 44f5061

Browse files
author
1475505
committed
pass all local tests in A2
1 parent 3244719 commit 44f5061

File tree

3 files changed

+56
-8
lines changed

3 files changed

+56
-8
lines changed

A2/tai-e/src/main/java/pascal/taie/analysis/dataflow/analysis/constprop/ConstantPropagation.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void meetInto(CPFact fact, CPFact target) {
8585
target.update(var, meetValue(fact.get(var), value));
8686
});
8787
fact.forEach((Var var, Value value) -> {
88-
fact.update(var, meetValue(target.get(var), value));
88+
target.update(var, meetValue(target.get(var), value));
8989
});
9090
}
9191

@@ -110,14 +110,16 @@ public Value meetValue(Value v1, Value v2) {
110110
public boolean transferNode(Stmt stmt, CPFact in, CPFact out) {
111111
// TODO - finish me
112112
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);
115115
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) {
117117
out.update((Var) gen.get(), evaluate(((DefinitionStmt<?, ?>) stmt).getRValue(), in));
118+
System.out.println((((DefinitionStmt<?, ?>) stmt).getRValue()).toString());
118119
} else {
119120
out.update((Var) gen.get(), Value.getNAC());
120121
}
122+
System.out.println("transferred (old_out:" + old_out.toString() + ")"+ stmt.toString() + " from" + in.toString() + "->" + out.toString());
121123
}
122124
return out.equals(old_out);
123125
}
@@ -150,12 +152,20 @@ public static boolean canHoldInt(Var var) {
150152
public static Value evaluate(Exp exp, CPFact in) {
151153
// TODO - finish me
152154
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+
}
154161
} else if (exp instanceof IntLiteral){
155162
return Value.makeConstant(((IntLiteral)exp).getValue());
156163
} else if (exp instanceof BinaryExp){
157164
Value op1 = evaluate(((BinaryExp) exp).getOperand1(), in);
158165
Value op2 = evaluate(((BinaryExp) exp).getOperand2(), in);
166+
if ( !op1.isConstant() || !op2.isConstant()){
167+
return Value.getNAC();
168+
}
159169
BinaryExp.Op op = ((BinaryExp) exp).getOperator();
160170
if (op instanceof ArithmeticExp.Op) {
161171
switch ((ArithmeticExp.Op)op) {
@@ -217,9 +227,19 @@ public static Value evaluate(Exp exp, CPFact in) {
217227
}
218228
}
219229
}
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+
}
223243
}
224244
}
225245
return Value.getNAC();

A2/tai-e/src/main/java/pascal/taie/analysis/dataflow/solver/Solver.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ private DataflowResult<Node, Fact> initialize(CFG<Node> cfg) {
7878

7979
protected void initializeForward(CFG<Node> cfg, DataflowResult<Node, Fact> result) {
8080
// TODO - finish me
81+
result.setOutFact(cfg.getEntry(), analysis.newBoundaryFact(cfg));
82+
result.setInFact(cfg.getEntry(), analysis.newBoundaryFact(cfg));
83+
for (Node node : cfg) {
84+
if (node.equals(cfg.getEntry())){
85+
continue;
86+
}
87+
result.setOutFact(node, analysis.newInitialFact());
88+
result.setInFact(node, analysis.newInitialFact());
89+
}
8190
}
8291

8392
protected void initializeBackward(CFG<Node> cfg, DataflowResult<Node, Fact> result) {

A2/tai-e/src/main/java/pascal/taie/analysis/dataflow/solver/WorkListSolver.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
import pascal.taie.analysis.dataflow.fact.DataflowResult;
2727
import pascal.taie.analysis.graph.cfg.CFG;
2828

29+
import java.sql.Array;
30+
import java.util.ArrayList;
31+
import java.util.LinkedList;
32+
import java.util.Queue;
33+
2934
class WorkListSolver<Node, Fact> extends Solver<Node, Fact> {
3035

3136
WorkListSolver(DataflowAnalysis<Node, Fact> analysis) {
@@ -35,6 +40,20 @@ class WorkListSolver<Node, Fact> extends Solver<Node, Fact> {
3540
@Override
3641
protected void doSolveForward(CFG<Node> cfg, DataflowResult<Node, Fact> result) {
3742
// TODO - finish me
43+
Queue<Node> workList = new LinkedList<>(); // queue
44+
for (Node node : cfg){
45+
workList.add(node);
46+
}
47+
while (!workList.isEmpty()) {
48+
Node node = workList.poll();
49+
System.out.println("start processing " + node.toString());
50+
for (Node n : cfg.getPredsOf(node)) {
51+
analysis.meetInto(result.getOutFact(n), result.getInFact(node));
52+
}
53+
if (!analysis.transferNode(node, result.getInFact(node), result.getOutFact(node))) {
54+
workList.addAll(cfg.getSuccsOf(node));
55+
}
56+
}
3857
}
3958

4059
@Override

0 commit comments

Comments
 (0)