Add rewrites for BITVECTOR_ITE and BITVECTOR_COMP with const condition/child. (#2259)
authorAina Niemetz <aina.niemetz@gmail.com>
Thu, 2 Aug 2018 18:52:32 +0000 (11:52 -0700)
committerGitHub <noreply@github.com>
Thu, 2 Aug 2018 18:52:32 +0000 (11:52 -0700)
src/theory/bv/theory_bv_rewrite_rules.h
src/theory/bv/theory_bv_rewrite_rules_simplification.h
src/theory/bv/theory_bv_rewriter.cpp
src/theory/bv/theory_bv_utils.cpp

index 25f9eccbb0346f14d366bd568f1aabf9906597ef..1eb815ef911800f192fcfcdd5244795d4bdc188b 100644 (file)
@@ -104,6 +104,8 @@ enum RewriteRuleId
 
   /// simplification rules
   /// all of these rules decrease formula size
+  BvIte,
+  BvComp,
   ShlByConst,
   LshrByConst,
   AshrByConst,
@@ -240,6 +242,8 @@ inline std::ostream& operator << (std::ostream& out, RewriteRuleId ruleId) {
   case EvalRotateLeft :     out << "EvalRotateLeft";      return out;
   case EvalRotateRight :    out << "EvalRotateRight";     return out;
   case EvalNeg :            out << "EvalNeg";             return out;
+  case BvIte :              out << "BvIte";               return out;
+  case BvComp :             out << "BvComp";              return out;
   case ShlByConst :         out << "ShlByConst";          return out;
   case LshrByConst :        out << "LshrByConst";         return out;
   case AshrByConst :        out << "AshrByConst";         return out;
@@ -474,6 +478,7 @@ struct AllRewriteRules {
   RewriteRule<EvalRotateRight>      rule46;
   RewriteRule<EvalEquals>           rule47;
   RewriteRule<EvalNeg>              rule48;
+  RewriteRule<BvIte>                rule49;
   RewriteRule<ShlByConst>             rule50;
   RewriteRule<LshrByConst>             rule51;
   RewriteRule<AshrByConst>             rule52;
@@ -552,6 +557,7 @@ struct AllRewriteRules {
   RewriteRule<ZeroExtendUltConst> rule127;
   RewriteRule<MultSltMult> rule128;
   RewriteRule<NormalizeEqPlusNeg> rule129;
+  RewriteRule<BvComp> rule130;
 };
 
 template<> inline
index 397385996a1d92d7d6eb9360266c97adf2ee84df..9649fec77f982c359f19f020d34fc2b460c6bf8d 100644 (file)
@@ -29,6 +29,50 @@ namespace bv {
 
 // FIXME: this rules subsume the constant evaluation ones
 
+/**
+ * BvIte
+ *
+ * BITVECTOR_ITE with constant condition
+ */
+template <>
+inline bool RewriteRule<BvIte>::applies(TNode node)
+{
+  return (node.getKind() == kind::BITVECTOR_ITE && node[0].isConst());
+}
+
+template <>
+inline Node RewriteRule<BvIte>::apply(TNode node)
+{
+  Debug("bv-rewrite") << "RewriteRule<BvIte>(" << node << ")" << std::endl;
+  return utils::isZero(node[0]) ? node[2] : node[1];
+}
+
+/**
+ * BvComp
+ *
+ * BITVECTOR_COMP of children of size 1 with one constant child
+ */
+template <>
+inline bool RewriteRule<BvComp>::applies(TNode node)
+{
+  return (node.getKind() == kind::BITVECTOR_COMP
+          && utils::getSize(node[0]) == 1
+          && (node[0].isConst() || node[1].isConst()));
+}
+
+template <>
+inline Node RewriteRule<BvComp>::apply(TNode node)
+{
+  Debug("bv-rewrite") << "RewriteRule<BvComp>(" << node << ")" << std::endl;
+  NodeManager* nm = NodeManager::currentNM();
+  if (node[0].isConst())
+  {
+    return utils::isZero(node[0]) ? nm->mkNode(kind::BITVECTOR_NOT, node[1])
+                                  : Node(node[1]);
+  }
+  return utils::isZero(node[1]) ? nm->mkNode(kind::BITVECTOR_NOT, node[0])
+                                : Node(node[0]);
+}
 
 /**
  * ShlByConst
index aca44aa37d19441b857275aa4818f0e28d9f6430..6355da07df2a8b2f83b6f1b2f50ea86293b2643f 100644 (file)
@@ -166,12 +166,13 @@ RewriteResponse TheoryBVRewriter::RewriteSge(TNode node, bool prerewrite){
   return RewriteResponse(REWRITE_AGAIN_FULL, resultNode); 
 }
 
-RewriteResponse TheoryBVRewriter::RewriteITEBv(TNode node, bool prerewrite){
-  Node resultNode = LinearRewriteStrategy
-    < RewriteRule < EvalITEBv >
-       >::apply(node);
+RewriteResponse TheoryBVRewriter::RewriteITEBv(TNode node, bool prerewrite)
+{
+  Node resultNode =
+      LinearRewriteStrategy<RewriteRule<EvalITEBv>, RewriteRule<BvIte> >::apply(
+          node);
 
-  return RewriteResponse(REWRITE_DONE, resultNode); 
+  return RewriteResponse(REWRITE_DONE, resultNode);
 }
 
 RewriteResponse TheoryBVRewriter::RewriteNot(TNode node, bool prerewrite){
@@ -329,12 +330,13 @@ RewriteResponse TheoryBVRewriter::RewriteNor(TNode node, bool prerewrite) {
   return RewriteResponse(REWRITE_AGAIN_FULL, resultNode); 
 }
 
-RewriteResponse TheoryBVRewriter::RewriteComp(TNode node, bool prerewrite) {
-  Node resultNode = LinearRewriteStrategy
-    < RewriteRule < EvalComp >
-       >::apply(node);
+RewriteResponse TheoryBVRewriter::RewriteComp(TNode node, bool prerewrite)
+{
+  Node resultNode =
+      LinearRewriteStrategy<RewriteRule<EvalComp>, RewriteRule<BvComp> >::apply(
+          node);
 
-  return RewriteResponse(REWRITE_DONE, resultNode); 
+  return RewriteResponse(REWRITE_DONE, resultNode);
 }
 
 RewriteResponse TheoryBVRewriter::RewriteMult(TNode node, bool prerewrite) {
index 7c5a68259e6aa2cc691144c3ad0680cf939297df..e42882a122419d3ed60130d61449e38ab841800d 100644 (file)
@@ -89,7 +89,9 @@ unsigned isPow2Const(TNode node, bool& isNeg)
 
 bool isBvConstTerm(TNode node)
 {
-  if (node.getNumChildren() == 0) { return node.isConst();
+  if (node.getNumChildren() == 0)
+  {
+    return node.isConst();
   }
 
   for (const TNode& n : node)