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;