anchor.diff:           split_blocks/3,
            successors/1,successors/2,
            trim_unreachable/1,
  -         update_phi_labels/4,used/1]).
  +         update_phi_labels/4,used/1,
  +         uses/1,uses/2]).
   
   -export_type([b_module/0,b_function/0,b_blk/0,b_set/0,
                 b_ret/0,b_br/0,b_switch/0,terminator/0,
                 b_var/0,b_literal/0,b_remote/0,b_local/0,
                 value/0,argument/0,label/0,
                 var_name/0,var_base/0,literal_value/0,
  -              op/0,anno/0,block_map/0]).
  +              op/0,anno/0,block_map/0,dominator_map/0,
  +              rename_map/0,rename_proplist/0,usage_map/0,
  +              definition_map/0]).
   
   -include("beam_ssa.hrl").
   
  
positive.code: add_anno(Key, Val, #b_switch{anno=Anno}=Bl) ->
      Bl#b_switch{anno=Anno#{Key=>Val}}.
  
  -spec get_anno(atom(), b_blk()|b_set()|terminator()) -> any().
  
  get_anno(Key, Construct) ->
      maps:get(Key, get_anno(Construct)).
  
  get_anno(#b_blk{anno=Anno}) -> Anno;
  get_anno(#b_set{anno=Anno}) -> Anno;
  get_anno(#b_br{anno=Anno}) -> Anno;
  
negative.code: -type anno() :: #{atom() := any()}.
  
  -type block_map() :: #{label():=b_blk()}.
  -type dominator_map() :: #{label():=ordsets:ordset(label())}.
  -type usage_map() :: #{b_var():=[{label(),b_set() | terminator()}]}.
  -type definition_map() :: #{b_var():=b_set()}.
  -type rename_map() :: #{b_var():=value()}.
  -type rename_proplist() :: [{b_var(),value()}].
  
  %% Note: By default, dialyzer will collapse this type to atom().
  %% To avoid the collapsing, change the value of SET_LIMIT to 50 in the
  