}
//Translates signed BVDIV,BVMOD and BVREM into unsigned variety
- ASTNode ArrayTransformer::TranslateSignedDivModRem(const ASTNode& in)
+ ASTNode ArrayTransformer::TranslateSignedDivModRem(const ASTNode& in, NodeFactory* nf, STPMgr *bm)
{
assert(in.GetChildren().size() ==2);
cond_dividend,
nf->CreateTerm(BVUMINUS, len, modnode),
modnode);
-
- //put everything together, simplify, and return
- if (bm->UserFlags.optimize_flag)
- return simp->SimplifyTerm_TopLevel(n);
- else
return n;
}
nf->CreateTerm(BVPLUS, len, rev_node, divisor),
rev_node);
- if (bm->UserFlags.optimize_flag)
- return simp->SimplifyTerm_TopLevel(n);
- else
return n;
}
else if (SBVDIV == in.GetKind())
nf->CreateTerm(BVUMINUS, len, divnode),
divnode);
- if (bm->UserFlags.optimize_flag)
- return simp->SimplifyTerm_TopLevel(n);
- else
return n;
}
FatalError("TranslateSignedDivModRem:"\
"input must be signed DIV/MOD/REM", in);
- return ASTUndefined;
+ return bm->ASTUndefined;
}//end of TranslateSignedDivModRem()
|| SBVREM == result.GetKind()
|| SBVMOD == result.GetKind())
{
- result = TranslateSignedDivModRem(result);
+ ASTNode r = TranslateSignedDivModRem(result,nf,bm);
+ if (r != result && bm->UserFlags.optimize_flag)
+ {
+ result = simp->SimplifyTerm_TopLevel(r);
+ }
+ else
+ result = r;
}
}
break;
* Private Member Functions *
****************************************************************/
- ASTNode TranslateSignedDivModRem(const ASTNode& in);
ASTNode TransformTerm(const ASTNode& inputterm);
void assertTransformPostConditions(const ASTNode & term, ASTNodeSet& visited);
ASTNode TransformFormula(const ASTNode& form);
public:
+ static ASTNode TranslateSignedDivModRem(const ASTNode& in, NodeFactory*nf, STPMgr *bm);
//fill the arrayname_readindices vector if e0 is a READ(Arr,index)
//and index is a BVCONST
#include <cassert>
#include "SimplifyingNodeFactory.h"
#include "../../simplifier/simplifier.h"
+#include "../ArrayTransformer.h"
#include <cmath>
using BEEV::Kind;
break;
case BEEV::SBVMOD:
- if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(
- children[1].GetBVConst()))
- result = children[0];
- if (children[0] == children[1])
- result = bm.CreateZeroConst(width);
- break;
+ if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(
+ children[1].GetBVConst()))
+ result = children[0];
+ else if (children[0] == children[1])
+ result = bm.CreateZeroConst(width);
+ else
+ result = BEEV::ArrayTransformer::TranslateSignedDivModRem(hashing.CreateTerm(kind, width, children),this,&bm);
+ break;
case BEEV::BVDIV:
case BEEV::SBVDIV:
if (children[1].isConstant() && children[1] == bm.CreateOneConst(width))
result = children[0];
+ else
+ result = BEEV::ArrayTransformer::TranslateSignedDivModRem(hashing.CreateTerm(kind, width, children),this,&bm);
break;
case BEEV::SBVREM:
if (children[0] == children[1])
result = bm.CreateZeroConst(width);
- if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(
+ else if (children[0].isConstant() && CONSTANTBV::BitVector_is_empty(
children[0].GetBVConst()))
result = bm.CreateZeroConst(width);
- if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(
+ else if (children[1].isConstant() && CONSTANTBV::BitVector_is_full(
children[1].GetBVConst()))
result = bm.CreateZeroConst(width);
- if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(
+ else if (children[1].isConstant() && CONSTANTBV::BitVector_is_empty(
children[1].GetBVConst()))
result = children[0];
- if (children[1].isConstant() && bm.CreateOneConst(width) == children[1])
+ else if (children[1].isConstant() && bm.CreateOneConst(width) == children[1])
result = bm.CreateZeroConst(width);
+ else
+ result = BEEV::ArrayTransformer::TranslateSignedDivModRem(hashing.CreateTerm(kind, width, children),this,&bm);
break;
case BEEV::BVMOD: