let bitwise_and ~signed ~size e1 e2 =
let bitwise_and_pointer_ival p _ival =
Location_Bytes.location_shift
(Ival.inject_top None (Some Int.zero) Int.zero Int.one)
p
in
try
let v1 = project_ival e1 in
try
let v2 = project_ival e2 in
let result = Ival.bitwise_and ~signed ~size v1 v2
in
inject_ival result
with Not_based_on_null ->
bitwise_and_pointer_ival e2 v1
with Not_based_on_null ->
try
let v2 = project_ival e2 in
bitwise_and_pointer_ival e1 v2
with Not_based_on_null ->
join (topify_arith_origin e1) (topify_arith_origin e2)