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)