let pd_b_but_not_a infos stmt_a stmt_b =
  if stmt_a.sid = stmt_b.sid then S.empty
  else begin
    let a_to_ret, postdom_a = get_postdoms infos ~without:true stmt_a in
    let b_to_ret, postdom_b = get_postdoms infos ~without:false stmt_b in
    let res = match a_to_ret, b_to_ret with
      | truetrue | falsefalse -> S.diff postdom_b postdom_a
      | truefalse -> postdom_b
      | falsetrue -> (* no path [a, ret] but path [b, ret]
                        * possible when a there is a jump, because then we have
                        * either (A=G, B=S) or (A=S, B=L) *)

          S.empty (* because we don't want b postdoms to depend on the jump *)
    in
      Macros.debug 2 "pd_b_but_not_a for a=%d b=%d = %a"
          stmt_a.sid stmt_b.sid S.pretty res;
      res
  end