anchor.diff:      %% 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.
  +    %% potentially makes the time complexity quadratic, instead of
  +    %% linear for post order processing. We avoid drastic slowdowns by
  +    %% limiting how far we search forward to a common block that
  +    %% both the success and failure label will reach (see the comment
  +    %% in the first clause of shortcut_2/5).
   
       Ls = beam_ssa:rpo(Blocks),
       shortcut_opt(Ls, #{}, St).
  
positive.code:     end.
  
  %% Try to shortcut this block, branching to a successor.
  shortcut_2(L, From, Bs0, UnsetVars0, St) ->
      #b_blk{is=Is,last=Last} = get_block(L, St),
      case eval_is(Is, From, Bs0, St) of
          none ->
  
negative.code:             %% Some variables defined in this block are used by
              %% successors. We must update the set of unset variables.
              SetInThisBlock = [V || #b_set{dst=V} <- Is],
              cerl_sets:union(UnsetVars, cerl_sets:from_list(SetInThisBlock))
      end.
  
  shortcut_two_way(#b_br{succ=Succ,fail=Fail}, From, Bs0, UnsetVars0, St0) ->
  