stress testing fixes

This commit is contained in:
caheckman 2019-10-16 09:24:30 -04:00
parent e738f515d0
commit 518522adc8

View file

@ -1686,9 +1686,6 @@ TransformVar *SubfloatFlow::setReplacement(Varnode *vn)
bool SubfloatFlow::traceForward(TransformVar *rvn) bool SubfloatFlow::traceForward(TransformVar *rvn)
{ {
int4 dcount = 0;
int4 hcount = 0;
list<PcodeOp *>::const_iterator iter,enditer; list<PcodeOp *>::const_iterator iter,enditer;
Varnode *vn = rvn->getOriginal(); Varnode *vn = rvn->getOriginal();
iter = vn->beginDescend(); iter = vn->beginDescend();
@ -1698,7 +1695,6 @@ bool SubfloatFlow::traceForward(TransformVar *rvn)
Varnode *outvn = op->getOut(); Varnode *outvn = op->getOut();
if ((outvn!=(Varnode *)0)&&(outvn->isMark())) if ((outvn!=(Varnode *)0)&&(outvn->isMark()))
continue; continue;
dcount += 1; // Count this descendant
int4 slot = op->getSlot(vn); int4 slot = op->getSlot(vn);
switch(op->code()) { switch(op->code()) {
case CPUI_COPY: case CPUI_COPY:
@ -1719,7 +1715,6 @@ bool SubfloatFlow::traceForward(TransformVar *rvn)
if (outrvn == (TransformVar *)0) return false; if (outrvn == (TransformVar *)0) return false;
opSetInput(rop,rvn,slot); opSetInput(rop,rvn,slot);
opSetOutput(rop,outrvn); opSetOutput(rop,outrvn);
hcount += 1; // Dealt with this descendant
break; break;
} }
case CPUI_FLOAT_FLOAT2FLOAT: case CPUI_FLOAT_FLOAT2FLOAT:
@ -1728,7 +1723,6 @@ bool SubfloatFlow::traceForward(TransformVar *rvn)
return false; return false;
TransformOp *rop = newPreexistingOp(1, (outvn->getSize() == precision) ? CPUI_COPY : CPUI_FLOAT_FLOAT2FLOAT, op); TransformOp *rop = newPreexistingOp(1, (outvn->getSize() == precision) ? CPUI_COPY : CPUI_FLOAT_FLOAT2FLOAT, op);
opSetInput(rop,rvn,0); opSetInput(rop,rvn,0);
hcount += 1; // Dealt with this descendant
terminatorCount += 1; terminatorCount += 1;
break; break;
} }
@ -1748,7 +1742,6 @@ bool SubfloatFlow::traceForward(TransformVar *rvn)
opSetInput(rop,rvn2,0); opSetInput(rop,rvn2,0);
opSetInput(rop,rvn,1); opSetInput(rop,rvn,1);
} }
hcount += 1; // Dealt with this descendant
terminatorCount += 1; terminatorCount += 1;
break; break;
} }
@ -1757,7 +1750,6 @@ bool SubfloatFlow::traceForward(TransformVar *rvn)
{ {
TransformOp *rop = newPreexistingOp(1,op->code(), op); TransformOp *rop = newPreexistingOp(1,op->code(), op);
opSetInput(rop,rvn,0); opSetInput(rop,rvn,0);
hcount += 1;
terminatorCount += 1; terminatorCount += 1;
break; break;
} }
@ -1765,10 +1757,6 @@ bool SubfloatFlow::traceForward(TransformVar *rvn)
return false; return false;
} }
} }
if (dcount != hcount) {
// Must account for all descendants of an input
if (vn->isInput()) return false;
}
return true; return true;
} }
@ -1810,6 +1798,7 @@ bool SubfloatFlow::traceBackward(TransformVar *rvn)
newvar = setReplacement(op->getIn(i)); newvar = setReplacement(op->getIn(i));
if (newvar == (TransformVar *)0) if (newvar == (TransformVar *)0)
return false; return false;
opSetInput(rop,newvar,i);
} }
} }
return true; return true;
@ -1903,6 +1892,7 @@ bool SubfloatFlow::doTrace(void)
{ {
if (format == (const FloatFormat *)0) if (format == (const FloatFormat *)0)
return false; return false;
terminatorCount = 0; // Have seen no terminators
bool retval = true; bool retval = true;
while(!worklist.empty()) { while(!worklist.empty()) {
if (!processNextWork()) { if (!processNextWork()) {
@ -1914,6 +1904,6 @@ bool SubfloatFlow::doTrace(void)
clearVarnodeMarks(); clearVarnodeMarks();
if (!retval) return false; if (!retval) return false;
if (terminatorCount == 0) return false; if (terminatorCount == 0) return false; // Must see at least 1 terminator
return true; return true;
} }