summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/smt/smt_engine.cpp116
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules_normalization.h13
-rw-r--r--src/theory/theory_engine.cpp4
-rw-r--r--src/theory/unconstrained_simplifier.cpp2
-rw-r--r--test/regress/regress0/aufbv/Makefile.am3
-rw-r--r--test/regress/regress0/aufbv/fuzz10.smt168
6 files changed, 245 insertions, 61 deletions
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 7492be465..e86353eea 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -130,7 +130,7 @@ class SmtEnginePrivate {
IteSkolemMap d_iteSkolemMap;
/** The top level substitutions */
- theory::SubstitutionMap d_topLevelSubstitutions;
+ SubstitutionMap d_topLevelSubstitutions;
/**
* The last substitution that the SAT layer was told about.
@@ -141,7 +141,7 @@ class SmtEnginePrivate {
* that was pushed out to SAT.
* If d_lastSubstitutionPos == d_topLevelSubstitutions.end(),
* then nothing has been pushed out yet. */
- context::CDO<theory::SubstitutionMap::iterator> d_lastSubstitutionPos;
+ context::CDO<SubstitutionMap::iterator> d_lastSubstitutionPos;
static const bool d_doConstantProp = true;
@@ -299,7 +299,7 @@ SmtEngine::SmtEngine(ExprManager* em) throw(AssertionException) :
#undef CVC4_FOR_EACH_THEORY_STATEMENT
#endif
#define CVC4_FOR_EACH_THEORY_STATEMENT(THEORY) \
- d_theoryEngine->addTheory<theory::TheoryTraits<THEORY>::theory_class>(THEORY);
+ d_theoryEngine->addTheory<TheoryTraits<THEORY>::theory_class>(THEORY);
CVC4_FOR_EACH_THEORY;
// global push/pop around everything, to ensure proper destruction
@@ -458,57 +458,57 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
// by default, symmetry breaker is on only for QF_UF
if(! Options::current()->ufSymmetryBreakerSetByUser) {
- bool qf_uf = d_logic.isPure(theory::THEORY_UF) && !d_logic.isQuantified();
+ bool qf_uf = d_logic.isPure(THEORY_UF) && !d_logic.isQuantified();
Trace("smt") << "setting uf symmetry breaker to " << qf_uf << std::endl;
NodeManager::currentNM()->getOptions()->ufSymmetryBreaker = qf_uf;
}
// by default, nonclausal simplification is off for QF_SAT and for quantifiers
if(! Options::current()->simplificationModeSetByUser) {
- bool qf_sat = d_logic.isPure(theory::THEORY_BOOL) && !d_logic.isQuantified();
+ bool qf_sat = d_logic.isPure(THEORY_BOOL) && !d_logic.isQuantified();
bool quantifiers = d_logic.isQuantified();
Trace("smt") << "setting simplification mode to <" << d_logic.getLogicString() << "> " << (!qf_sat && !quantifiers) << std::endl;
NodeManager::currentNM()->getOptions()->simplificationMode = (qf_sat || quantifiers ? Options::SIMPLIFICATION_MODE_NONE : Options::SIMPLIFICATION_MODE_BATCH);
}
// If in arrays, set the UF handler to arrays
- if(d_logic.isPure(theory::THEORY_ARRAY) && !d_logic.isQuantified()) {
- theory::Theory::setUninterpretedSortOwner(theory::THEORY_ARRAY);
+ if(d_logic.isPure(THEORY_ARRAY) && !d_logic.isQuantified()) {
+ Theory::setUninterpretedSortOwner(THEORY_ARRAY);
} else {
- theory::Theory::setUninterpretedSortOwner(theory::THEORY_UF);
+ Theory::setUninterpretedSortOwner(THEORY_UF);
}
// Turn on ite simplification for QF_LIA and QF_AUFBV
if(! Options::current()->doITESimpSetByUser) {
bool iteSimp = !d_logic.isQuantified() &&
- ((d_logic.isPure(theory::THEORY_ARITH) && d_logic.isLinear() && !d_logic.isDifferenceLogic() && !d_logic.areRealsUsed()) ||
- (d_logic.isTheoryEnabled(theory::THEORY_ARRAY) && d_logic.isTheoryEnabled(theory::THEORY_UF) && d_logic.isTheoryEnabled(theory::THEORY_BV)));
+ ((d_logic.isPure(THEORY_ARITH) && d_logic.isLinear() && !d_logic.isDifferenceLogic() && !d_logic.areRealsUsed()) ||
+ (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_UF) && d_logic.isTheoryEnabled(THEORY_BV)));
Trace("smt") << "setting ite simplification to " << iteSimp << std::endl;
NodeManager::currentNM()->getOptions()->doITESimp = iteSimp;
}
// Turn on multiple-pass non-clausal simplification for QF_AUFBV
if(! Options::current()->repeatSimpSetByUser) {
bool repeatSimp = !d_logic.isQuantified() &&
- (d_logic.isTheoryEnabled(theory::THEORY_ARRAY) && d_logic.isTheoryEnabled(theory::THEORY_UF) && d_logic.isTheoryEnabled(theory::THEORY_BV));
+ (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_UF) && d_logic.isTheoryEnabled(THEORY_BV));
Trace("smt") << "setting repeat simplification to " << repeatSimp << std::endl;
NodeManager::currentNM()->getOptions()->repeatSimp = repeatSimp;
}
// Turn on unconstrained simplification for QF_AUFBV
if(! Options::current()->unconstrainedSimpSetByUser || Options::current()->incrementalSolving) {
- // bool qf_sat = d_logic.isPure(theory::THEORY_BOOL) && !d_logic.isQuantified();
+ // bool qf_sat = d_logic.isPure(THEORY_BOOL) && !d_logic.isQuantified();
// bool uncSimp = false && !qf_sat && !Options::current()->incrementalSolving;
bool uncSimp = !Options::current()->incrementalSolving && !d_logic.isQuantified() &&
- (d_logic.isTheoryEnabled(theory::THEORY_ARRAY) && d_logic.isTheoryEnabled(theory::THEORY_BV));
+ (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_BV));
Trace("smt") << "setting unconstrained simplification to " << uncSimp << std::endl;
NodeManager::currentNM()->getOptions()->unconstrainedSimp = uncSimp;
}
// Turn on arith rewrite equalities only for pure arithmetic
if(! Options::current()->arithRewriteEqSetByUser) {
- bool arithRewriteEq = d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified();
+ bool arithRewriteEq = d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified();
Trace("smt") << "setting arith rewrite equalities " << arithRewriteEq << std::endl;
NodeManager::currentNM()->getOptions()->arithRewriteEq = arithRewriteEq;
}
if(! Options::current()->arithHeuristicPivotsSetByUser){
int16_t heuristicPivots = 5;
- if(d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified()){
+ if(d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified()){
if(d_logic.isDifferenceLogic()){
heuristicPivots = -1;
}else if(!d_logic.areIntegersUsed()){
@@ -520,7 +520,7 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
}
if(! Options::current()->arithPivotThresholdSetByUser){
uint16_t pivotThreshold = 2;
- if(d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified()){
+ if(d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified()){
if(d_logic.isDifferenceLogic()){
pivotThreshold = 16;
}
@@ -530,7 +530,7 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
}
if(! Options::current()->arithStandardCheckVarOrderPivotsSetByUser){
int16_t varOrderPivots = -1;
- if(d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified()){
+ if(d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified()){
varOrderPivots = 200;
}
Trace("smt") << "setting arithStandardCheckVarOrderPivots " << varOrderPivots << std::endl;
@@ -545,13 +545,13 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
Options::DecisionMode decMode =
//QF_BV
( !d_logic.isQuantified() &&
- d_logic.isPure(theory::THEORY_BV)
+ d_logic.isPure(THEORY_BV)
) ||
//QF_AUFBV
(!d_logic.isQuantified() &&
- d_logic.isTheoryEnabled(theory::THEORY_ARRAY) &&
- d_logic.isTheoryEnabled(theory::THEORY_UF) &&
- d_logic.isTheoryEnabled(theory::THEORY_BV)
+ d_logic.isTheoryEnabled(THEORY_ARRAY) &&
+ d_logic.isTheoryEnabled(THEORY_UF) &&
+ d_logic.isTheoryEnabled(THEORY_BV)
)
? Options::DECISION_STRATEGY_JUSTIFICATION
: Options::DECISION_STRATEGY_INTERNAL;
@@ -872,7 +872,7 @@ void SmtEnginePrivate::removeITEs() {
// Remove all of the ITE occurrences and normalize
RemoveITE::run(d_assertionsToCheck, d_iteSkolemMap);
for (unsigned i = 0; i < d_assertionsToCheck.size(); ++ i) {
- d_assertionsToCheck[i] = theory::Rewriter::rewrite(d_assertionsToCheck[i]);
+ d_assertionsToCheck[i] = Rewriter::rewrite(d_assertionsToCheck[i]);
}
}
@@ -912,6 +912,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): "
<< "asserting to propagator" << endl;
for (unsigned i = 0; i < d_assertionsToPreprocess.size(); ++ i) {
+ Assert(Rewriter::rewrite(d_assertionsToPreprocess[i]) == d_assertionsToPreprocess[i]);
Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): asserting " << d_assertionsToPreprocess[i] << endl;
d_propagator.assert(d_assertionsToPreprocess[i]);
}
@@ -929,14 +930,15 @@ bool SmtEnginePrivate::nonClausalSimplify() {
}
// No, conflict, go through the literals and solve them
- theory::SubstitutionMap constantPropagations(d_smt.d_context);
+ SubstitutionMap constantPropagations(d_smt.d_context);
unsigned j = 0;
for(unsigned i = 0, i_end = d_nonClausalLearnedLiterals.size(); i < i_end; ++ i) {
// Simplify the literal we learned wrt previous substitutions
Node learnedLiteral = d_nonClausalLearnedLiterals[i];
+ Assert(Rewriter::rewrite(learnedLiteral) == learnedLiteral);
Node learnedLiteralNew = d_topLevelSubstitutions.apply(learnedLiteral);
if (learnedLiteral != learnedLiteralNew) {
- learnedLiteral = theory::Rewriter::rewrite(learnedLiteralNew);
+ learnedLiteral = Rewriter::rewrite(learnedLiteralNew);
}
for (;;) {
learnedLiteralNew = constantPropagations.apply(learnedLiteral);
@@ -944,7 +946,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
break;
}
++d_smt.d_numConstantProps;
- learnedLiteral = theory::Rewriter::rewrite(learnedLiteralNew);
+ learnedLiteral = Rewriter::rewrite(learnedLiteralNew);
}
// It might just simplify to a constant
if (learnedLiteral.isConst()) {
@@ -973,7 +975,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
// The literal should rewrite to true
Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): "
<< "solved " << learnedLiteral << endl;
- Assert(theory::Rewriter::rewrite(d_topLevelSubstitutions.apply(learnedLiteral)).isConst());
+ Assert(Rewriter::rewrite(d_topLevelSubstitutions.apply(learnedLiteral)).isConst());
// vector<pair<Node, Node> > equations;
// constantPropagations.simplifyLHS(d_topLevelSubstitutions, equations, true);
// if (equations.empty()) {
@@ -1026,26 +1028,6 @@ bool SmtEnginePrivate::nonClausalSimplify() {
break;
}
- if( Options::current()->incrementalSolving ||
- Options::current()->simplificationMode == Options::SIMPLIFICATION_MODE_INCREMENTAL ) {
- // Tell PropEngine about new substitutions
- SubstitutionMap::iterator pos = d_lastSubstitutionPos;
- if(pos == d_topLevelSubstitutions.end()) {
- pos = d_topLevelSubstitutions.begin();
- } else {
- ++pos;
- }
-
- while(pos != d_topLevelSubstitutions.end()) {
- // Push out this substitution
- TNode lhs = (*pos).first, rhs = (*pos).second;
- Node n = NodeManager::currentNM()->mkNode(lhs.getType().isBoolean() ? kind::IFF : kind::EQUAL, lhs, rhs);
- d_assertionsToCheck.push_back(n);
- Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): will notify SAT layer of substitution: " << n << endl;
- d_lastSubstitutionPos = pos;
- ++pos;
- }
- }
#ifdef CVC4_ASSERTIONS
// Check data structure invariants:
// 1. for each lhs of d_topLevelSubstitutions, does not appear anywhere in rhs of d_topLevelSubstitutions or anywhere in constantPropagations
@@ -1085,15 +1067,16 @@ bool SmtEnginePrivate::nonClausalSimplify() {
Node assertion = d_assertionsToPreprocess[i];
Node assertionNew = d_topLevelSubstitutions.apply(assertion);
if (assertion != assertionNew) {
- assertion = theory::Rewriter::rewrite(assertionNew);
+ assertion = Rewriter::rewrite(assertionNew);
}
+ Assert(Rewriter::rewrite(assertion) == assertion);
for (;;) {
assertionNew = constantPropagations.apply(assertion);
if (assertionNew == assertion) {
break;
}
++d_smt.d_numConstantProps;
- assertion = theory::Rewriter::rewrite(assertionNew);
+ assertion = Rewriter::rewrite(assertionNew);
}
s.insert(assertion);
d_assertionsToCheck.push_back(assertion);
@@ -1104,21 +1087,44 @@ bool SmtEnginePrivate::nonClausalSimplify() {
d_assertionsToPreprocess.clear();
NodeBuilder<> learnedBuilder(kind::AND);
+ Assert(d_realAssertionsEnd <= d_assertionsToCheck.size());
learnedBuilder << d_assertionsToCheck[d_realAssertionsEnd-1];
+ if( Options::current()->incrementalSolving ||
+ Options::current()->simplificationMode == Options::SIMPLIFICATION_MODE_INCREMENTAL ) {
+ // Keep substitutions
+ SubstitutionMap::iterator pos = d_lastSubstitutionPos;
+ if(pos == d_topLevelSubstitutions.end()) {
+ pos = d_topLevelSubstitutions.begin();
+ } else {
+ ++pos;
+ }
+
+ while(pos != d_topLevelSubstitutions.end()) {
+ // Push out this substitution
+ TNode lhs = (*pos).first, rhs = (*pos).second;
+ Node n = NodeManager::currentNM()->mkNode(lhs.getType().isBoolean() ? kind::IFF : kind::EQUAL, lhs, rhs);
+ learnedBuilder << n;
+ Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): will notify SAT layer of substitution: " << n << endl;
+ d_lastSubstitutionPos = pos;
+ ++pos;
+ }
+ }
+
for (unsigned i = 0; i < d_nonClausalLearnedLiterals.size(); ++ i) {
Node learned = d_nonClausalLearnedLiterals[i];
Node learnedNew = d_topLevelSubstitutions.apply(learned);
if (learned != learnedNew) {
- learned = theory::Rewriter::rewrite(learnedNew);
+ learned = Rewriter::rewrite(learnedNew);
}
+ Assert(Rewriter::rewrite(learned) == learned);
for (;;) {
learnedNew = constantPropagations.apply(learned);
if (learnedNew == learned) {
break;
}
++d_smt.d_numConstantProps;
- learned = theory::Rewriter::rewrite(learnedNew);
+ learned = Rewriter::rewrite(learnedNew);
}
if (s.find(learned) != s.end()) {
continue;
@@ -1260,7 +1266,9 @@ bool SmtEnginePrivate::simplifyAssertions()
// Call the theory preprocessors
d_smt.d_theoryEngine->preprocessStart();
for (unsigned i = 0; i < d_assertionsToCheck.size(); ++ i) {
+ Assert(Rewriter::rewrite(d_assertionsToCheck[i]) == d_assertionsToCheck[i]);
d_assertionsToCheck[i] = d_smt.d_theoryEngine->preprocess(d_assertionsToCheck[i]);
+ Assert(Rewriter::rewrite(d_assertionsToCheck[i]) == d_assertionsToCheck[i]);
}
}
@@ -1406,7 +1414,7 @@ void SmtEnginePrivate::processAssertions() {
for (unsigned i = 0; i < d_assertionsToPreprocess.size(); ++ i) {
Trace("simplify") << "applying to " << d_assertionsToPreprocess[i] << endl;
d_assertionsToPreprocess[i] =
- theory::Rewriter::rewrite(d_topLevelSubstitutions.apply(d_assertionsToPreprocess[i]));
+ Rewriter::rewrite(d_topLevelSubstitutions.apply(d_assertionsToPreprocess[i]));
Trace("simplify") << " got " << d_assertionsToPreprocess[i] << endl;
}
@@ -1510,7 +1518,7 @@ void SmtEnginePrivate::addFormula(TNode n)
Trace("smt") << "SmtEnginePrivate::addFormula(" << n << ")" << endl;
// Add the normalized formula to the queue
- d_assertionsToPreprocess.push_back(theory::Rewriter::rewrite(n));
+ d_assertionsToPreprocess.push_back(Rewriter::rewrite(n));
// If the mode of processing is incremental prepreocess and assert immediately
if (Options::current()->simplificationMode == Options::SIMPLIFICATION_MODE_INCREMENTAL) {
@@ -1714,7 +1722,7 @@ Expr SmtEngine::getValue(const Expr& e)
Node n = d_private->applySubstitutions(e.getNode());
// Normalize for the theories
- n = theory::Rewriter::rewrite(n);
+ n = Rewriter::rewrite(n);
Trace("smt") << "--- getting value of " << n << endl;
Node resultNode = d_theoryEngine->getValue(n);
@@ -1787,7 +1795,7 @@ SExpr SmtEngine::getAssignment() throw(ModalException, AssertionException) {
Assert((*i).getType() == boolType);
// Normalize
- Node n = theory::Rewriter::rewrite(*i);
+ Node n = Rewriter::rewrite(*i);
Trace("smt") << "--- getting value of " << n << endl;
Node resultNode = d_theoryEngine->getValue(n);
diff --git a/src/theory/bv/theory_bv_rewrite_rules_normalization.h b/src/theory/bv/theory_bv_rewrite_rules_normalization.h
index 896133e46..13c049c85 100644
--- a/src/theory/bv/theory_bv_rewrite_rules_normalization.h
+++ b/src/theory/bv/theory_bv_rewrite_rules_normalization.h
@@ -615,8 +615,7 @@ Node RewriteRule<SolveEq>::apply(TNode node) {
template<> inline
bool RewriteRule<BitwiseEq>::applies(TNode node) {
- if (node.getKind() != kind::EQUAL ||
- utils::getSize(node[0]) != 1) {
+ if (node.getKind() != kind::EQUAL) {
return false;
}
TNode term;
@@ -636,11 +635,15 @@ bool RewriteRule<BitwiseEq>::applies(TNode node) {
case kind::BITVECTOR_AND:
case kind::BITVECTOR_OR:
//operator BITVECTOR_XOR 2: "bitwise xor"
- case kind::BITVECTOR_NOT:
case kind::BITVECTOR_NAND:
case kind::BITVECTOR_NOR:
//operator BITVECTOR_XNOR 2 "bitwise xnor"
case kind::BITVECTOR_COMP:
+ if (utils::getSize(node[0]) != 1) {
+ return false;
+ }
+ break;
+ case kind::BITVECTOR_NOT:
case kind::BITVECTOR_NEG:
return true;
break;
@@ -678,7 +681,7 @@ Node RewriteRule<BitwiseEq>::apply(TNode node) {
term = node[0];
}
- bool eqOne = (c == BitVector(1,(unsigned)1));
+ bool eqOne = (c == BitVector(utils::getSize(node[0]),(unsigned)1));
switch (term.getKind()) {
case kind::BITVECTOR_AND:
@@ -724,7 +727,7 @@ Node RewriteRule<BitwiseEq>::apply(TNode node) {
return term[0].eqNode(term[1]).notNode();
}
case kind::BITVECTOR_NEG:
- return term[0].eqNode(utils::mkConst(c));
+ return term[0].eqNode(utils::mkConst(-c));
default:
break;
}
diff --git a/src/theory/theory_engine.cpp b/src/theory/theory_engine.cpp
index d85d8915b..30b9cd098 100644
--- a/src/theory/theory_engine.cpp
+++ b/src/theory/theory_engine.cpp
@@ -719,6 +719,7 @@ Node TheoryEngine::preprocess(TNode assertion) {
// If this is an atom, we preprocess its terms with the theory ppRewriter
if (Theory::theoryOf(current) != THEORY_BOOL) {
d_ppCache[current] = ppTheoryRewrite(current);
+ Assert(Rewriter::rewrite(d_ppCache[current]) == d_ppCache[current]);
continue;
}
@@ -735,6 +736,9 @@ Node TheoryEngine::preprocess(TNode assertion) {
}
// Mark the substitution and continue
Node result = builder;
+ if (result != current) {
+ result = Rewriter::rewrite(result);
+ }
Debug("theory::internal") << "TheoryEngine::preprocess(" << assertion << "): setting " << current << " -> " << result << endl;
d_ppCache[current] = result;
toVisit.pop_back();
diff --git a/src/theory/unconstrained_simplifier.cpp b/src/theory/unconstrained_simplifier.cpp
index 7e06297fb..d925a3366 100644
--- a/src/theory/unconstrained_simplifier.cpp
+++ b/src/theory/unconstrained_simplifier.cpp
@@ -694,7 +694,7 @@ void UnconstrainedSimplifier::processAssertions(vector<Node>& assertions)
processUnconstrained();
// d_substitutions.print(Message.getStream());
for (it = assertions.begin(); it != iend; ++it) {
- (*it) = d_substitutions.apply(*it);
+ (*it) = Rewriter::rewrite(d_substitutions.apply(*it));
}
}
diff --git a/test/regress/regress0/aufbv/Makefile.am b/test/regress/regress0/aufbv/Makefile.am
index 30a88f4a2..8c663f9ce 100644
--- a/test/regress/regress0/aufbv/Makefile.am
+++ b/test/regress/regress0/aufbv/Makefile.am
@@ -34,7 +34,8 @@ TESTS = \
fuzz06.smt \
fuzz07.smt \
fuzz08.smt \
- fuzz09.smt
+ fuzz09.smt \
+ fuzz10.smt
# failing
# fuzz01.smt \
diff --git a/test/regress/regress0/aufbv/fuzz10.smt b/test/regress/regress0/aufbv/fuzz10.smt
new file mode 100644
index 000000000..b838f80f0
--- /dev/null
+++ b/test/regress/regress0/aufbv/fuzz10.smt
@@ -0,0 +1,168 @@
+(benchmark fuzzsmt
+:logic QF_AUFBV
+:status unsat
+:extrafuns ((v0 BitVec[11]))
+:extrafuns ((v1 BitVec[8]))
+:extrafuns ((a2 Array[15:1]))
+:extrafuns ((a3 Array[6:8]))
+:extrafuns ((a4 Array[11:10]))
+:formula
+(let (?e5 bv8[4])
+(let (?e6 bv4728[14])
+(let (?e7 (bvsdiv (sign_extend[4] ?e5) v1))
+(let (?e8 (bvcomp (zero_extend[3] ?e7) v0))
+(let (?e9 (bvsrem ?e6 ?e6))
+(let (?e10 (store a3 (extract[12:7] ?e9) v1))
+(let (?e11 (store a4 (sign_extend[10] ?e8) (extract[9:0] ?e9)))
+(let (?e12 (select a2 (zero_extend[7] ?e7)))
+(let (?e13 (store ?e10 (extract[6:1] ?e7) v1))
+(let (?e14 (select ?e13 (zero_extend[2] ?e5)))
+(let (?e15 (bvudiv (sign_extend[13] ?e12) ?e9))
+(let (?e16 (bvsdiv (zero_extend[10] ?e12) v0))
+(let (?e17 (ite (bvsle ?e15 (zero_extend[13] ?e12)) bv1[1] bv0[1]))
+(let (?e18 (ite (bvuge (sign_extend[6] v1) ?e9) bv1[1] bv0[1]))
+(let (?e19 (ite (bvugt ?e16 (zero_extend[3] ?e14)) bv1[1] bv0[1]))
+(let (?e20 (bvneg ?e6))
+(let (?e21 (bvlshr (zero_extend[10] ?e5) ?e9))
+(let (?e22 (bvshl ?e20 (zero_extend[13] ?e12)))
+(let (?e23 (ite (= bv1[1] (extract[0:0] ?e12)) ?e21 ?e20))
+(let (?e24 (bvcomp ?e7 v1))
+(let (?e25 (bvsmod (zero_extend[3] ?e16) ?e15))
+(let (?e26 (bvsub ?e7 (sign_extend[7] ?e17)))
+(let (?e27 (bvnor (zero_extend[13] ?e8) ?e23))
+(flet ($e28 (bvsge (zero_extend[13] ?e18) ?e25))
+(flet ($e29 (bvugt ?e24 ?e17))
+(flet ($e30 (bvsle (sign_extend[13] ?e8) ?e21))
+(flet ($e31 (bvuge ?e20 (sign_extend[13] ?e19)))
+(flet ($e32 (bvugt (sign_extend[13] ?e8) ?e25))
+(flet ($e33 (distinct (sign_extend[13] ?e12) ?e27))
+(flet ($e34 (bvsgt (sign_extend[6] v1) ?e25))
+(flet ($e35 (bvult (zero_extend[7] ?e24) ?e7))
+(flet ($e36 (bvugt ?e20 ?e27))
+(flet ($e37 (= (zero_extend[7] ?e24) ?e26))
+(flet ($e38 (bvugt ?e25 (zero_extend[13] ?e24)))
+(flet ($e39 (bvsgt v0 (sign_extend[10] ?e18)))
+(flet ($e40 (bvult ?e8 ?e8))
+(flet ($e41 (bvsgt ?e27 ?e25))
+(flet ($e42 (bvslt ?e9 ?e6))
+(flet ($e43 (= ?e22 ?e23))
+(flet ($e44 (bvult (zero_extend[10] ?e19) v0))
+(flet ($e45 (bvsgt ?e24 ?e24))
+(flet ($e46 (bvsgt ?e26 (zero_extend[7] ?e24)))
+(flet ($e47 (bvule (sign_extend[13] ?e12) ?e9))
+(flet ($e48 (= ?e27 ?e21))
+(flet ($e49 (bvult ?e6 (sign_extend[3] v0)))
+(flet ($e50 (bvsle ?e23 (sign_extend[13] ?e17)))
+(flet ($e51 (bvugt ?e8 ?e12))
+(flet ($e52 (bvugt ?e22 (zero_extend[3] ?e16)))
+(flet ($e53 (bvsle ?e23 (sign_extend[6] ?e7)))
+(flet ($e54 (distinct (zero_extend[7] ?e12) ?e26))
+(flet ($e55 (bvult ?e23 (sign_extend[13] ?e19)))
+(flet ($e56 (= ?e27 ?e20))
+(flet ($e57 (bvule ?e15 (zero_extend[6] ?e7)))
+(flet ($e58 (bvsle (sign_extend[13] ?e18) ?e22))
+(flet ($e59 (bvuge ?e23 ?e25))
+(flet ($e60 (bvslt ?e20 (zero_extend[13] ?e17)))
+(flet ($e61 (bvsge (sign_extend[6] ?e14) ?e23))
+(flet ($e62 (bvugt ?e22 (sign_extend[13] ?e8)))
+(flet ($e63 (bvugt (zero_extend[7] ?e24) ?e26))
+(flet ($e64 (bvugt ?e9 (sign_extend[13] ?e18)))
+(flet ($e65 (bvsge ?e27 (zero_extend[6] v1)))
+(flet ($e66 (= (zero_extend[13] ?e18) ?e9))
+(flet ($e67 (bvsgt ?e15 (sign_extend[13] ?e8)))
+(flet ($e68 (distinct v0 (sign_extend[10] ?e17)))
+(flet ($e69 (bvugt ?e23 (sign_extend[3] v0)))
+(flet ($e70 (bvslt (zero_extend[3] ?e14) ?e16))
+(flet ($e71 (bvslt ?e27 (zero_extend[6] ?e7)))
+(flet ($e72 (bvsle ?e26 (zero_extend[7] ?e18)))
+(flet ($e73 (= ?e27 (zero_extend[3] ?e16)))
+(flet ($e74 (bvuge (zero_extend[3] v0) ?e15))
+(flet ($e75 (distinct (sign_extend[6] v1) ?e6))
+(flet ($e76 (bvsgt ?e17 ?e8))
+(flet ($e77 (bvsle ?e27 (zero_extend[6] ?e26)))
+(flet ($e78 (distinct ?e20 ?e9))
+(flet ($e79 (bvult (sign_extend[6] v1) ?e20))
+(flet ($e80 (bvule ?e17 ?e8))
+(flet ($e81 (bvult (sign_extend[13] ?e24) ?e20))
+(flet ($e82 (bvslt (zero_extend[6] v1) ?e25))
+(flet ($e83 (bvslt ?e19 ?e8))
+(flet ($e84 (bvsle ?e7 (sign_extend[7] ?e19)))
+(flet ($e85 (= ?e20 (sign_extend[6] ?e14)))
+(flet ($e86 (bvsge ?e16 (sign_extend[10] ?e24)))
+(flet ($e87 (bvsle ?e21 ?e15))
+(flet ($e88 (= ?e12 ?e12))
+(flet ($e89 (bvult (zero_extend[13] ?e19) ?e22))
+(flet ($e90 (= ?e5 ?e5))
+(flet ($e91 (iff $e68 $e86))
+(flet ($e92 (not $e49))
+(flet ($e93 (iff $e30 $e51))
+(flet ($e94 (not $e84))
+(flet ($e95 (not $e69))
+(flet ($e96 (if_then_else $e81 $e92 $e58))
+(flet ($e97 (or $e31 $e85))
+(flet ($e98 (and $e48 $e97))
+(flet ($e99 (implies $e70 $e70))
+(flet ($e100 (xor $e91 $e60))
+(flet ($e101 (or $e57 $e93))
+(flet ($e102 (xor $e63 $e76))
+(flet ($e103 (xor $e46 $e59))
+(flet ($e104 (not $e36))
+(flet ($e105 (or $e83 $e53))
+(flet ($e106 (or $e33 $e100))
+(flet ($e107 (if_then_else $e71 $e73 $e77))
+(flet ($e108 (xor $e47 $e45))
+(flet ($e109 (if_then_else $e90 $e64 $e74))
+(flet ($e110 (implies $e78 $e87))
+(flet ($e111 (iff $e28 $e80))
+(flet ($e112 (and $e101 $e103))
+(flet ($e113 (or $e102 $e40))
+(flet ($e114 (iff $e106 $e105))
+(flet ($e115 (if_then_else $e44 $e75 $e107))
+(flet ($e116 (not $e109))
+(flet ($e117 (if_then_else $e82 $e72 $e116))
+(flet ($e118 (xor $e65 $e108))
+(flet ($e119 (implies $e61 $e39))
+(flet ($e120 (not $e111))
+(flet ($e121 (if_then_else $e42 $e79 $e34))
+(flet ($e122 (iff $e96 $e41))
+(flet ($e123 (or $e99 $e55))
+(flet ($e124 (xor $e35 $e38))
+(flet ($e125 (iff $e110 $e50))
+(flet ($e126 (iff $e115 $e104))
+(flet ($e127 (or $e95 $e117))
+(flet ($e128 (or $e32 $e88))
+(flet ($e129 (if_then_else $e37 $e43 $e94))
+(flet ($e130 (and $e66 $e120))
+(flet ($e131 (implies $e118 $e119))
+(flet ($e132 (xor $e114 $e124))
+(flet ($e133 (if_then_else $e89 $e125 $e113))
+(flet ($e134 (implies $e126 $e122))
+(flet ($e135 (or $e130 $e127))
+(flet ($e136 (not $e98))
+(flet ($e137 (if_then_else $e135 $e132 $e136))
+(flet ($e138 (implies $e123 $e129))
+(flet ($e139 (or $e137 $e121))
+(flet ($e140 (and $e67 $e54))
+(flet ($e141 (not $e112))
+(flet ($e142 (and $e134 $e62))
+(flet ($e143 (if_then_else $e140 $e141 $e128))
+(flet ($e144 (iff $e138 $e131))
+(flet ($e145 (or $e143 $e133))
+(flet ($e146 (or $e139 $e142))
+(flet ($e147 (if_then_else $e145 $e146 $e144))
+(flet ($e148 (not $e52))
+(flet ($e149 (if_then_else $e147 $e29 $e148))
+(flet ($e150 (and $e149 $e149))
+(flet ($e151 (and $e56 $e150))
+(flet ($e152 (and $e151 (not (= ?e9 bv0[14]))))
+(flet ($e153 (and $e152 (not (= v0 bv0[11]))))
+(flet ($e154 (and $e153 (not (= v0 (bvnot bv0[11])))))
+(flet ($e155 (and $e154 (not (= v1 bv0[8]))))
+(flet ($e156 (and $e155 (not (= v1 (bvnot bv0[8])))))
+(flet ($e157 (and $e156 (not (= ?e15 bv0[14]))))
+(flet ($e158 (and $e157 (not (= ?e15 (bvnot bv0[14])))))
+(flet ($e159 (and $e158 (not (= ?e6 bv0[14]))))
+(flet ($e160 (and $e159 (not (= ?e6 (bvnot bv0[14])))))
+$e160
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback