anchor.diff:  %%% Common utilities.
   %%%
   
  -sub(#b_set{args=Args}=I, Sub) ->
  -    I#b_set{args=[sub_arg(A, Sub) || A <- Args]}.
  +sub(#b_set{args=Args}=I, Sub) when map_size(Sub) =/= 0 ->
  +    I#b_set{args=[sub_arg(A, Sub) || A <- Args]};
  +sub(I, _Sub) -> I.
   
   sub_arg(#b_var{}=Old, Sub) ->
       case Sub of
  
positive.code:     %% the diff.)
      %%
      %% Unfortunately, processing the blocks in reverse post order
      %% potentially makes the time complexity quadratic or even cubic if
      %% the ordset of unset variables grows large, instead of
      %% linear for post order processing. We try to still get reasonable
      %% compilation times by optimizations that will keep the constant
      %% factor as low as possible, and we try to avoid the cubic time
      %% complexity by trying to keep the set of unset variables as small
      %% as possible.
  
      Ls = beam_ssa:rpo(Blocks),
      shortcut_opt(Ls, #{}, St).
  
negative.code: 
              %% A two-way branch never branches to a phi node, so there
              %% is no need to check for phi nodes here.
              not cerl_sets:is_element(V, UnsetVars) andalso
                  cerl_sets:is_disjoint(Used0, UnsetVars) andalso
                  cerl_sets:is_disjoint(Used1, UnsetVars);
          #b_br{succ=Same,fail=Same} ->
              %% An unconditional branch must not jump to
              %% a phi node.
              not is_forbidden(Same, St) andalso
                  cerl_sets:is_disjoint(map_get(Same, Us), UnsetVars)
      end.
  
  is_forbidden(L, St) ->
  