diff --git a/lib/ivy.xml b/lib/ivy.xml
index 5bf392b47c..0e94f6096b 100644
--- a/lib/ivy.xml
+++ b/lib/ivy.xml
@@ -189,7 +189,7 @@ SPDX-License-Identifier: Apache-2.0
-
+
diff --git a/src/org/sosy_lab/java_smt/basicimpl/AbstractBitvectorFormulaManager.java b/src/org/sosy_lab/java_smt/basicimpl/AbstractBitvectorFormulaManager.java
index 19a797a485..46455c4829 100644
--- a/src/org/sosy_lab/java_smt/basicimpl/AbstractBitvectorFormulaManager.java
+++ b/src/org/sosy_lab/java_smt/basicimpl/AbstractBitvectorFormulaManager.java
@@ -340,7 +340,7 @@ public BitvectorFormula rotateLeft(BitvectorFormula pNumber, BitvectorFormula pT
protected TFormulaInfo rotateLeft(TFormulaInfo pNumber, TFormulaInfo pToRotate) {
int length = getLength(wrap(pNumber));
final TFormulaInfo lengthAsBv = makeBitvectorImpl(length, length);
- final TFormulaInfo toRotateInRange = smodulo(pToRotate, lengthAsBv);
+ final TFormulaInfo toRotateInRange = remainder(pToRotate, lengthAsBv, false);
return or(
shiftLeft(pNumber, toRotateInRange),
shiftRight(pNumber, subtract(lengthAsBv, toRotateInRange), false));
@@ -373,7 +373,7 @@ public BitvectorFormula rotateRight(BitvectorFormula pNumber, BitvectorFormula p
protected TFormulaInfo rotateRight(TFormulaInfo pNumber, TFormulaInfo pToRotate) {
int length = getLength(wrap(pNumber));
final TFormulaInfo lengthAsBv = makeBitvectorImpl(length, length);
- final TFormulaInfo toRotateInRange = smodulo(pToRotate, lengthAsBv);
+ final TFormulaInfo toRotateInRange = remainder(pToRotate, lengthAsBv, false);
return or(
shiftRight(pNumber, toRotateInRange, false),
shiftLeft(pNumber, subtract(lengthAsBv, toRotateInRange)));
diff --git a/src/org/sosy_lab/java_smt/test/BitvectorFormulaManagerTest.java b/src/org/sosy_lab/java_smt/test/BitvectorFormulaManagerTest.java
index 59cd0c3d92..84888140af 100644
--- a/src/org/sosy_lab/java_smt/test/BitvectorFormulaManagerTest.java
+++ b/src/org/sosy_lab/java_smt/test/BitvectorFormulaManagerTest.java
@@ -463,12 +463,20 @@ public void bvRotateByConstant() throws SolverException, InterruptedException {
@Test
public void bvRotateByBV() throws SolverException, InterruptedException {
- assume()
- .withMessage("Princess is too slow for this test")
- .that(solver)
- .isNotEqualTo(Solvers.PRINCESS);
+ int[] bitsizes;
+ switch (solverToUse()) {
+ case PRINCESS:
+ bitsizes = new int[] {2, 3}; // Princess is too slow for larger bitvectors
+ break;
+ case Z3:
+ bitsizes = new int[] {2, 3, 4, 8}; // Z3 is too slow for larger bitvectors since v4.15.0
+ break;
+ default:
+ bitsizes = new int[] {2, 3, 4, 8, 13, 25, 31};
+ break;
+ }
- for (int bitsize : new int[] {8, 13, 25, 31}) {
+ for (int bitsize : bitsizes) {
BitvectorFormula zero = bvmgr.makeBitvector(bitsize, 0);
BitvectorFormula a = bvmgr.makeVariable(bitsize, "a" + bitsize);
BitvectorFormula b = bvmgr.makeVariable(bitsize, "b" + bitsize);
@@ -600,6 +608,16 @@ public void bvModulo() throws SolverException, InterruptedException {
assertThatFormula(bvmgr.equal(bvmgr.smodulo(minusTen, minusThree), minusOne)).isTautological();
}
+ @Test
+ public void bvModulo2() throws SolverException, InterruptedException {
+ BitvectorFormula one = bvmgr.makeBitvector(2, 1);
+ BitvectorFormula two = bvmgr.makeBitvector(2, 2);
+ BitvectorFormula three = bvmgr.makeBitvector(2, 3);
+
+ // check that SMOD works for small bitvectors: 1_2 % 2_2 == 3_2 or 01 % 10 == 11
+ assertThatFormula(bvmgr.equal(bvmgr.smodulo(one, two), three)).isTautological();
+ }
+
@Test
public void bvModuloByZero() throws SolverException, InterruptedException {
BitvectorFormula ten = bvmgr.makeBitvector(8, 10);
diff --git a/src/org/sosy_lab/java_smt/test/RotationVisitorTest.java b/src/org/sosy_lab/java_smt/test/RotationVisitorTest.java
index be5b410894..d215e3df7c 100644
--- a/src/org/sosy_lab/java_smt/test/RotationVisitorTest.java
+++ b/src/org/sosy_lab/java_smt/test/RotationVisitorTest.java
@@ -51,8 +51,8 @@ public void rotateLeftTest() {
FunctionDeclarationKind.ITE,
FunctionDeclarationKind.EQ,
FunctionDeclarationKind.EQ,
- FunctionDeclarationKind.BV_SMOD,
- FunctionDeclarationKind.BV_SMOD,
+ FunctionDeclarationKind.BV_UREM,
+ FunctionDeclarationKind.BV_UREM,
FunctionDeclarationKind.BV_LSHR,
FunctionDeclarationKind.BV_SUB);
break;
@@ -62,8 +62,8 @@ public void rotateLeftTest() {
.containsExactly(
FunctionDeclarationKind.BV_OR,
FunctionDeclarationKind.BV_SHL,
- FunctionDeclarationKind.BV_SMOD,
- FunctionDeclarationKind.BV_SMOD,
+ FunctionDeclarationKind.BV_UREM,
+ FunctionDeclarationKind.BV_UREM,
FunctionDeclarationKind.BV_LSHR,
FunctionDeclarationKind.BV_SUB);
break;
@@ -114,8 +114,8 @@ public void rotateRightTest() {
FunctionDeclarationKind.ITE,
FunctionDeclarationKind.EQ,
FunctionDeclarationKind.EQ,
- FunctionDeclarationKind.BV_SMOD,
- FunctionDeclarationKind.BV_SMOD,
+ FunctionDeclarationKind.BV_UREM,
+ FunctionDeclarationKind.BV_UREM,
FunctionDeclarationKind.BV_SHL,
FunctionDeclarationKind.BV_SUB);
break;
@@ -125,8 +125,8 @@ public void rotateRightTest() {
.containsExactly(
FunctionDeclarationKind.BV_OR,
FunctionDeclarationKind.BV_SHL,
- FunctionDeclarationKind.BV_SMOD,
- FunctionDeclarationKind.BV_SMOD,
+ FunctionDeclarationKind.BV_UREM,
+ FunctionDeclarationKind.BV_UREM,
FunctionDeclarationKind.BV_LSHR,
FunctionDeclarationKind.BV_SUB);
break;