let prop_cmp mem cmpop t1 e1 t2 e2 =
    let ct1 = Ctypes.object_of t1 in
    let ct2 = Ctypes.object_of t2 in
    match ct1,ct2 with
      |  C_pointer _,C_pointer _ ->
           (prop_cmp_ptr mem cmpop  e1 e2)
      | _ ->
          let ctr = Ctypes.promote ct1 ct2 in
          begin
            match ctr , ct1 , ct2 with
              | C_int ir , C_int i1 , C_int i2 ->
                  let t1 = expr_int mem i1 ir e1 in
                  let t2 = expr_int mem i2 ir e2 in
                  prop_icmp cmpop t1 t2
              | C_float fr, C_float f1, C_float f2 ->
                  let t1 = expr_float mem f1 fr e1 in
                  let t2 = expr_float mem f2 fr e2 in
                  prop_rcmp cmpop t1 t2
              | _ -> WpLog.fatal "[prop_cmp] non arithmetic relation"
          end