let pd_b_but_not_a infos stmt_a stmt_b =
  if stmt_a.sid = stmt_b.sid then Stmt.Hptset.empty
  else begin
    let a_to_ret, postdom_a = PdgPostdom.get infos ~with_s:false stmt_a in
    let b_to_ret, postdom_b = PdgPostdom.get infos ~with_s:true stmt_b in
    let res = match a_to_ret, b_to_ret with
      | truetrue | falsefalse -> Stmt.Hptset.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) *)

          Stmt.Hptset.empty (* because we don't want b postdoms
                                 to depend on the jump *)

    in
      Pdg_parameters.debug ~dkey ~level:2 
        "pd_b_but_not_a for a=sid:%d b=sid:%d = %a"
        stmt_a.sid stmt_b.sid Stmt.Hptset.pretty res;
      res
  end