From 1786f2e81855da1faf744ee28f40e53628aff9f2 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 5 Feb 2004 07:18:20 +0000 Subject: [PATCH] Added support to printout data structure update nodes (bindings/updates) Added support to simplify updates/determine if they are self consistent Added support to sequence updates Improved precision of data structure update analysis --- Repair/RepairCompiler/MCC/IR/Binding.java | 7 +- Repair/RepairCompiler/MCC/IR/CastExpr.java | 4 + .../MCC/IR/ConcreteInterferes.java | 83 ++++++++++- Repair/RepairCompiler/MCC/IR/DotExpr.java | 12 ++ .../RepairCompiler/MCC/IR/ElementOfExpr.java | 4 + Repair/RepairCompiler/MCC/IR/Expr.java | 10 +- Repair/RepairCompiler/MCC/IR/GraphNode.java | 82 +++++++++-- .../RepairCompiler/MCC/IR/ImageSetExpr.java | 6 + .../MCC/IR/IntegerLiteralExpr.java | 4 + .../RepairCompiler/MCC/IR/MultUpdateNode.java | 7 + Repair/RepairCompiler/MCC/IR/OpExpr.java | 20 +++ .../RepairCompiler/MCC/IR/RelationExpr.java | 4 + Repair/RepairCompiler/MCC/IR/SizeofExpr.java | 4 + Repair/RepairCompiler/MCC/IR/Termination.java | 24 +++- Repair/RepairCompiler/MCC/IR/TupleOfExpr.java | 10 ++ Repair/RepairCompiler/MCC/IR/UpdateNode.java | 129 +++++++++++++++++- Repair/RepairCompiler/MCC/IR/Updates.java | 53 ++++--- Repair/RepairCompiler/MCC/IR/VarExpr.java | 12 +- 18 files changed, 416 insertions(+), 59 deletions(-) diff --git a/Repair/RepairCompiler/MCC/IR/Binding.java b/Repair/RepairCompiler/MCC/IR/Binding.java index 652c849..163f237 100755 --- a/Repair/RepairCompiler/MCC/IR/Binding.java +++ b/Repair/RepairCompiler/MCC/IR/Binding.java @@ -20,5 +20,10 @@ class Binding { VarDescriptor getVar() { return var; } - + public String toString() { + if (search) + return "SEARCHFOR"+var.toString(); + else + return var.toString()+"="+String.valueOf(position); + } } diff --git a/Repair/RepairCompiler/MCC/IR/CastExpr.java b/Repair/RepairCompiler/MCC/IR/CastExpr.java index 4ccc637..88fde6d 100755 --- a/Repair/RepairCompiler/MCC/IR/CastExpr.java +++ b/Repair/RepairCompiler/MCC/IR/CastExpr.java @@ -7,6 +7,10 @@ public class CastExpr extends Expr { TypeDescriptor type; Expr expr; + public Set freeVars() { + return expr.freeVars(); + } + public CastExpr(TypeDescriptor type, Expr expr) { this.type = type; this.expr = expr; diff --git a/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java b/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java index 9419563..c4855bc 100755 --- a/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java +++ b/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java @@ -1,4 +1,5 @@ package MCC.IR; +import java.util.*; class ConcreteInterferes { static public boolean interferes(MultUpdateNode mun, Rule r, boolean satisfy) { @@ -22,11 +23,8 @@ class ConcreteInterferes { for(int l=0;lj) + toremove.add(u1); + else + toremove.add(u2); + continue; + } + + /* Handle = or != NULL */ + if ((((u1.getOpcode()==Opcode.EQ)&&(u2.getOpcode()==Opcode.NE))|| + ((u1.getOpcode()==Opcode.NE)&&(u2.getOpcode()==Opcode.EQ)))&& + (((u1.isExpr()&&u1.getRightExpr().isNull())&&(!u2.isExpr()||u2.getRightExpr().isNonNull())) + ||((!u1.isExpr()||u1.getRightExpr().isNonNull())&&(u2.isExpr()&&u2.getRightExpr().isNull())))) { + if (u1.getOpcode()==Opcode.NE) + toremove.add(u1); + else + toremove.add(u2); + continue; + } + + /* Handle = and != to different constants */ + if ((((u1.getOpcode()==Opcode.EQ)&&(u2.getOpcode()==Opcode.NE))|| + ((u1.getOpcode()==Opcode.NE)&&(u2.getOpcode()==Opcode.EQ)))&& + (u1.isExpr()&&u1.getRightExpr() instanceof LiteralExpr)&& + (u2.isExpr()&&u2.getRightExpr() instanceof LiteralExpr)&& + !u1.getRightExpr().equals(u2.getRightExpr())) { + if (u1.getOpcode()==Opcode.NE) + toremove.add(u1); + else + toremove.add(u2); + continue; + } - + /* Compatible operations < & <= */ + if (((u1.getOpcode()==Opcode.LT)||(u1.getOpcode()==Opcode.LE))&& + ((u2.getOpcode()==Opcode.LT)||(u2.getOpcode()==Opcode.LE))) + continue; + + /* Compatible operations > & >= */ + if (((u1.getOpcode()==Opcode.GT)||(u1.getOpcode()==Opcode.GE))&& + ((u2.getOpcode()==Opcode.GT)||(u2.getOpcode()==Opcode.GE))) + continue; + /* Ranges */ + + //XXXXXX: TODO + /* Equality & Comparisons */ + //XXXXXX: TODO + return false; /* They interfere */ } } - updates.remove(toremove); - return false; + updates.removeAll(toremove); + return true; } public void addBinding(Binding b) { diff --git a/Repair/RepairCompiler/MCC/IR/Updates.java b/Repair/RepairCompiler/MCC/IR/Updates.java index 2c83ad6..5e3652b 100755 --- a/Repair/RepairCompiler/MCC/IR/Updates.java +++ b/Repair/RepairCompiler/MCC/IR/Updates.java @@ -12,15 +12,14 @@ class Updates { boolean negate=false; public String toString() { - String st="type="+type+"\n"; - st+="rightposition="+rightposition+"\n"; - if (rightexpr!=null) - st+="rightexpr="+rightexpr.name()+"\n"; - if (leftexpr!=null) - st+="leftexpr="+leftexpr.name()+"\n"; - st+="opcode="+opcode+"\n"; - st+="negate="+negate+"\n"; - return st; + if (type==EXPR) + return leftexpr.name()+opcode.toString()+rightexpr.name(); + else if (type==POSITION) + return leftexpr.name()+opcode.toString()+"Position("+String.valueOf(rightposition)+")"; + else if (type==ABSTRACT) { + if (negate) return "!"+leftexpr.name(); + else return leftexpr.name(); + } else throw new Error("Unrecognized type"); } public Updates(Expr lexpr, Expr rexpr, Opcode op, boolean negate) { @@ -41,23 +40,8 @@ class Updates { else if (op==Opcode.LE) op=Opcode.GT; } - - opcode=Opcode.EQ; - /* Get rid of everything but NE */ - if (op==Opcode.GT) { - rightexpr=new OpExpr(Opcode.ADD,rexpr,new IntegerLiteralExpr(1)); - } else if (op==Opcode.GE) { - rightexpr=rexpr; - } else if (op==Opcode.LT) { - rightexpr=new OpExpr(Opcode.SUB,rexpr,new IntegerLiteralExpr(1)); - } else if (op==Opcode.LE) { - rightexpr=rexpr; - } else if (op==Opcode.EQ) { - rightexpr=rexpr; - } else if (op==Opcode.NE) { - rightexpr=rexpr; - opcode=Opcode.NE; - } + opcode=op; + rightexpr=rexpr; } boolean isGlobal() { @@ -66,7 +50,18 @@ class Updates { else return false; } - + VarDescriptor getVar() { + if (isGlobal()) { + return ((VarExpr)leftexpr).getVar(); + } else if (isField()) { + Expr e=leftexpr; + for(;e instanceof DotExpr;e=((DotExpr)e).getExpr()) ; + return ((VarExpr)e).getVar(); + } else { + System.out.println(toString()); + throw new Error("Unrecognized Update"); + } + } Descriptor getDescriptor() { if (isGlobal()) { @@ -87,6 +82,10 @@ class Updates { return false; } + boolean isExpr() { + return type==Updates.EXPR; + } + Opcode getOpcode() { return opcode; diff --git a/Repair/RepairCompiler/MCC/IR/VarExpr.java b/Repair/RepairCompiler/MCC/IR/VarExpr.java index 82cd341..ff52366 100755 --- a/Repair/RepairCompiler/MCC/IR/VarExpr.java +++ b/Repair/RepairCompiler/MCC/IR/VarExpr.java @@ -8,6 +8,12 @@ public class VarExpr extends Expr { VarDescriptor vd = null; boolean typechecked = false; + public Set freeVars() { + HashSet hs=new HashSet(); + hs.add(vd); + return hs; + } + public VarExpr(String varname) { this.varname = varname; } @@ -28,6 +34,10 @@ public class VarExpr extends Expr { return false; } + public boolean isNonNull() { + return true; + } + public boolean equals(Map remap, Expr e) { if (e==null||!(e instanceof VarExpr)) return false; @@ -37,7 +47,7 @@ public class VarExpr extends Expr { if (ve.vd==null) throw new Error("e has uninitialized VarDescriptor"); VarDescriptor nvd=vd; - if (remap.containsKey(nvd)) + if (remap!=null&&remap.containsKey(nvd)) nvd=(VarDescriptor)remap.get(nvd); if (nvd!=ve.vd) return false; -- 2.34.1