anchor.diff:  -record(sig_st,
           { wl = wl_new() :: worklist(),
             committed = #{} :: #{ func_id() => [type()] },
  -          updates = #{} :: #{ func_id() => [type()] }}).
  +          updates = #{} :: #{ func_id() => [type()] },
  +          meta_cache = #{} :: meta_cache()}).
   
   signatures(StMap, FuncDb0) ->
       State0 = init_sig_st(StMap, FuncDb0),
       {State, FuncDb} = signatures_1(StMap, FuncDb0, State0),
  -    {State#sig_st.committed, FuncDb}.
  +    {State#sig_st.committed, State#sig_st.meta_cache, FuncDb}.
   
   signatures_1(StMap, FuncDb0, State0) ->
       case wl_next(State0#sig_st.wl) of
  
positive.code:     {Last, update_successor(Succ, Ts, Ls)};
  update_successors(#b_br{bool=#b_var{}=Bool,succ=Succ,fail=Fail}=Last0,
                    Ts, Ds, Ls0, UsedOnce) ->
      IsTempVar = sets:is_element(Bool, UsedOnce),
      case infer_types_br(Bool, Ts, IsTempVar, Ds) of
          {#{}=SuccTs, #{}=FailTs} ->
              Ls1 = update_successor(Succ, SuccTs, Ls0),
  
negative.code:         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],
  