diff --git a/src/plugins/value/values/sign_value.ml b/src/plugins/value/values/sign_value.ml
index 4df3f8c2767e5a4a69dd3fb4dd91925aa46728d6..610900a67a76df81bcdbc86396b35232137f5f69 100644
--- a/src/plugins/value/values/sign_value.ml
+++ b/src/plugins/value/values/sign_value.ml
@@ -140,11 +140,13 @@ let bitwise_not typ v =
     else { pos = v.pos || v.zero; neg = false; zero = v.pos }
   | _ -> top
 
+let logical_not v = { pos = v.zero; neg = false; zero = v.pos || v.neg }
+
 let forward_unop typ op v =
   match op with
   | Neg -> `Value (neg_unop v)
   | BNot -> `Value (bitwise_not typ v)
-  | _ -> `Value top
+  | LNot -> `Value (logical_not v)
 
 let plus v1 v2 =
   let neg = v1.neg || v2.neg in
@@ -191,6 +193,18 @@ let bitwise_xor v1 v2 =
   let zero = (v1.zero && v2.zero) || (v1.pos && v2.pos) || (v1.neg && v2.neg) in
   { neg; pos; zero }
 
+let logical_and v1 v2 =
+  let pos = (v1.pos || v1.neg) && (v2.pos || v2.neg) in
+  let neg = false in
+  let zero = v1.zero || v2.zero in
+  { pos; neg; zero }
+
+let logical_or v1 v2 =
+  let pos = v1.pos || v1.neg || v2.pos || v2.neg in
+  let neg = false in
+  let zero = v1.zero && v2.zero in
+  { pos; neg; zero }
+
 let forward_binop _ op v1 v2 =
   match op with
   | PlusA  -> `Value (plus v1 v2)
@@ -200,6 +214,8 @@ let forward_binop _ op v1 v2 =
   | BAnd -> `Value (bitwise_and v1 v2)
   | BOr -> `Value (bitwise_or v1 v2)
   | BXor -> `Value (bitwise_xor v1 v2)
+  | LAnd -> `Value (logical_and v1 v2)
+  | LOr -> `Value (logical_or v1 v2)
   | _      -> `Value top
 
 let rewrap_integer range v =