X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FAbstractInterferes.java;h=ea024cdb22bf699d4474cdd40e2f6edc13836a3f;hp=42173617fbeaf5fd051c1fcecdd17eebd62020d8;hb=5206adad89e8c25fe06bf649840920337f1c2ad1;hpb=0ddd66cf596f161886dc67214f3fb2e19f6f7168 diff --git a/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java b/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java index 4217361..ea024cd 100755 --- a/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java +++ b/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java @@ -1,6 +1,60 @@ package MCC.IR; +import java.util.*; class AbstractInterferes { + + /** Does performing the AbstractRepair ar satisfy (or falsify if satisfy=false) + * Rule r */ + static public boolean interferes(AbstractRepair ar, Rule r, boolean satisfy) { + boolean mayadd=false; + boolean mayremove=false; + switch (ar.getType()) { + case AbstractRepair.ADDTOSET: + case AbstractRepair.ADDTORELATION: + if (interferesquantifier(ar.getDescriptor(), true, r, satisfy)) + return true; + mayadd=true; + break; + case AbstractRepair.REMOVEFROMSET: + case AbstractRepair.REMOVEFROMRELATION: + if (interferesquantifier(ar.getDescriptor(), false, r, satisfy)) + return true; + mayremove=true; + break; + case AbstractRepair.MODIFYRELATION: + if (interferesquantifier(ar.getDescriptor(), true, r, satisfy)) + return true; + if (interferesquantifier(ar.getDescriptor(), false, r, satisfy)) + return true; + mayadd=true; + mayremove=true; + break; + default: + throw new Error("Unrecognized Abstract Repair"); + } + DNFRule drule=null; + if (satisfy) + drule=r.getDNFGuardExpr(); + else + drule=r.getDNFNegGuardExpr(); + + for(int i=0;i=size2a)) + return false; + + if ((op1==Opcode.EQ)&&(op2==Opcode.EQ)&& + (size1a==size2a)) + return false; + + if ((op1==Opcode.EQ)&& + ((op2==Opcode.LE)||(op2==Opcode.LT))&& + (size1a<=size2a)) + return false; + + if ((op1==Opcode.EQ)&& + ((op2==Opcode.GE)||(op2==Opcode.GT))&& + (size1a>=size2a)) + return false; + + if (op2==Opcode.NE) /*FLAGNE this is current behavior for NE repairs */ + if (size1a!=size2) + return false; + + if ((op1==Opcode.NE)&& + (op2==Opcode.EQ)&& + (size1!=size2)) + return false; + + if ((op1==Opcode.NE)&& /* FLAGNE relies on increasing or decreasing by 1 */ + ((op2==Opcode.GT)||(op2==Opcode.GE))&& + (size1!=size2a)) + return false; + + if ((op1==Opcode.NE)&& /* FLAGNE relies on increasing or decreasing by 1 */ + ((op2==Opcode.LT)||(op2==Opcode.LE))&& + (size1!=size2a)) + return false; + } } /* This handles all the c comparisons in the paper */ @@ -76,37 +231,28 @@ class AbstractInterferes { (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) { boolean neg1=ar.getPredicate().isNegated(); Opcode op1=((ExprPredicate)ar.getPredicate().getPredicate()).getOp(); - int size1=((ExprPredicate)ar.getPredicate().getPredicate()).leftsize(); + int size1=((ExprPredicate)ar.getPredicate().getPredicate()).rightSize(); boolean neg2=dp.isNegated(); Opcode op2=((ExprPredicate)dp.getPredicate()).getOp(); - int size2=((ExprPredicate)dp.getPredicate()).leftsize(); - if ((!neg1&&((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE))|| - (neg1&&((op1==Opcode.EQ)||(op1==Opcode.GT)||op1==Opcode.GE)||(op1==Opcode.NE))) { + int size2=((ExprPredicate)dp.getPredicate()).rightSize(); + /* Translate the opcodes */ + op1=translateOpcode(neg1,op1); + op2=translateOpcode(neg2,op2); + + if (((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE)) { int size1a=0; - if (neg1) { - if((op1==Opcode.EQ)||(op1==Opcode.GE)) - size1a=size1-1; - if((op1==Opcode.GT)||(op1==Opcode.NE)) - size1a=size1; - } - if (!neg1) { - if((op1==Opcode.EQ)||(op1==Opcode.LE)) - size1a=size1; - if((op1==Opcode.LT)||(op1==Opcode.NE)) - size1a=size1-1; - } - if ((!neg2&&(op2==Opcode.EQ)&&(size1a==size2))|| - (neg2&&(op2==Opcode.EQ)&&(size1a!=size2))|| - (!neg2&&(op2==Opcode.NE)&&(size1a!=size2))|| - (neg2&&(op2==Opcode.NE)&&(size1a==size2))|| - (neg2&&(op2==Opcode.GE))|| - (neg2&&(op2==Opcode.GT))|| - (!neg2&&(op2==Opcode.LE))|| - (!neg2&&(op2==Opcode.LT))|| - (!neg2&&(op2==Opcode.GE)&&(size1a>=size2))|| - (!neg2&&(op2==Opcode.GT)&&(size1a>size2))|| - (neg2&&(op2==Opcode.LE)&&(size1a>size2))|| - (neg2&&(op2==Opcode.LT)&&(size1a>=size2))) + + if((op1==Opcode.EQ)||(op1==Opcode.LE)) + size1a=size1; + if((op1==Opcode.LT)||(op1==Opcode.NE)) + size1a=size1-1; + + if (((op2==Opcode.EQ)&&(size1a==size2))|| + ((op2==Opcode.NE)&&(size1a!=size2))|| + (op2==Opcode.LE)|| + (op2==Opcode.LT)|| + ((op2==Opcode.GE)&&(size1a>=size2))|| + ((op2==Opcode.GT)&&(size1a>size2))) return false; } } @@ -117,7 +263,7 @@ class AbstractInterferes { (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) { boolean neg2=dp.isNegated(); Opcode op2=((ExprPredicate)dp.getPredicate()).getOp(); - int size2=((ExprPredicate)dp.getPredicate()).leftsize(); + int size2=((ExprPredicate)dp.getPredicate()).rightSize(); if ((!neg2&&(op2==Opcode.EQ)&&(size2==0))|| (neg2&&(op2==Opcode.NE)&&(size2==0))|| (neg2&&(op2==Opcode.GE))|| @@ -142,6 +288,80 @@ class AbstractInterferes { return true; } + static private Opcode translateOpcode(boolean neg, Opcode op) { + if (neg) { + /* remove negation through opcode translation */ + if (op==Opcode.GT) + op=Opcode.LE; + else if (op==Opcode.GE) + op=Opcode.LT; + else if (op==Opcode.EQ) + op=Opcode.NE; + else if (op==Opcode.NE) + op=Opcode.EQ; + else if (op==Opcode.LT) + op=Opcode.GE; + else if (op==Opcode.LE) + op=Opcode.GT; + } + + return op; + } + + /** Does the increase (or decrease) in scope of a model defintion rule represented by sn + * falsify the predicate dp */ + + static public boolean interferes(ScopeNode sn, DNFPredicate dp) { + if (!sn.getSatisfy()&&(sn.getDescriptor() instanceof SetDescriptor)) { + Rule r=sn.getRule(); + Set target=r.getInclusion().getTargetDescriptors(); + boolean match=false; + for(int i=0;i