Skip to content

Commit 673ecd3

Browse files
authored
Merge pull request #3701 from tautschnig/fix-lshr-simplification
Fix simplification of logical right shift of signed bitvectors
2 parents 4329b28 + cfb6919 commit 673ecd3

File tree

5 files changed

+47
-0
lines changed

5 files changed

+47
-0
lines changed
257 Bytes
Binary file not shown.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class shift1
2+
{
3+
public static void main(String[] args)
4+
{
5+
assert (5 << 1) == 10;
6+
assert (5 >> 1) == 2;
7+
assert (-4 >> 1) == -2;
8+
assert (-4 >>> 1) == 2147483646;
9+
}
10+
}
11+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
shift1.class
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
^warning: ignoring

src/util/simplify_expr_int.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,8 @@ bool simplify_exprt::simplify_shifts(exprt &expr)
10081008
}
10091009
else if(distance>=0)
10101010
{
1011+
if(value < 0)
1012+
value += power(2, width);
10111013
value/=power(2, distance);
10121014
expr=from_integer(value, expr.type());
10131015
return false;

unit/util/simplify_expr.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,29 @@ TEST_CASE("Simplify extractbits")
155155
REQUIRE(!unmodified);
156156
REQUIRE(eb == from_integer(0xbe, unsignedbv_typet(8)));
157157
}
158+
159+
TEST_CASE("Simplify shift")
160+
{
161+
const symbol_tablet symbol_table;
162+
const namespacet ns(symbol_table);
163+
164+
REQUIRE(
165+
simplify_expr(shl_exprt(from_integer(5, signedbv_typet(8)), 1), ns) ==
166+
from_integer(10, signedbv_typet(8)));
167+
168+
REQUIRE(
169+
simplify_expr(ashr_exprt(from_integer(5, signedbv_typet(8)), 1), ns) ==
170+
from_integer(2, signedbv_typet(8)));
171+
172+
REQUIRE(
173+
simplify_expr(lshr_exprt(from_integer(5, unsignedbv_typet(8)), 1), ns) ==
174+
from_integer(2, unsignedbv_typet(8)));
175+
176+
REQUIRE(
177+
simplify_expr(ashr_exprt(from_integer(-4, signedbv_typet(8)), 1), ns) ==
178+
from_integer(-2, signedbv_typet(8)));
179+
180+
REQUIRE(
181+
simplify_expr(lshr_exprt(from_integer(-4, signedbv_typet(8)), 1), ns) ==
182+
from_integer(126, signedbv_typet(8)));
183+
}

0 commit comments

Comments
 (0)