anchor.diff:          SuccTypes0 =/= SuccTypes ->
               Entry = Entry0#func_info{succ_types=SuccTypes},
               {true, WlChanged, State, FuncDb#{ Id := Entry }}
  +    end.
  +
  +%% Get the metadata for a function. If this function has been analysed
  +%% previously, retrieve the previously calculated metadata.
  +sig_init_metadata(Id, Linear, Args, #sig_st{meta_cache=MetaCache} = State) ->
  +    case MetaCache of
  +        #{Id := Meta} ->
  +            {Meta, State};
  +        #{} ->
  +            Meta = init_metadata(Id, Linear, Args),
  +            {Meta, State#sig_st{meta_cache=MetaCache#{Id => Meta}}}
       end.
   
   sig_bs([{L, #b_blk{is=Is,last=Last0}} | Bs],
  
positive.code:     Ls = #{ ?EXCEPTION_BLOCK => {incoming, Ts},
              0 => {incoming, Ts} },
  
      Meta = init_metadata(Id, Linear, Args),
  
      Wl0 = State1#sig_st.wl,
  
      {State, SuccTypes} = sig_bs(Linear, Ds, Ls, FuncDb, #{}, [], Meta, State1),
  
      WlChanged = wl_changed(Wl0, State#sig_st.wl),
      #{ Id := #func_info{succ_types=SuccTypes0}=Entry0 } = FuncDb,
  
negative.code:                      _ -> RetCounter0
                   end,
  
      %% Calculate the set of variables that are only used once in the
      %% terminator of the block that defines them. That will allow us
      %% to discard type information for variables that will never be
      %% referenced by the successor blocks, potentially improving
      %% compilation times.
  
      Uses1 = used_once_last_uses(beam_ssa:used(Last), L, Uses0),
      Uses = used_once_2(reverse(Is), L, Uses1),
  