File 2851-compiler-Remove-cerl_sets-usage.patch of Package erlang

From 827e8e6436bf6a34bbc2d9621c5fa0c941d3bb0e Mon Sep 17 00:00:00 2001
From: Wojtek Mach <wojtek@wojtekmach.pl>
Date: Thu, 14 Jan 2021 12:29:36 +0100
Subject: [PATCH 1/2] compiler: Remove cerl_sets usage

I used the following script to rewrite most call sites and I manually
fixed up the remaining `cerl_sets:from_list/1` ones.

    #!/bin/sh
    cd lib/compiler
    for file in src/*.erl; do
      sed -E -i.bak 's/cerl_sets:(set)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(add_element)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(is_element)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(del_element)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(union)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(intersection)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(is_disjoint)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(size)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(filter)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:(to_list)/sets:\1/' $file
      sed -E -i.bak 's/cerl_sets:new\(\)/sets:new\(\[\{version, 2\}\]\)/' $file
      sed -E -i.bak 's/cerl_sets:from_list\(([A-Z][A-Za-z0-9_]*)\)/sets:from_list\(\1, \[\{version, 2\}\]\)/' $file
      rm -f $file.bak
    done
---
 lib/compiler/src/beam_asm.erl             |  4 +-
 lib/compiler/src/beam_clean.erl           |  8 +--
 lib/compiler/src/beam_digraph.erl         | 12 ++--
 lib/compiler/src/beam_jump.erl            | 14 ++--
 lib/compiler/src/beam_ssa.erl             | 38 +++++------
 lib/compiler/src/beam_ssa_bool.erl        | 36 +++++------
 lib/compiler/src/beam_ssa_dead.erl        | 36 +++++------
 lib/compiler/src/beam_ssa_funs.erl        |  6 +-
 lib/compiler/src/beam_ssa_opt.erl         | 78 +++++++++++------------
 lib/compiler/src/beam_ssa_pre_codegen.erl | 46 ++++++-------
 lib/compiler/src/beam_ssa_throw.erl       |  8 +--
 lib/compiler/src/beam_ssa_type.erl        |  8 +--
 lib/compiler/src/beam_trim.erl            | 10 +--
 lib/compiler/src/beam_validator.erl       | 34 +++++-----
 lib/compiler/src/sys_core_alias.erl       | 10 +--
 lib/compiler/src/sys_core_fold.erl        | 26 ++++----
 lib/compiler/src/v3_core.erl              |  6 +-
 lib/compiler/src/v3_kernel.erl            | 24 +++----
 18 files changed, 202 insertions(+), 202 deletions(-)

diff --git a/lib/compiler/src/beam_asm.erl b/lib/compiler/src/beam_asm.erl
index b1cac9d171..d9de7031a0 100644
--- a/lib/compiler/src/beam_asm.erl
+++ b/lib/compiler/src/beam_asm.erl
@@ -67,7 +67,7 @@ assemble({Mod,Exp0,Attr0,Asm0,NumLabels}, ExtraChunks, CompileInfo, CompilerOpts
     Dict2 = shared_fun_wrappers(CompilerOpts, Dict1),
     NumFuncs = length(Asm0),
     {Asm,Attr} = on_load(Asm0, Attr0),
-    Exp = cerl_sets:from_list(Exp0),
+    Exp = sets:from_list(Exp0, [{version, 2}]),
     {Code,Dict} = assemble_1(Asm, Exp, Dict2, []),
     build_file(Code, Attr, Dict, NumLabels, NumFuncs,
                ExtraChunks, CompileInfo, CompilerOpts).
@@ -112,7 +112,7 @@ insert_on_load_instruction(Is0, Entry) ->
     Bef ++ [El,on_load|Is].
 
 assemble_1([{function,Name,Arity,Entry,Asm}|T], Exp, Dict0, Acc) ->
-    Dict1 = case cerl_sets:is_element({Name,Arity}, Exp) of
+    Dict1 = case sets:is_element({Name,Arity}, Exp) of
 		true ->
 		    beam_dict:export(Name, Arity, Entry, Dict0);
 		false ->
diff --git a/lib/compiler/src/beam_clean.erl b/lib/compiler/src/beam_clean.erl
index 67ac0a6201..643cc1c386 100644
--- a/lib/compiler/src/beam_clean.erl
+++ b/lib/compiler/src/beam_clean.erl
@@ -31,7 +31,7 @@ module({Mod,Exp,Attr,Fs0,_}, Opts) ->
     Order = [Lbl || {function,_,_,Lbl,_} <- Fs0],
     All = maps:from_list([{Lbl,Func} || {function,_,_,Lbl,_}=Func <- Fs0]),
     WorkList = rootset(Fs0, Exp, Attr),
-    Used = find_all_used(WorkList, All, cerl_sets:from_list(WorkList)),
+    Used = find_all_used(WorkList, All, sets:from_list(WorkList, [{version, 2}])),
     Fs1 = remove_unused(Order, Used, All),
     {Fs2,Lc} = clean_labels(Fs1),
     Fs3 = fix_swap(Fs2, Opts),
@@ -54,7 +54,7 @@ rootset(Fs, Root0, Attr) ->
 %% Remove the unused functions.
 
 remove_unused([F|Fs], Used, All) ->
-    case cerl_sets:is_element(F, Used) of
+    case sets:is_element(F, Used) of
 	false -> remove_unused(Fs, Used, All);
 	true -> [map_get(F, All)|remove_unused(Fs, Used, All)]
     end;
@@ -79,9 +79,9 @@ update_work_list([_|Is], Sets) ->
 update_work_list([], Sets) -> Sets.
 
 add_to_work_list(F, {Fs,Used}=Sets) ->
-    case cerl_sets:is_element(F, Used) of
+    case sets:is_element(F, Used) of
 	true -> Sets;
-	false -> {[F|Fs],cerl_sets:add_element(F, Used)}
+	false -> {[F|Fs],sets:add_element(F, Used)}
     end.
 
 
diff --git a/lib/compiler/src/beam_digraph.erl b/lib/compiler/src/beam_digraph.erl
index 800fcf4c22..56d86990e3 100644
--- a/lib/compiler/src/beam_digraph.erl
+++ b/lib/compiler/src/beam_digraph.erl
@@ -134,7 +134,7 @@ in_neighbours(#dg{in_es=InEsMap}, V) ->
 
 -spec is_path(graph(), vertex(), vertex()) -> boolean().
 is_path(G, From, To) ->
-    Seen = cerl_sets:new(),
+    Seen = sets:new([{version, 2}]),
     try
         _ = is_path_1([From], To, G, Seen),
         false
@@ -146,11 +146,11 @@ is_path(G, From, To) ->
 is_path_1([To|_], To, _G, _Seen) ->
     throw(true);
 is_path_1([V|Vs], To, G, Seen0) ->
-    case cerl_sets:is_element(V, Seen0) of
+    case sets:is_element(V, Seen0) of
         true ->
             is_path_1(Vs, To, G, Seen0);
         false ->
-            Seen1 = cerl_sets:add_element(V, Seen0),
+            Seen1 = sets:add_element(V, Seen0),
             Successors = out_neighbours(G, V),
             Seen = is_path_1(Successors, To, G, Seen1),
             is_path_1(Vs, To, G, Seen)
@@ -180,16 +180,16 @@ vertices(#dg{vs=Vs}) ->
 
 -spec reverse_postorder(graph(), [vertex()]) -> [vertex()].
 reverse_postorder(G, Vs) ->
-    Seen = cerl_sets:new(),
+    Seen = sets:new([{version, 2}]),
     {RPO, _} = reverse_postorder_1(Vs, G, Seen, []),
     RPO.
 
 reverse_postorder_1([V|Vs], G, Seen0, Acc0) ->
-    case cerl_sets:is_element(V, Seen0) of
+    case sets:is_element(V, Seen0) of
         true ->
             reverse_postorder_1(Vs, G, Seen0, Acc0);
         false ->
-            Seen1 = cerl_sets:add_element(V, Seen0),
+            Seen1 = sets:add_element(V, Seen0),
             Successors = out_neighbours(G, V),
             {Acc,Seen} = reverse_postorder_1(Successors, G, Seen1, Acc0),
             reverse_postorder_1(Vs, G, Seen, [V|Acc])
diff --git a/lib/compiler/src/beam_jump.erl b/lib/compiler/src/beam_jump.erl
index 0cb9c12f12..8738ce718f 100644
--- a/lib/compiler/src/beam_jump.erl
+++ b/lib/compiler/src/beam_jump.erl
@@ -548,7 +548,7 @@ extract_seq_1(_, _) -> no.
 	{
 	  entry :: beam_asm:label(), %Entry label (must not be moved).
 	  replace :: #{beam_asm:label() := beam_asm:label()}, %Labels to replace.
-	  labels :: cerl_sets:set()         %Set of referenced labels.
+	  labels :: sets:set()         %Set of referenced labels.
 	}).
 
 opt(Is0, CLabel) ->
@@ -692,7 +692,7 @@ skip_unreachable([], Acc, St) ->
 
 %% Add one or more label to the set of used labels.
 
-label_used({f,L}, St) -> St#st{labels=cerl_sets:add_element(L,St#st.labels)};
+label_used({f,L}, St) -> St#st{labels=sets:add_element(L,St#st.labels)};
 label_used([H|T], St0) -> label_used(T, label_used(H, St0));
 label_used([], St) -> St;
 label_used(_Other, St) -> St.
@@ -700,7 +700,7 @@ label_used(_Other, St) -> St.
 %% Test if label is used.
 
 is_label_used(L, St) ->
-    cerl_sets:is_element(L, St#st.labels).
+    sets:is_element(L, St#st.labels).
 
 %% is_unreachable_after(Instruction) -> boolean()
 %%  Test whether the code after Instruction is unreachable.
@@ -739,7 +739,7 @@ remove_unused_labels(Is) ->
     rem_unused(Is, Used, []).
 
 rem_unused([{label,Lbl}=I|Is0], Used, [Prev|_]=Acc) ->
-    case cerl_sets:is_element(Lbl, Used) of
+    case sets:is_element(Lbl, Used) of
 	false ->
 	    Is = case is_unreachable_after(Prev) of
 		     true -> drop_upto_label(Is0);
@@ -761,7 +761,7 @@ initial_labels([{line,_}|Is], Acc) ->
 initial_labels([{label,Lbl}|Is], Acc) ->
     initial_labels(Is, [Lbl|Acc]);
 initial_labels([{func_info,_,_,_},{label,Lbl}|_], Acc) ->
-    cerl_sets:from_list([Lbl|Acc]).
+    sets:from_list([Lbl|Acc], [{version, 2}]).
 
 drop_upto_label([{label,_}|_]=Is) -> Is;
 drop_upto_label([_|Is]) -> drop_upto_label(Is);
@@ -812,13 +812,13 @@ ulbl(I, Used) ->
         [] ->
             Used;
         [Lbl] ->
-            cerl_sets:add_element(Lbl, Used);
+            sets:add_element(Lbl, Used);
         [_|_]=L ->
             ulbl_list(L, Used)
     end.
 
 ulbl_list([L|Ls], Used) ->
-    ulbl_list(Ls, cerl_sets:add_element(L, Used));
+    ulbl_list(Ls, sets:add_element(L, Used));
 ulbl_list([], Used) -> Used.
 
 -spec instr_labels(Instruction) -> Labels when
diff --git a/lib/compiler/src/beam_ssa.erl b/lib/compiler/src/beam_ssa.erl
index 76303b34cb..0991c584fb 100644
--- a/lib/compiler/src/beam_ssa.erl
+++ b/lib/compiler/src/beam_ssa.erl
@@ -356,7 +356,7 @@ def(Ls, Blocks) ->
 
 def_unused(Ls, Unused, Blocks) ->
     Blks = [map_get(L, Blocks) || L <- Ls],
-    Preds = cerl_sets:from_list(Ls),
+    Preds = sets:from_list(Ls, [{version, 2}]),
     def_unused_1(Blks, Preds, [], Unused).
 
 %% dominators(Labels, BlockMap) -> {Dominators,Numbering}.
@@ -481,7 +481,7 @@ fold_blocks(Fun, Labels, Acc0, Blocks) ->
       Linear :: [{label(),b_blk()}].
 
 linearize(Blocks) ->
-    Seen = cerl_sets:new(),
+    Seen = sets:new([{version, 2}]),
     {Linear0,_} = linearize_1([0], Blocks, Seen, []),
     Linear = fix_phis(Linear0, #{}),
     Linear.
@@ -499,7 +499,7 @@ rpo(Blocks) ->
       Labels :: [label()].
 
 rpo(From, Blocks) ->
-    Seen = cerl_sets:new(),
+    Seen = sets:new([{version, 2}]),
     {Ls,_} = rpo_1(From, Blocks, Seen, []),
     Ls.
 
@@ -523,7 +523,7 @@ between(From, To, Preds, Blocks) ->
     %% gathering once seen since we're only interested in the blocks in between.
     %% Uninteresting blocks can still be added if `From` doesn't dominate `To`,
     %% but that has no effect on the final result.
-    Filter = between_make_filter([To], Preds, cerl_sets:from_list([From])),
+    Filter = between_make_filter([To], Preds, sets:from_list([From], [{version, 2}])),
     {Paths, _} = between_rpo([From], Blocks, Filter, []),
 
     Paths.
@@ -534,7 +534,7 @@ between(From, To, Preds, Blocks) ->
 rename_vars(Rename, Labels, Blocks) when is_list(Rename) ->
     rename_vars(maps:from_list(Rename), Labels, Blocks);
 rename_vars(Rename, Labels, Blocks) when is_map(Rename)->
-    Preds = cerl_sets:from_list(Labels),
+    Preds = sets:from_list(Labels, [{version, 2}]),
     F = fun(#b_set{op=phi,args=Args0}=Set) ->
                 Args = rename_phi_vars(Args0, Preds, Rename),
                 normalize(Set#b_set{args=Args});
@@ -580,7 +580,7 @@ trim_unreachable(Blocks) when is_map(Blocks) ->
     %% Could perhaps be optimized if there is any need.
     maps:from_list(linearize(Blocks));
 trim_unreachable([_|_]=Blocks) ->
-    trim_unreachable_1(Blocks, cerl_sets:from_list([0])).
+    trim_unreachable_1(Blocks, sets:from_list([0], [{version, 2}])).
 
 -spec used(b_blk() | b_set() | terminator()) -> [var_name()].
 
@@ -667,7 +667,7 @@ def_unused_is([#b_set{op=phi,dst=Dst,args=Args}|Is],
     %% We must be careful to only include variables that will
     %% be used when arriving from one of the predecessor blocks
     %% in Preds.
-    Unused1 = [V || {#b_var{}=V,L} <- Args, cerl_sets:is_element(L, Preds)],
+    Unused1 = [V || {#b_var{}=V,L} <- Args, sets:is_element(L, Preds)],
     Unused = ordsets:subtract(Unused0, ordsets:from_list(Unused1)),
     def_unused_is(Is, Preds, Def, Unused);
 def_unused_is([#b_set{dst=Dst}=I|Is], Preds, Def0, Unused0) ->
@@ -753,11 +753,11 @@ flatmapfold_instrs_1([], _, Blocks, Acc) ->
     {Blocks,Acc}.
 
 linearize_1([L|Ls], Blocks, Seen0, Acc0) ->
-    case cerl_sets:is_element(L, Seen0) of
+    case sets:is_element(L, Seen0) of
         true ->
             linearize_1(Ls, Blocks, Seen0, Acc0);
         false ->
-            Seen1 = cerl_sets:add_element(L, Seen0),
+            Seen1 = sets:add_element(L, Seen0),
             Block = map_get(L, Blocks),
             Successors = successors(Block),
             {Acc,Seen} = linearize_1(Successors, Blocks, Seen1, Acc0),
@@ -795,7 +795,7 @@ is_successor(L, Pred, S) ->
 
 trim_unreachable_1([{L,Blk0}|Bs], Seen0) ->
     Blk = trim_phis(Blk0, Seen0),
-    case cerl_sets:is_element(L, Seen0) of
+    case sets:is_element(L, Seen0) of
         false ->
             trim_unreachable_1(Bs, Seen0);
         true ->
@@ -803,7 +803,7 @@ trim_unreachable_1([{L,Blk0}|Bs], Seen0) ->
                 [] ->
                     [{L,Blk}|trim_unreachable_1(Bs, Seen0)];
                 [_|_]=Successors ->
-                    Seen = cerl_sets:union(Seen0, cerl_sets:from_list(Successors)),
+                    Seen = sets:union(Seen0, sets:from_list(Successors, [{version, 2}])),
                     [{L,Blk}|trim_unreachable_1(Bs, Seen)]
             end
     end;
@@ -815,17 +815,17 @@ trim_phis(#b_blk{is=[#b_set{op=phi}|_]=Is0}=Blk, Seen) ->
 trim_phis(Blk, _Seen) -> Blk.
 
 trim_phis_1([#b_set{op=phi,args=Args0}=I|Is], Seen) ->
-    Args = [P || {_,L}=P <- Args0, cerl_sets:is_element(L, Seen)],
+    Args = [P || {_,L}=P <- Args0, sets:is_element(L, Seen)],
     [I#b_set{args=Args}|trim_phis_1(Is, Seen)];
 trim_phis_1(Is, _Seen) -> Is.
 
 between_make_filter([L | Ls], Preds, Acc0) ->
-    case cerl_sets:is_element(L, Acc0) of
+    case sets:is_element(L, Acc0) of
         true ->
             between_make_filter(Ls, Preds, Acc0);
         false ->
             Next = map_get(L, Preds),
-            Acc1 = cerl_sets:add_element(L, Acc0),
+            Acc1 = sets:add_element(L, Acc0),
 
             Acc = between_make_filter(Next, Preds, Acc1),
             between_make_filter(Ls, Preds, Acc)
@@ -834,10 +834,10 @@ between_make_filter([], _Preds, Acc) ->
     Acc.
 
 between_rpo([L | Ls], Blocks, Filter0, Acc0) ->
-    case cerl_sets:is_element(L, Filter0) of
+    case sets:is_element(L, Filter0) of
         true ->
             Block = map_get(L, Blocks),
-            Filter1 = cerl_sets:del_element(L, Filter0),
+            Filter1 = sets:del_element(L, Filter0),
 
             Successors = successors(Block),
             {Acc, Filter} = between_rpo(Successors, Blocks, Filter1, Acc0),
@@ -849,12 +849,12 @@ between_rpo([], _, Filter, Acc) ->
     {Acc, Filter}.
 
 rpo_1([L|Ls], Blocks, Seen0, Acc0) ->
-    case cerl_sets:is_element(L, Seen0) of
+    case sets:is_element(L, Seen0) of
         true ->
             rpo_1(Ls, Blocks, Seen0, Acc0);
         false ->
             Block = map_get(L, Blocks),
-            Seen1 = cerl_sets:add_element(L, Seen0),
+            Seen1 = sets:add_element(L, Seen0),
             Successors = successors(Block),
             {Acc,Seen} = rpo_1(Successors, Blocks, Seen1, Acc0),
             rpo_1(Ls, Blocks, Seen, [L|Acc])
@@ -874,7 +874,7 @@ rename_var(#b_remote{mod=Mod0,name=Name0}=Remote, Rename) ->
 rename_var(Old, _) -> Old.
 
 rename_phi_vars([{Var,L}|As], Preds, Ren) ->
-    case cerl_sets:is_element(L, Preds) of
+    case sets:is_element(L, Preds) of
         true ->
             [{rename_var(Var, Ren),L}|rename_phi_vars(As, Preds, Ren)];
         false ->
diff --git a/lib/compiler/src/beam_ssa_bool.erl b/lib/compiler/src/beam_ssa_bool.erl
index b3b41e68c3..1404d8197f 100644
--- a/lib/compiler/src/beam_ssa_bool.erl
+++ b/lib/compiler/src/beam_ssa_bool.erl
@@ -208,7 +208,7 @@ pre_opt(Blocks, Count) ->
     Sub = maps:remove(uses, Sub1),
 
     %% Now do the actual optimizations.
-    Reached = cerl_sets:from_list([hd(Top)]),
+    Reached = sets:from_list([hd(Top)], [{version, 2}]),
     pre_opt(Top, Sub, Reached, Count, Blocks).
 
 -spec get_phi_info(Ls, Blocks, Sub0) -> Sub when
@@ -288,7 +288,7 @@ get_phi_info_single_use(Var, Sub) ->
 
 -spec pre_opt(Ls, Sub, Reached, Count0, Blocks0) -> {Blocks,Count} when
       Ls :: [beam_ssa:label()],
-      Reached :: cerl_sets:set(beam_ssa:label()),
+      Reached :: sets:set(beam_ssa:label()),
       Count0 :: beam_ssa:label(),
       Blocks0 :: beam_ssa:block_map(),
       Sub :: pre_sub_map(),
@@ -296,7 +296,7 @@ get_phi_info_single_use(Var, Sub) ->
       Blocks :: beam_ssa:block_map().
 
 pre_opt([L|Ls], Sub0, Reached0, Count0, Blocks) ->
-    case cerl_sets:is_element(L, Reached0) of
+    case sets:is_element(L, Reached0) of
         false ->
             %% This block will never be reached.
             pre_opt(Ls, Sub0, Reached0, Count0, maps:remove(L, Blocks));
@@ -313,14 +313,14 @@ pre_opt([L|Ls], Sub0, Reached0, Count0, Blocks) ->
                     Br = beam_ssa:normalize(Br0#b_br{bool=Bool}),
                     Blk = Blk0#b_blk{is=Is++[Test],last=Br},
                     Successors = beam_ssa:successors(Blk),
-                    Reached = cerl_sets:union(Reached0,
-                                              cerl_sets:from_list(Successors)),
+                    Reached = sets:union(Reached0,
+                                              sets:from_list(Successors, [{version, 2}])),
                     pre_opt(Ls, Sub, Reached, Count, Blocks#{L:=Blk});
                 Last ->
                     Blk = Blk0#b_blk{is=Is,last=Last},
                     Successors = beam_ssa:successors(Blk),
-                    Reached = cerl_sets:union(Reached0,
-                                              cerl_sets:from_list(Successors)),
+                    Reached = sets:union(Reached0,
+                                              sets:from_list(Successors, [{version, 2}])),
                     pre_opt(Ls, Sub, Reached, Count0, Blocks#{L:=Blk})
             end
     end;
@@ -329,7 +329,7 @@ pre_opt([], _, _, Count, Blocks) ->
 
 pre_opt_is([#b_set{op=phi,dst=Dst,args=Args0}=I0|Is], Reached, Sub0, Acc) ->
     Args1 = [{Val,From} || {Val,From} <- Args0,
-                           cerl_sets:is_element(From, Reached)],
+                           sets:is_element(From, Reached)],
     Args = sub_args(Args1, Sub0),
     case all_same(Args) of
         true ->
@@ -751,7 +751,7 @@ split_dom_block_is([], PreAcc) ->
 
 collect_digraph_blocks(FirstL, LastL, #b_br{succ=Succ,fail=Fail}, Blocks) ->
     Ws = gb_sets:singleton(FirstL),
-    Seen = cerl_sets:from_list([Succ,Fail]),
+    Seen = sets:from_list([Succ,Fail], [{version, 2}]),
     collect_digraph_blocks(Ws, LastL, Blocks, Seen, []).
 
 collect_digraph_blocks(Ws0, LastL, Blocks, Seen0, Acc0) ->
@@ -760,7 +760,7 @@ collect_digraph_blocks(Ws0, LastL, Blocks, Seen0, Acc0) ->
             Acc0;
         false ->
             {L,Ws1} = gb_sets:take_smallest(Ws0),
-            Seen = cerl_sets:add_element(L, Seen0),
+            Seen = sets:add_element(L, Seen0),
             Blk = map_get(L, Blocks),
             Acc = [{L,Blk}|Acc0],
             Ws = cdb_update_workset(L, Blk, LastL, Seen, Ws1),
@@ -774,7 +774,7 @@ cdb_update_workset(_L, Blk, _LastL, Seen, Ws) ->
     cdb_update_workset(Successors, Seen, Ws).
 
 cdb_update_workset([L|Ls], Seen, Ws) ->
-    case cerl_sets:is_element(L, Seen) of
+    case sets:is_element(L, Seen) of
         true ->
             cdb_update_workset(Ls, Seen, Ws);
         false ->
@@ -1509,16 +1509,16 @@ join_inits_1([], VarMap) ->
 %%%
 
 digraph_to_ssa(Ls, G, Blocks0) ->
-    Seen = cerl_sets:new(),
+    Seen = sets:new([{version, 2}]),
     {Blocks,_} = digraph_to_ssa(Ls, G, Blocks0, Seen),
     Blocks.
 
 digraph_to_ssa([L|Ls], G, Blocks0, Seen0) ->
-    Seen1 = cerl_sets:add_element(L, Seen0),
+    Seen1 = sets:add_element(L, Seen0),
     {Blk,Successors0} = digraph_to_ssa_blk(L, G, Blocks0, []),
     Blocks1 = Blocks0#{L=>Blk},
     Successors = [S || S <- Successors0,
-                       not cerl_sets:is_element(S, Seen1)],
+                       not sets:is_element(S, Seen1)],
     {Blocks,Seen} = digraph_to_ssa(Successors, G, Blocks1, Seen1),
     digraph_to_ssa(Ls, G, Blocks, Seen);
 digraph_to_ssa([], _G, Blocks, Seen) ->
@@ -1629,16 +1629,16 @@ del_out_edges(V, G) ->
     beam_digraph:del_edges(G, beam_digraph:out_edges(G, V)).
 
 covered(From, To, G) ->
-    Seen0 = cerl_sets:new(),
+    Seen0 = sets:new([{version, 2}]),
     {yes,Seen} = covered_1(From, To, G, Seen0),
-    cerl_sets:to_list(Seen).
+    sets:to_list(Seen).
 
 covered_1(To, To, _G, Seen) ->
     {yes,Seen};
 covered_1(From, To, G, Seen0) ->
     Vs0 = beam_digraph:out_neighbours(G, From),
-    Vs = [V || V <- Vs0, not cerl_sets:is_element(V, Seen0)],
-    Seen = cerl_sets:union(cerl_sets:from_list(Vs), Seen0),
+    Vs = [V || V <- Vs0, not sets:is_element(V, Seen0)],
+    Seen = sets:union(sets:from_list(Vs, [{version, 2}]), Seen0),
     case Vs of
         [] ->
             no;
diff --git a/lib/compiler/src/beam_ssa_dead.erl b/lib/compiler/src/beam_ssa_dead.erl
index a62da9dac2..7af48c0860 100644
--- a/lib/compiler/src/beam_ssa_dead.erl
+++ b/lib/compiler/src/beam_ssa_dead.erl
@@ -30,7 +30,7 @@
 -import(lists, [append/1,keymember/3,last/1,member/2,
                 reverse/1,sort/1,takewhile/2]).
 
--type used_vars() :: #{beam_ssa:label():=cerl_sets:set(beam_ssa:var_name())}.
+-type used_vars() :: #{beam_ssa:label():=sets:set(beam_ssa:var_name())}.
 
 -type basic_type_test() :: atom() | {'is_tagged_tuple',pos_integer(),atom()}.
 -type type_test() :: basic_type_test() | {'not',basic_type_test()}.
@@ -177,7 +177,7 @@ shortcut(L, _From, Bs, #st{rel_op=none,target=one_way}) when map_size(Bs) =:= 0
     %% is `one_way`, it implies the From block has a two-way `br` terminator.
     #b_br{bool=#b_literal{val=true},succ=L,fail=L};
 shortcut(L, From, Bs, St) ->
-    shortcut_1(L, From, Bs, cerl_sets:new(), St).
+    shortcut_1(L, From, Bs, sets:new([{version, 2}]), St).
 
 shortcut_1(L, From, Bs0, UnsetVars0, St) ->
     case shortcut_2(L, From, Bs0, UnsetVars0, St) of
@@ -195,7 +195,7 @@ shortcut_1(L, From, Bs0, UnsetVars0, St) ->
 
 %% Try to shortcut this block, branching to a successor.
 shortcut_2(L, From, Bs, UnsetVars, St) ->
-    case cerl_sets:size(UnsetVars) of
+    case sets:size(UnsetVars) of
         SetSize when SetSize > 64 ->
             %% This is an heuristic to limit the search for a forced label
             %% before it drastically slows down the compiler. Experiments
@@ -383,7 +383,7 @@ update_unset_vars(L, Is, Br, UnsetVars, #st{skippable=Skippable}) ->
             %% 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))
+            sets:union(UnsetVars, sets:from_list(SetInThisBlock, [{version, 2}]))
     end.
 
 shortcut_two_way(#b_br{succ=Succ,fail=Fail}, From, Bs0, UnsetVars0, St0) ->
@@ -412,14 +412,14 @@ is_br_safe(UnsetVars, Br, #st{us=Us}=St) ->
 
             %% 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);
+            not sets:is_element(V, UnsetVars) andalso
+                sets:is_disjoint(Used0, UnsetVars) andalso
+                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)
+                sets:is_disjoint(map_get(Same, Us), UnsetVars)
     end.
 
 is_forbidden(L, St) ->
@@ -546,7 +546,7 @@ eval_switch_1([], _Arg, _PrevOp, Fail) ->
     Fail.
 
 bind_var_if_used(L, Var, Val, #st{us=Us}) ->
-    case cerl_sets:is_element(Var, map_get(L, Us)) of
+    case sets:is_element(Var, map_get(L, Us)) of
         true -> #{Var=>Val};
         false -> #{}
     end.
@@ -1057,7 +1057,7 @@ used_vars([{L,#b_blk{is=Is}=Blk}|Bs], UsedVars0, Skip0) ->
     %% shortcut_opt/1.
 
     Successors = beam_ssa:successors(Blk),
-    Used0 = used_vars_succ(Successors, L, UsedVars0, cerl_sets:new()),
+    Used0 = used_vars_succ(Successors, L, UsedVars0, sets:new([{version, 2}])),
     Used = used_vars_blk(Blk, Used0),
     UsedVars = used_vars_phis(Is, L, Used, UsedVars0),
 
@@ -1068,8 +1068,8 @@ used_vars([{L,#b_blk{is=Is}=Blk}|Bs], UsedVars0, Skip0) ->
     %% shortcut_opt/1.
 
     Defined0 = [Def || #b_set{dst=Def} <- Is],
-    Defined = cerl_sets:from_list(Defined0),
-    MaySkip = cerl_sets:is_disjoint(Defined, Used0),
+    Defined = sets:from_list(Defined0, [{version, 2}]),
+    MaySkip = sets:is_disjoint(Defined, Used0),
     case MaySkip of
         true ->
             Skip = Skip0#{L=>true},
@@ -1086,11 +1086,11 @@ used_vars_succ([S|Ss], L, LiveMap, Live0) ->
         #{Key:=Live} ->
             %% The successor has a phi node, and the value for
             %% this block in the phi node is a variable.
-            used_vars_succ(Ss, L, LiveMap, cerl_sets:union(Live, Live0));
+            used_vars_succ(Ss, L, LiveMap, sets:union(Live, Live0));
         #{S:=Live} ->
             %% No phi node in the successor, or the value for
             %% this block in the phi node is a literal.
-            used_vars_succ(Ss, L, LiveMap, cerl_sets:union(Live, Live0));
+            used_vars_succ(Ss, L, LiveMap, sets:union(Live, Live0));
         #{} ->
             %% A peek_message block which has not been processed yet.
             used_vars_succ(Ss, L, LiveMap, Live0)
@@ -1108,7 +1108,7 @@ used_vars_phis(Is, L, Live0, UsedVars0) ->
             case [{P,V} || {#b_var{}=V,P} <- PhiArgs] of
                 [_|_]=PhiVars ->
                     PhiLive0 = rel2fam(PhiVars),
-                    PhiLive = [{{L,P},cerl_sets:union(cerl_sets:from_list(Vs), Live0)} ||
+                    PhiLive = [{{L,P},sets:union(sets:from_list(Vs, [{version, 2}]), Live0)} ||
                                   {P,Vs} <- PhiLive0],
                     maps:merge(UsedVars, maps:from_list(PhiLive));
                 [] ->
@@ -1118,14 +1118,14 @@ used_vars_phis(Is, L, Live0, UsedVars0) ->
     end.
 
 used_vars_blk(#b_blk{is=Is,last=Last}, Used0) ->
-    Used = cerl_sets:union(Used0, cerl_sets:from_list(beam_ssa:used(Last))),
+    Used = sets:union(Used0, sets:from_list(beam_ssa:used(Last), [{version, 2}])),
     used_vars_is(reverse(Is), Used).
 
 used_vars_is([#b_set{op=phi}|Is], Used) ->
     used_vars_is(Is, Used);
 used_vars_is([#b_set{dst=Dst}=I|Is], Used0) ->
-    Used1 = cerl_sets:union(Used0, cerl_sets:from_list(beam_ssa:used(I))),
-    Used = cerl_sets:del_element(Dst, Used1),
+    Used1 = sets:union(Used0, sets:from_list(beam_ssa:used(I), [{version, 2}])),
+    Used = sets:del_element(Dst, Used1),
     used_vars_is(Is, Used);
 used_vars_is([], Used) ->
     Used.
diff --git a/lib/compiler/src/beam_ssa_funs.erl b/lib/compiler/src/beam_ssa_funs.erl
index 394a631708..2b2feb5656 100644
--- a/lib/compiler/src/beam_ssa_funs.erl
+++ b/lib/compiler/src/beam_ssa_funs.erl
@@ -134,17 +134,17 @@ lfo_optimize_is([], _LFuns, _Trampolines) ->
     [].
 
 lfo_short_circuit(Call, Trampolines) ->
-    lfo_short_circuit(Call, Trampolines, cerl_sets:new()).
+    lfo_short_circuit(Call, Trampolines, sets:new([{version, 2}])).
 
 lfo_short_circuit(Call, Trampolines, Seen0) ->
     %% Beware of infinite loops! Get out if this call has been seen before.
-    case cerl_sets:is_element(Call, Seen0) of
+    case sets:is_element(Call, Seen0) of
         true ->
             Call;
         false ->
             case Trampolines of
                 #{Call := Other} ->
-                    Seen = cerl_sets:add_element(Call, Seen0),
+                    Seen = sets:add_element(Call, Seen0),
                     lfo_short_circuit(Other, Trampolines, Seen);
                 #{} ->
                     Call
diff --git a/lib/compiler/src/beam_ssa_opt.erl b/lib/compiler/src/beam_ssa_opt.erl
index 0b14e6eda3..72eb8ea3f1 100644
--- a/lib/compiler/src/beam_ssa_opt.erl
+++ b/lib/compiler/src/beam_ssa_opt.erl
@@ -96,7 +96,7 @@ fixpoint(_FuncIds, _Order, _Passes, StMap, FuncDb, 0) ->
 fixpoint(FuncIds0, Order0, Passes, StMap0, FuncDb0, N) ->
     {StMap, FuncDb} = phase(FuncIds0, Passes, StMap0, FuncDb0),
     Repeat = changed(FuncIds0, FuncDb0, FuncDb, StMap0, StMap),
-    case cerl_sets:size(Repeat) of
+    case sets:size(Repeat) of
         0 ->
             %% No change. Fixpoint reached.
             {StMap, FuncDb};
@@ -106,7 +106,7 @@ fixpoint(FuncIds0, Order0, Passes, StMap0, FuncDb0, N) ->
             %% information.
             {OrderA, OrderB} = Order0,
             Order = {OrderB, OrderA},
-            FuncIds = [Id || Id <- OrderA, cerl_sets:is_element(Id, Repeat)],
+            FuncIds = [Id || Id <- OrderA, sets:is_element(Id, Repeat)],
             fixpoint(FuncIds, Order, Passes, StMap, FuncDb, N - 1)
     end.
 
@@ -133,7 +133,7 @@ changed(PrevIds, FuncDb0, FuncDb, StMap0, StMap) ->
     %% have been updated for functions not included in the previous run.
 
     F = fun(Id, A) ->
-                case cerl_sets:is_element(Id, A) of
+                case sets:is_element(Id, A) of
                     true ->
                         A;
                     false ->
@@ -162,7 +162,7 @@ changed(PrevIds, FuncDb0, FuncDb, StMap0, StMap) ->
                         end
                 end
         end,
-    Ids = foldl(F, cerl_sets:new(), maps:keys(FuncDb)),
+    Ids = foldl(F, sets:new([{version, 2}]), maps:keys(FuncDb)),
 
     %% From all functions that were optimized in the previous run,
     %% find the functions that had any change in the SSA code. Those
@@ -175,7 +175,7 @@ changed(PrevIds, FuncDb0, FuncDb, StMap0, StMap) ->
     %% optimization turned off (and thus not included in FuncDb).
 
     foldl(fun(Id, A) ->
-                  case cerl_sets:is_element(Id, A) of
+                  case sets:is_element(Id, A) of
                       true ->
                           %% Already scheduled for another optimization.
                           %% No need to compare the SSA code.
@@ -184,17 +184,17 @@ changed(PrevIds, FuncDb0, FuncDb, StMap0, StMap) ->
                           %% Compare the SSA code before and after optimization.
                           case {map_get(Id, StMap0),map_get(Id, StMap)} of
                               {Same,Same} -> A;
-                              {_,_} -> cerl_sets:add_element(Id, A)
+                              {_,_} -> sets:add_element(Id, A)
                           end
                   end
           end, Ids, PrevIds).
 
 add_changed([Id|Ids], Opts, FuncDb, S0) when is_map_key(Id, FuncDb) ->
-    case cerl_sets:is_element(Id, S0) of
+    case sets:is_element(Id, S0) of
         true ->
             add_changed(Ids, Opts, FuncDb, S0);
         false ->
-            S1 = cerl_sets:add_element(Id, S0),
+            S1 = sets:add_element(Id, S0),
             #func_info{in=In,out=Out} = map_get(Id, FuncDb),
             S2 = case member(callers, Opts) of
                      true -> add_changed(In, Opts, FuncDb, S1);
@@ -417,16 +417,16 @@ get_call_order_po(StMap, FuncDb) ->
 
 gco_po(FuncDb) ->
     All = sort(maps:keys(FuncDb)),
-    {RPO,_} = gco_rpo(All, FuncDb, cerl_sets:new(), []),
+    {RPO,_} = gco_rpo(All, FuncDb, sets:new([{version, 2}]), []),
     reverse(RPO).
 
 gco_rpo([Id|Ids], FuncDb, Seen0, Acc0) ->
-    case cerl_sets:is_element(Id, Seen0) of
+    case sets:is_element(Id, Seen0) of
         true ->
             gco_rpo(Ids, FuncDb, Seen0, Acc0);
         false ->
             #func_info{out=Successors} = map_get(Id, FuncDb),
-            Seen1 = cerl_sets:add_element(Id, Seen0),
+            Seen1 = sets:add_element(Id, Seen0),
             {Acc,Seen} = gco_rpo(Successors, FuncDb, Seen1, Acc0),
             gco_rpo(Ids, FuncDb, Seen, [Id|Acc])
     end;
@@ -1037,7 +1037,7 @@ cse_suitable(#b_set{}) -> false.
 -record(fs,
         {s=undefined :: 'undefined' | 'cleared',
          regs=#{} :: #{beam_ssa:b_var():=beam_ssa:b_var()},
-         vars=cerl_sets:new() :: cerl_sets:set(),
+         vars=sets:new([{version, 2}]) :: sets:set(),
          fail=none :: 'none' | beam_ssa:label(),
          non_guards :: gb_sets:set(beam_ssa:label()),
          bs :: beam_ssa:block_map()
@@ -1213,7 +1213,7 @@ float_make_op(#b_set{op={bif,Op},dst=Dst,args=As0,anno=Anno}=I0,
     {Fr,Count2} = new_reg('@fr', Count1),
     FrDst = #b_var{name=Fr},
     I = I0#b_set{op={float,Op},dst=FrDst,args=As},
-    Vs = cerl_sets:add_element(Dst, Vs0),
+    Vs = sets:add_element(Dst, Vs0),
     Rs = Rs1#{Dst=>FrDst},
     Is = append(Is0) ++ [I],
     case S of
@@ -1297,7 +1297,7 @@ ssa_opt_live({#opt_st{ssa=Linear0}=St, FuncDb}) ->
 live_opt([{L,Blk0}|Bs], LiveMap0, Blocks) ->
     Blk1 = beam_ssa_share:block(Blk0, Blocks),
     Successors = beam_ssa:successors(Blk1),
-    Live0 = live_opt_succ(Successors, L, LiveMap0, cerl_sets:new()),
+    Live0 = live_opt_succ(Successors, L, LiveMap0, sets:new([{version, 2}])),
     {Blk,Live} = live_opt_blk(Blk1, Live0),
     LiveMap = live_opt_phis(Blk#b_blk.is, L, Live, LiveMap0),
     live_opt(Bs, LiveMap, Blocks#{L:=Blk});
@@ -1308,11 +1308,11 @@ live_opt_succ([S|Ss], L, LiveMap, Live0) ->
         #{{S,L}:=Live} ->
             %% The successor has a phi node, and the value for
             %% this block in the phi node is a variable.
-            live_opt_succ(Ss, L, LiveMap, cerl_sets:union(Live0, Live));
+            live_opt_succ(Ss, L, LiveMap, sets:union(Live0, Live));
         #{S:=Live} ->
             %% No phi node in the successor, or the value for
             %% this block in the phi node is a literal.
-            live_opt_succ(Ss, L, LiveMap, cerl_sets:union(Live0, Live));
+            live_opt_succ(Ss, L, LiveMap, sets:union(Live0, Live));
         #{} ->
             %% A peek_message block which has not been processed yet.
             live_opt_succ(Ss, L, LiveMap, Live0)
@@ -1330,7 +1330,7 @@ live_opt_phis(Is, L, Live0, LiveMap0) ->
             case [{P,V} || {#b_var{}=V,P} <- PhiArgs] of
                 [_|_]=PhiVars ->
                     PhiLive0 = rel2fam(PhiVars),
-                    PhiLive = [{{L,P},cerl_sets:union(cerl_sets:from_list(Vs), Live0)} ||
+                    PhiLive = [{{L,P},sets:union(sets:from_list(Vs, [{version, 2}]), Live0)} ||
                                   {P,Vs} <- PhiLive0],
                     maps:merge(LiveMap, maps:from_list(PhiLive));
                 [] ->
@@ -1340,13 +1340,13 @@ live_opt_phis(Is, L, Live0, LiveMap0) ->
     end.
 
 live_opt_blk(#b_blk{is=Is0,last=Last}=Blk, Live0) ->
-    Live1 = cerl_sets:union(Live0, cerl_sets:from_list(beam_ssa:used(Last))),
+    Live1 = sets:union(Live0, sets:from_list(beam_ssa:used(Last), [{version, 2}])),
     {Is,Live} = live_opt_is(reverse(Is0), Live1, []),
     {Blk#b_blk{is=Is},Live}.
 
 live_opt_is([#b_set{op=phi,dst=Dst}=I|Is], Live0, Acc) ->
-    Live = cerl_sets:del_element(Dst, Live0),
-    case cerl_sets:is_element(Dst, Live0) of
+    Live = sets:del_element(Dst, Live0),
+    case sets:is_element(Dst, Live0) of
         true ->
             live_opt_is(Is, Live, [I|Acc]);
         false ->
@@ -1355,10 +1355,10 @@ live_opt_is([#b_set{op=phi,dst=Dst}=I|Is], Live0, Acc) ->
 live_opt_is([#b_set{op={succeeded,guard},dst=SuccDst,args=[Dst]}=SuccI,
              #b_set{op=Op,dst=Dst}=I0|Is],
             Live0, Acc) ->
-    case {cerl_sets:is_element(SuccDst, Live0),
-          cerl_sets:is_element(Dst, Live0)} of
+    case {sets:is_element(SuccDst, Live0),
+          sets:is_element(Dst, Live0)} of
         {true, true} ->
-            Live = cerl_sets:del_element(SuccDst, Live0),
+            Live = sets:del_element(SuccDst, Live0),
             live_opt_is([I0|Is], Live, [SuccI|Acc]);
         {true, false} ->
             %% The result of the instruction before {succeeded,guard} is
@@ -1378,8 +1378,8 @@ live_opt_is([#b_set{op={succeeded,guard},dst=SuccDst,args=[Dst]}=SuccI,
                     I = I0#b_set{op=has_map_field,dst=SuccDst},
                     live_opt_is([I|Is], Live0, Acc);
                 _ ->
-                    Live1 = cerl_sets:del_element(SuccDst, Live0),
-                    Live = cerl_sets:add_element(Dst, Live1),
+                    Live1 = sets:del_element(SuccDst, Live0),
+                    Live = sets:add_element(Dst, Live1),
                     live_opt_is([I0|Is], Live, [SuccI|Acc])
             end;
         {false, true} ->
@@ -1388,19 +1388,19 @@ live_opt_is([#b_set{op={succeeded,guard},dst=SuccDst,args=[Dst]}=SuccI,
             live_opt_is(Is, Live0, Acc)
     end;
 live_opt_is([#b_set{dst=Dst}=I|Is], Live0, Acc) ->
-    case cerl_sets:is_element(Dst, Live0) of
+    case sets:is_element(Dst, Live0) of
         true ->
-            LiveUsed = cerl_sets:from_list(beam_ssa:used(I)),
-            Live1 = cerl_sets:union(Live0, LiveUsed),
-            Live = cerl_sets:del_element(Dst, Live1),
+            LiveUsed = sets:from_list(beam_ssa:used(I), [{version, 2}]),
+            Live1 = sets:union(Live0, LiveUsed),
+            Live = sets:del_element(Dst, Live1),
             live_opt_is(Is, Live, [I|Acc]);
         false ->
             case beam_ssa:no_side_effect(I) of
                 true ->
                     live_opt_is(Is, Live0, Acc);
                 false ->
-                    LiveUsed = cerl_sets:from_list(beam_ssa:used(I)),
-                    Live = cerl_sets:union(Live0, LiveUsed),
+                    LiveUsed = sets:from_list(beam_ssa:used(I), [{version, 2}]),
+                    Live = sets:union(Live0, LiveUsed),
                     live_opt_is(Is, Live, [I|Acc])
             end
     end;
@@ -1434,7 +1434,7 @@ ssa_opt_try({#opt_st{ssa=Linear0}=St, FuncDb}) ->
 opt_try([{L,#b_blk{is=[#b_set{op=new_try_tag}],
                       last=Last}=Blk0}|Bs0]) ->
     #b_br{succ=Succ,fail=Fail} = Last,
-    Ws = cerl_sets:from_list([Succ,Fail]),
+    Ws = sets:from_list([Succ,Fail], [{version, 2}]),
     try do_opt_try(Bs0, Ws) of
         Bs ->
             Blk = Blk0#b_blk{is=[],
@@ -1450,24 +1450,24 @@ opt_try([{L,Blk}|Bs]) ->
 opt_try([]) -> [].
 
 do_opt_try([{L,Blk}|Bs]=Bs0, Ws0) ->
-    case cerl_sets:is_element(L, Ws0) of
+    case sets:is_element(L, Ws0) of
         false ->
             %% This block is not reachable from the block with the
             %% `new_try_tag` instruction. Retain it. There is no
             %% need to check it for safety.
-            case cerl_sets:size(Ws0) of
+            case sets:size(Ws0) of
                 0 -> Bs0;
                 _ -> [{L,Blk}|do_opt_try(Bs, Ws0)]
             end;
         true ->
-            Ws1 = cerl_sets:del_element(L, Ws0),
+            Ws1 = sets:del_element(L, Ws0),
             #b_blk{is=Is0} = Blk,
             case is_safe_without_try(Is0, []) of
                 {safe,Is} ->
                     %% This block does not execute any instructions
                     %% that would require a try. Analyze successors.
                     Successors = beam_ssa:successors(Blk),
-                    Ws = cerl_sets:union(cerl_sets:from_list(Successors),
+                    Ws = sets:union(sets:from_list(Successors, [{version, 2}]),
                                          Ws1),
                     [{L,Blk#b_blk{is=Is}}|do_opt_try(Bs, Ws)];
                 unsafe ->
@@ -1483,7 +1483,7 @@ do_opt_try([{L,Blk}|Bs]=Bs0, Ws0) ->
             end
     end;
 do_opt_try([], Ws) ->
-    0 = cerl_sets:size(Ws),                     %Assertion.
+    0 = sets:size(Ws),                     %Assertion.
     [].
 
 is_safe_without_try([#b_set{op=kill_try_tag}|Is], Acc) ->
@@ -1526,7 +1526,7 @@ is_safe_without_try([], Acc) ->
 
 ssa_opt_bsm({#opt_st{ssa=Linear}=St, FuncDb}) ->
     Extracted0 = bsm_extracted(Linear),
-    Extracted = cerl_sets:from_list(Extracted0),
+    Extracted = sets:from_list(Extracted0, [{version, 2}]),
     {St#opt_st{ssa=bsm_skip(Linear, Extracted)}, FuncDb}.
 
 bsm_skip([{L,#b_blk{is=Is0}=Blk}|Bs0], Extracted) ->
@@ -1543,7 +1543,7 @@ bsm_skip_is([I0|Is], Extracted) ->
           when T =/= float, T =/= string, T =/= skip ->
             %% Note that it is never safe to skip matching
             %% of floats, even if the size is known to be correct.
-            I = case cerl_sets:is_element(Ctx, Extracted) of
+            I = case sets:is_element(Ctx, Extracted) of
                     true ->
                         I0;
                     false ->
diff --git a/lib/compiler/src/beam_ssa_pre_codegen.erl b/lib/compiler/src/beam_ssa_pre_codegen.erl
index 7fa018d7e8..6cda7b19de 100644
--- a/lib/compiler/src/beam_ssa_pre_codegen.erl
+++ b/lib/compiler/src/beam_ssa_pre_codegen.erl
@@ -1672,7 +1672,7 @@ find_loop_exit([_,_|_]=RmBlocks, Blocks) ->
     %% remove_message blocks.
     RPO = beam_ssa:rpo(Blocks),
     {Dominators,_} = beam_ssa:dominators(RPO, Blocks),
-    RmSet = cerl_sets:from_list(RmBlocks),
+    RmSet = sets:from_list(RmBlocks, [{version, 2}]),
     RmRPO = beam_ssa:rpo(RmBlocks, Blocks),
     find_loop_exit_1(RmRPO, RmSet, Dominators, Blocks);
 find_loop_exit(_, _) ->
@@ -1686,7 +1686,7 @@ find_loop_exit_1([?EXCEPTION_BLOCK|Ls], RmSet, Dominators, Blocks) ->
     find_loop_exit_1(Ls, RmSet, Dominators, Blocks);
 find_loop_exit_1([L|Ls0], RmSet, Dominators, Blocks) ->
     DomBy = map_get(L, Dominators),
-    case any(fun(E) -> cerl_sets:is_element(E, RmSet) end, DomBy) of
+    case any(fun(E) -> sets:is_element(E, RmSet) end, DomBy) of
         true ->
             %% This block is dominated by one of the remove_message blocks,
             %% which means that the block is part of only one clause.
@@ -1767,7 +1767,7 @@ find_rm_act([]) ->
 %%%
 
 -record(dk, {d :: ordsets:ordset(var_name()),
-             k :: cerl_sets:set(var_name())
+             k :: sets:set(var_name())
             }).
 
 %% find_yregs(St0) -> St.
@@ -1790,10 +1790,10 @@ find_yregs(#st{frames=[_|_]=Frames,args=Args,ssa=Blocks0}=St) ->
     St#st{ssa=Blocks}.
 
 find_yregs_1([{F,Defs}|Fs], Blocks0) ->
-    DK = #dk{d=Defs,k=cerl_sets:new()},
+    DK = #dk{d=Defs,k=sets:new([{version, 2}])},
     D0 = #{F=>DK},
     Ls = beam_ssa:rpo([F], Blocks0),
-    Yregs0 = cerl_sets:new(),
+    Yregs0 = sets:new([{version, 2}]),
     Yregs = find_yregs_2(Ls, Blocks0, D0, Yregs0),
     Blk0 = map_get(F, Blocks0),
     Blk = beam_ssa:add_anno(yregs, Yregs, Blk0),
@@ -1848,7 +1848,7 @@ find_update_succ([S|Ss], #dk{d=Defs0,k=Killed0}=DK0, D0) ->
     case D0 of
         #{S:=#dk{d=Defs1,k=Killed1}} ->
             Defs = ordsets:intersection(Defs0, Defs1),
-            Killed = cerl_sets:union(Killed0, Killed1),
+            Killed = sets:union(Killed0, Killed1),
             DK = #dk{d=Defs,k=Killed},
             D = D0#{S:=DK},
             find_update_succ(Ss, DK0, D);
@@ -1860,13 +1860,13 @@ find_update_succ([], _, D) -> D.
 
 find_yregs_is([#b_set{dst=Dst}=I|Is], #dk{d=Defs0,k=Killed0}=Ys, Yregs0) ->
     Yregs1 = intersect_used(I, Killed0),
-    Yregs = cerl_sets:union(Yregs0, Yregs1),
+    Yregs = sets:union(Yregs0, Yregs1),
     case beam_ssa:clobbers_xregs(I) of
         false ->
             Defs = ordsets:add_element(Dst, Defs0),
             find_yregs_is(Is, Ys#dk{d=Defs}, Yregs);
         true ->
-            Killed = cerl_sets:union(cerl_sets:from_list(Defs0), Killed0),
+            Killed = sets:union(sets:from_list(Defs0, [{version, 2}]), Killed0),
             Defs = [Dst],
             find_yregs_is(Is, Ys#dk{d=Defs,k=Killed}, Yregs)
     end;
@@ -1874,28 +1874,28 @@ find_yregs_is([], Ys, Yregs) -> {Yregs,Ys}.
 
 find_yregs_terminator(Terminator, #dk{k=Killed}, Yregs0) ->
     Yregs = intersect_used(Terminator, Killed),
-    cerl_sets:union(Yregs0, Yregs).
+    sets:union(Yregs0, Yregs).
 
 intersect_used(#b_br{bool=#b_var{}=V}, Set) ->
     intersect_used_keep_singleton(V, Set);
 intersect_used(#b_ret{arg=#b_var{}=V}, Set) ->
     intersect_used_keep_singleton(V, Set);
 intersect_used(#b_set{op=phi,args=Args}, Set) ->
-    cerl_sets:from_list([V || {#b_var{}=V,_} <- Args, cerl_sets:is_element(V, Set)]);
+    sets:from_list([V || {#b_var{}=V,_} <- Args, sets:is_element(V, Set)], [{version, 2}]);
 intersect_used(#b_set{args=Args}, Set) ->
-    cerl_sets:from_list(intersect_used_keep(used_args(Args), Set));
+    sets:from_list(intersect_used_keep(used_args(Args), Set), [{version, 2}]);
 intersect_used(#b_switch{arg=#b_var{}=V}, Set) ->
     intersect_used_keep_singleton(V, Set);
-intersect_used(_, _) -> cerl_sets:new().
+intersect_used(_, _) -> sets:new([{version, 2}]).
 
 intersect_used_keep_singleton(V, Set) ->
-    case cerl_sets:is_element(V, Set) of
-        true -> cerl_sets:from_list([V]);
-        false -> cerl_sets:new()
+    case sets:is_element(V, Set) of
+        true -> sets:from_list([V], [{version, 2}]);
+        false -> sets:new([{version, 2}])
     end.
 
 intersect_used_keep(Vs, Set) ->
-    [V || V <- Vs, cerl_sets:is_element(V, Set)].
+    [V || V <- Vs, sets:is_element(V, Set)].
 
 used_args([#b_var{}=V|As]) ->
     [V|used_args(As)];
@@ -1996,8 +1996,8 @@ copy_retval_1([], Blocks, Count) ->
 
 collect_yregs([#b_set{op=copy,dst=Y,args=[#b_var{}=X]}|Is],
               Yregs0) ->
-    true = cerl_sets:is_element(X, Yregs0),        %Assertion.
-    Yregs = cerl_sets:add_element(Y, cerl_sets:del_element(X, Yregs0)),
+    true = sets:is_element(X, Yregs0),        %Assertion.
+    Yregs = sets:add_element(Y, sets:del_element(X, Yregs0)),
     collect_yregs(Is, Yregs);
 collect_yregs([#b_set{}|Is], Yregs) ->
     collect_yregs(Is, Yregs);
@@ -2042,7 +2042,7 @@ copy_retval_is([#b_set{},#b_set{op=succeeded}]=Is, false, _Yregs, Copy, Count, A
 copy_retval_is([#b_set{op=Op,dst=#b_var{name=RetName}=Dst}=I0|Is], RC, Yregs,
            Copy0, Count0, Acc0) when Op =:= call; Op =:= make_fun ->
     {I1,Count1,Acc} = place_retval_copy(I0, Yregs, Copy0, Count0, Acc0),
-    case cerl_sets:is_element(Dst, Yregs) of
+    case sets:is_element(Dst, Yregs) of
         true ->
             {NewVar,Count} = new_var(RetName, Count1),
             Copy = #b_set{op=copy,dst=Dst,args=[NewVar]},
@@ -2100,7 +2100,7 @@ place_retval_copy(#b_set{args=[F|Args0]}=I, Yregs, Copy, Count0, Acc0) ->
     {I#b_set{args=[F|Args]},Count,Acc}.
 
 copy_func_args([#b_var{name=AName}=A|As], Yregs, Avoid, CopyAcc, Acc, Count0) ->
-    case cerl_sets:is_element(A, Yregs) of
+    case sets:is_element(A, Yregs) of
         true when A =/= Avoid ->
             {NewVar,Count} = new_var(AName, Count0),
             Copy = #b_set{op=copy,dst=NewVar,args=[A]},
@@ -2402,7 +2402,7 @@ reserve_yregs(#st{frames=Frames}=St0) ->
 
 reserve_yregs_1(L, #st{ssa=Blocks0,cnt=Count0,res=Res0}=St) ->
     Blk = map_get(L, Blocks0),
-    Yregs = ordsets:from_list(cerl_sets:to_list(beam_ssa:get_anno(yregs, Blk))),
+    Yregs = ordsets:from_list(sets:to_list(beam_ssa:get_anno(yregs, Blk))),
     RPO = beam_ssa:rpo([L], Blocks0),
     {Def,Unused} = beam_ssa:def_unused(RPO, Yregs, Blocks0),
     UsedYregs = ordsets:subtract(Yregs, Unused),
@@ -2592,7 +2592,7 @@ reserve_arg_regs([], _, Acc) -> Acc.
 
 reserve_zregs(RPO, Blocks, Intervals, Res) ->
     ShortLived0 = [V || {V,[{Start,End}]} <- Intervals, Start+2 =:= End],
-    ShortLived = cerl_sets:from_list(ShortLived0),
+    ShortLived = sets:from_list(ShortLived0, [{version, 2}]),
     F = fun(_, #b_blk{is=Is,last=Last}, A) ->
                 reserve_zreg(Is, Last, ShortLived, A)
         end,
@@ -2657,7 +2657,7 @@ use_zreg(_) -> maybe.
 %% If V is defined just before a branch, we may be able to combine it into a
 %% test instruction.
 reserve_test_zreg(#b_var{}=V, ShortLived, A) ->
-    case cerl_sets:is_element(V, ShortLived) of
+    case sets:is_element(V, ShortLived) of
         true -> [{V,z}|A];
         false -> A
     end.
diff --git a/lib/compiler/src/beam_ssa_throw.erl b/lib/compiler/src/beam_ssa_throw.erl
index 3e0ce49056..fc0d53e6ab 100644
--- a/lib/compiler/src/beam_ssa_throw.erl
+++ b/lib/compiler/src/beam_ssa_throw.erl
@@ -56,7 +56,7 @@
 %% Per-module scan state
 -record(gst, {tlh_roots :: gb_trees:tree(#b_local{}, gb_sets:set(handler())),
               tlh_edges=#{} :: #{ #b_local{} => gb_sets:set(#b_local{}) },
-              throws=cerl_sets:new() :: cerl_sets:set(#b_local{})}).
+              throws=sets:new([{version, 2}]) :: sets:set(#b_local{})}).
 
 %% Per-function scan state
 -record(lst, {suitability=#{} :: #{ #b_var{} => suitability() },
@@ -106,7 +106,7 @@ scan_1([], Gst) ->
          tlh_edges=Edges,
          throws=Throws} = Gst,
 
-    case cerl_sets:size(Throws) of
+    case sets:size(Throws) of
         0 ->
             no_throws;
         _ ->
@@ -174,7 +174,7 @@ si_is([#b_set{op=call,
       Id, _Lbl, #b_ret{arg=Dst}, Lst, Gst) ->
     %% Tail throw, handled by caller. We'll need to visit this function again.
     #gst{throws=Throws0} = Gst,
-    Throws = cerl_sets:add_element(Id, Throws0),
+    Throws = sets:add_element(Id, Throws0),
     {Lst, Gst#gst{throws=Throws}};
 si_is([#b_set{op=call,dst=Dst,args=[#b_local{}=Callee | _]}],
       Id, _Lbl, #b_ret{arg=Dst}, Lst, Gst) ->
@@ -297,7 +297,7 @@ add_tlh(Id, Callee, Lst, Gst) ->
 opt([#b_function{bs=Blocks0}=F | Fs], Throws, TLHs) ->
     Id = get_func_id(F),
 
-    Blocks = case {cerl_sets:is_element(Id, Throws), TLHs} of
+    Blocks = case {sets:is_element(Id, Throws), TLHs} of
                  {true, #{ Id := Handlers } } ->
                      opt_function(Handlers, Blocks0);
                  {_, _} ->
diff --git a/lib/compiler/src/beam_ssa_type.erl b/lib/compiler/src/beam_ssa_type.erl
index 434f90757c..21f3a70b9a 100644
--- a/lib/compiler/src/beam_ssa_type.erl
+++ b/lib/compiler/src/beam_ssa_type.erl
@@ -60,7 +60,7 @@
         { func_id :: func_id(),
           limit_return :: boolean(),
           params :: [beam_ssa:b_var()],
-          used_once :: cerl_sets:set(beam_ssa:b_var()) }).
+          used_once :: sets:set(beam_ssa:b_var()) }).
 
 -type type_db() :: #{ beam_ssa:var_name() := type() }.
 
@@ -1532,7 +1532,7 @@ update_successors(#b_br{bool=#b_literal{val=true},succ=Succ}=Last,
     {Last, update_successor(Succ, Ts, Ls)};
 update_successors(#b_br{bool=#b_var{}=Bool,succ=Succ,fail=Fail}=Last0,
                   Ts, Ds, Ls0, UsedOnce) ->
-    IsTempVar = cerl_sets:is_element(Bool, UsedOnce),
+    IsTempVar = sets:is_element(Bool, UsedOnce),
     case infer_types_br(Bool, Ts, IsTempVar, Ds) of
         {#{}=SuccTs, #{}=FailTs} ->
             Ls1 = update_successor(Succ, SuccTs, Ls0),
@@ -1547,7 +1547,7 @@ update_successors(#b_br{bool=#b_var{}=Bool,succ=Succ,fail=Fail}=Last0,
     end;
 update_successors(#b_switch{arg=#b_var{}=V,fail=Fail0,list=List0}=Last0,
                   Ts, Ds, Ls0, UsedOnce) ->
-    IsTempVar = cerl_sets:is_element(V, UsedOnce),
+    IsTempVar = sets:is_element(V, UsedOnce),
 
     {List1, FailTs, Ls1} =
         update_switch(List0, V, raw_type(V, Ts), Ts, Ds, Ls0, IsTempVar, []),
@@ -2114,7 +2114,7 @@ gcd(A, B) ->
 init_metadata(FuncId, Linear, Params) ->
     {RetCounter, Map0} = init_metadata_1(reverse(Linear), 0, #{}),
     Map = maps:without(Params, Map0),
-    UsedOnce = cerl_sets:from_list(maps:keys(Map)),
+    UsedOnce = sets:from_list(maps:keys(Map), [{version, 2}]),
 
     #metadata{ func_id = FuncId,
                limit_return = (RetCounter >= ?RETURN_LIMIT),
diff --git a/lib/compiler/src/beam_trim.erl b/lib/compiler/src/beam_trim.erl
index 05e320c255..7dae102181 100644
--- a/lib/compiler/src/beam_trim.erl
+++ b/lib/compiler/src/beam_trim.erl
@@ -24,7 +24,7 @@
 -import(lists, [any/2,member/2,reverse/1,reverse/2,splitwith/2,sort/1]).
 
 -record(st,
-	{safe :: cerl_sets:set(beam_asm:label()) %Safe labels.
+	{safe :: sets:set(beam_asm:label()) %Safe labels.
         }).
 
 -spec module(beam_utils:module_code(), [compile:option()]) ->
@@ -218,14 +218,14 @@ create_map(Trim, []) ->
 create_map(Trim, Moves) ->
     Map0 = [{Src,Dst-Trim} || {move,{y,Src},{y,Dst}} <- Moves],
     Map = maps:from_list(Map0),
-    IllegalTargets = cerl_sets:from_list([Dst || {move,_,{y,Dst}} <- Moves]),
+    IllegalTargets = sets:from_list([Dst || {move,_,{y,Dst}} <- Moves], [{version, 2}]),
     fun({y,Y0}) when Y0 < Trim ->
             case Map of
                 #{Y0:=Y} -> {y,Y};
                 #{} -> throw(not_possible)
             end;
        ({y,Y}) ->
-	    case cerl_sets:is_element(Y, IllegalTargets) of
+	    case sets:is_element(Y, IllegalTargets) of
 		true -> throw(not_possible);
 		false -> {y,Y-Trim}
 	    end;
@@ -330,7 +330,7 @@ safe_labels([{label,L}|Is], Acc) ->
     end;
 safe_labels([_|Is], Acc) ->
     safe_labels(Is, Acc);
-safe_labels([], Acc) -> cerl_sets:from_list(Acc).
+safe_labels([], Acc) -> sets:from_list(Acc, [{version, 2}]).
 
 is_safe_label([{'%',_}|Is]) ->
     is_safe_label(Is);
@@ -447,7 +447,7 @@ frame_size(_, _) -> throw(not_possible).
 frame_size_branch(0, Is, Safe) ->
     frame_size(Is, Safe);
 frame_size_branch(L, Is, Safe) ->
-    case cerl_sets:is_element(L, Safe) of
+    case sets:is_element(L, Safe) of
 	false -> throw(not_possible);
 	true -> frame_size(Is, Safe)
     end.
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index db2cc30e89..4df5c92c13 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -181,7 +181,7 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) ->
          %% A set of all registers containing "fragile" terms. That is, terms
          %% that don't exist on our process heap and would be destroyed by a
          %% GC.
-         fragile=cerl_sets:new() :: cerl_sets:set(),
+         fragile=sets:new([{version, 2}]) :: sets:set(),
          %% Number of Y registers.
          %%
          %% Note that this may be 0 if there's a frame without saved values,
@@ -228,7 +228,7 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) ->
          %% States at labels
          branched=#{}              :: #{ label() => state() },
          %% All defined labels
-         labels=cerl_sets:new()    :: cerl_sets:set(),
+         labels=sets:new([{version, 2}])    :: sets:set(),
          %% Information of other functions in the module
          ft=#{}                    :: #{ label() => map() },
          %% Counter for #value_ref{} creation
@@ -296,7 +296,7 @@ init_vst({_, _, Arity}, Level, Ft) ->
     Vst = #vst{branched=#{},
                current=#st{},
                ft=Ft,
-               labels=cerl_sets:new(),
+               labels=sets:new([{version, 2}]),
                level=Level},
     init_function_args(Arity - 1, Vst).
 
@@ -311,7 +311,7 @@ kill_heap_allocation(St) ->
 validate_branches(MFA, Vst) ->
     #vst{ branched=Targets0, labels=Labels0 } = Vst,
     Targets = maps:keys(Targets0),
-    Labels = cerl_sets:to_list(Labels0),
+    Labels = sets:to_list(Labels0),
     case Targets -- Labels of
         [_|_]=Undef ->
             Error = {undef_labels, Undef},
@@ -338,7 +338,7 @@ vi({label,Lbl}, #vst{current=St0,
     {St, Counter} = merge_states(Lbl, St0, Branched0, Counter0),
 
     Branched = Branched0#{ Lbl => St },
-    Labels = cerl_sets:add_element(Lbl, Labels0),
+    Labels = sets:add_element(Lbl, Labels0),
 
     Vst#vst{current=St,
             ref_ctr=Counter,
@@ -1791,7 +1791,7 @@ heap_alloc_2([], St) -> St.
 
 prune_x_regs(Live, #vst{current=St0}=Vst) when is_integer(Live) ->
     #st{fragile=Fragile0,xs=Xs0} = St0,
-    Fragile = cerl_sets:filter(fun({x,X}) ->
+    Fragile = sets:filter(fun({x,X}) ->
                                        X < Live;
                                   ({y,_}) ->
                                        true
@@ -1910,7 +1910,7 @@ assert_unique_map_keys([_,_|_]=Ls) ->
               assert_literal(L),
               L
           end || L <- Ls],
-    case length(Vs) =:= cerl_sets:size(cerl_sets:from_list(Vs)) of
+    case length(Vs) =:= sets:size(sets:from_list(Vs, [{version, 2}])) of
 	true -> ok;
 	false -> error(keys_not_unique)
     end.
@@ -2749,7 +2749,7 @@ mv_args([], _VsA, _VsB, Acc) ->
     Acc.
 
 merge_fragility(FragileA, FragileB) ->
-    cerl_sets:union(FragileA, FragileB).
+    sets:union(FragileA, FragileB).
 
 merge_ms_positions(MsPosA, MsPosB, Vs) ->
     Keys = if
@@ -2928,17 +2928,17 @@ set_receive_marker(New, #vst{current=#st{recv_marker=Current}=St0}=Vst) ->
 %% Marks Reg as fragile.
 mark_fragile(Reg, Vst) ->
     #vst{current=#st{fragile=Fragile0}=St0} = Vst,
-    Fragile = cerl_sets:add_element(Reg, Fragile0),
+    Fragile = sets:add_element(Reg, Fragile0),
     St = St0#st{fragile=Fragile},
     Vst#vst{current=St}.
 
 propagate_fragility(Reg, Args, #vst{current=St0}=Vst) ->
     #st{fragile=Fragile0} = St0,
 
-    Sources = cerl_sets:from_list(Args),
-    Fragile = case cerl_sets:is_disjoint(Sources, Fragile0) of
-                  true -> cerl_sets:del_element(Reg, Fragile0);
-                  false -> cerl_sets:add_element(Reg, Fragile0)
+    Sources = sets:from_list(Args, [{version, 2}]),
+    Fragile = case sets:is_disjoint(Sources, Fragile0) of
+                  true -> sets:del_element(Reg, Fragile0);
+                  false -> sets:add_element(Reg, Fragile0)
               end,
 
     St = St0#st{fragile=Fragile},
@@ -2948,9 +2948,9 @@ propagate_fragility(Reg, Args, #vst{current=St0}=Vst) ->
 %% a register.
 remove_fragility(Reg, Vst) ->
     #vst{current=#st{fragile=Fragile0}=St0} = Vst,
-    case cerl_sets:is_element(Reg, Fragile0) of
+    case sets:is_element(Reg, Fragile0) of
         true ->
-            Fragile = cerl_sets:del_element(Reg, Fragile0),
+            Fragile = sets:del_element(Reg, Fragile0),
             St = St0#st{fragile=Fragile},
             Vst#vst{current=St};
         false ->
@@ -2959,7 +2959,7 @@ remove_fragility(Reg, Vst) ->
 
 %% Marks all registers as durable.
 remove_fragility(#vst{current=St0}=Vst) ->
-    St = St0#st{fragile=cerl_sets:new()},
+    St = St0#st{fragile=sets:new([{version, 2}])},
     Vst#vst{current=St}.
 
 assert_durable_term(Src, Vst) ->
@@ -2969,7 +2969,7 @@ assert_durable_term(Src, Vst) ->
 assert_not_fragile({Kind,_}=Src, Vst) when Kind =:= x; Kind =:= y ->
     check_limit(Src),
     #vst{current=#st{fragile=Fragile}} = Vst,
-    case cerl_sets:is_element(Src, Fragile) of
+    case sets:is_element(Src, Fragile) of
         true -> error({fragile_message_reference, Src});
         false -> ok
     end;
diff --git a/lib/compiler/src/sys_core_alias.erl b/lib/compiler/src/sys_core_alias.erl
index 9343999980..96259d1530 100644
--- a/lib/compiler/src/sys_core_alias.erl
+++ b/lib/compiler/src/sys_core_alias.erl
@@ -46,7 +46,7 @@
 -define(HAS_SUBS(Sub), Sub#sub.t =/= none).
 
 -record(sub, {p=#{} :: #{term() => ?NOTSET | atom()},              %% Found pattern substitutions
-              v=cerl_sets:new() :: cerl_sets:set(cerl:var_name()), %% Variables used by patterns
+              v=sets:new([{version, 2}]) :: sets:set(cerl:var_name()), %% Variables used by patterns
               t=none :: temp()}).                                  %% Temporary information from pre to post
 
 -type sub() :: #sub{}.
@@ -64,7 +64,7 @@
         none
         | {temp, temp()}
         | {sub, sub()}
-        | {clause, [term()], [term()], cerl_sets:set(cerl:var_name()), temp()}.
+        | {clause, [term()], [term()], sets:set(cerl:var_name()), temp()}.
 
 -spec module(cerl:c_module(), [compile:option()]) ->
         {'ok',cerl:c_module(),[]}.
@@ -237,13 +237,13 @@ new_var_name(Key, #sub{p=Pat}=Sub) ->
 %% merge_variables/2
 
 get_variables(NodesList) ->
-    cerl_sets:from_list([Var || Node <- NodesList, Var <- cerl_trees:variables(Node)]).
+    sets:from_list([Var || Node <- NodesList, Var <- cerl_trees:variables(Node)], [{version, 2}]).
 
 is_disjoint_variables(Vars1, Vars2) ->
-    cerl_sets:is_disjoint(Vars1, Vars2).
+    sets:is_disjoint(Vars1, Vars2).
 
 merge_variables(Vars1, Vars2) ->
-    cerl_sets:union(Vars1, Vars2).
+    sets:union(Vars1, Vars2).
 
 %% get_pattern_keys/2
 %% put_pattern_keys/2
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index d987c6f3b5..704bddc2ac 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -95,7 +95,7 @@
 
 %% Variable value info.
 -record(sub, {v=[],                                 %Variable substitutions
-              s=cerl_sets:new() :: cerl_sets:set(), %Variables in scope
+              s=sets:new([{version, 2}]) :: sets:set(), %Variables in scope
               t=#{} :: map(),                       %Types
               in_guard=false}).                     %In guard or not.
 
@@ -1319,7 +1319,7 @@ is_subst(_) -> false.
 %%  to force renaming if variables in the scope occurs as pattern
 %%  variables.
 
-sub_new() -> #sub{v=orddict:new(),s=cerl_sets:new(),t=#{}}.
+sub_new() -> #sub{v=orddict:new(),s=sets:new([{version, 2}]),t=#{}}.
 
 sub_new(#sub{}=Sub) ->
     Sub#sub{v=orddict:new(),t=#{}}.
@@ -1336,7 +1336,7 @@ sub_set_var(#c_var{name=V}, Val, Sub) ->
 sub_set_name(V, Val, #sub{v=S,s=Scope,t=Tdb0}=Sub) ->
     Tdb1 = kill_types(V, Tdb0),
     Tdb = copy_type(V, Val, Tdb1),
-    Sub#sub{v=orddict:store(V, Val, S),s=cerl_sets:add_element(V, Scope),t=Tdb}.
+    Sub#sub{v=orddict:store(V, Val, S),s=sets:add_element(V, Scope),t=Tdb}.
 
 sub_subst_var(#c_var{name=V}, Val, #sub{v=S0}) ->
     %% Fold chained substitutions.
@@ -1344,7 +1344,7 @@ sub_subst_var(#c_var{name=V}, Val, #sub{v=S0}) ->
 
 sub_add_scope(Vs, #sub{s=Scope0}=Sub) ->
     Scope = foldl(fun(V, S) when is_integer(V); is_atom(V) ->
-			  cerl_sets:add_element(V, S)
+			  sets:add_element(V, S)
 		  end, Scope0, Vs),
     Sub#sub{s=Scope}.
 
@@ -1355,7 +1355,7 @@ sub_subst_scope(#sub{v=S0,s=Scope}=Sub) ->
                   _ ->
                       -1
               end,
-    S = sub_subst_scope_1(cerl_sets:to_list(Scope), Initial, S0),
+    S = sub_subst_scope_1(sets:to_list(Scope), Initial, S0),
     Sub#sub{v=orddict:from_list(S)}.
 
 %% The keys in an orddict must be unique. Make them so!
@@ -1364,7 +1364,7 @@ sub_subst_scope_1([H|T], Key, Acc) ->
 sub_subst_scope_1([], _, Acc) -> Acc.
 
 sub_is_in_scope(#c_var{name=V}, #sub{s=Scope}) ->
-    cerl_sets:is_element(V, Scope).
+    sets:is_element(V, Scope).
 
 %% warn_no_clause_match(CaseOrig, CaseOpt) -> ok
 %%  Generate a warning if none of the user-specified clauses
@@ -2116,7 +2116,7 @@ is_bool_expr_list([]) -> true.
 %%  (i.e. it cannot fail).
 %%
 is_safe_bool_expr(Core) ->
-    is_safe_bool_expr_1(Core, cerl_sets:new()).
+    is_safe_bool_expr_1(Core, sets:new([{version, 2}])).
 
 is_safe_bool_expr_1(#c_call{module=#c_literal{val=erlang},
                             name=#c_literal{val=is_function},
@@ -2146,7 +2146,7 @@ is_safe_bool_expr_1(#c_let{vars=Vars,arg=Arg,body=B}, BoolVars) ->
 	true ->
 	    case {is_safe_bool_expr_1(Arg, BoolVars),Vars} of
 		{true,[#c_var{name=V}]} ->
-		    is_safe_bool_expr_1(B, cerl_sets:add_element(V, BoolVars));
+		    is_safe_bool_expr_1(B, sets:add_element(V, BoolVars));
 		{false,_} ->
 		    is_safe_bool_expr_1(B, BoolVars)
 	    end;
@@ -2155,7 +2155,7 @@ is_safe_bool_expr_1(#c_let{vars=Vars,arg=Arg,body=B}, BoolVars) ->
 is_safe_bool_expr_1(#c_literal{val=Val}, _BoolVars) ->
     is_boolean(Val);
 is_safe_bool_expr_1(#c_var{name=V}, BoolVars) ->
-    cerl_sets:is_element(V, BoolVars);
+    sets:is_element(V, BoolVars);
 is_safe_bool_expr_1(_, _) -> false.
 
 is_safe_bool_expr_list([C|Cs], BoolVars) ->
@@ -2228,7 +2228,7 @@ move_let_into_expr(#c_let{vars=Lvs0,body=Lbody0}=Let,
 		    B1 = body(B0, ScopeSub),
 
 		    {Lvs,B2,Sub1} = let_substs(Lvs0, B1, Sub0),
-		    Sub2 = Sub1#sub{s=cerl_sets:union(ScopeSub#sub.s,
+		    Sub2 = Sub1#sub{s=sets:union(ScopeSub#sub.s,
 						      Sub1#sub.s)},
 		    Lbody = body(Lbody0, Sub2),
 		    B = Let#c_let{vars=Lvs,
@@ -2488,7 +2488,7 @@ opt_simple_let_1(#c_let{vars=Vs0,body=B0}=Let, Arg0, Ctxt, Sub0) ->
     %% Optimise let and add new substitutions.
     {Vs,Args,Sub1} = let_substs(Vs0, Arg0, Sub0),
     BodySub = update_let_types(Vs, Args, Sub1),
-    Sub = Sub1#sub{v=[],s=cerl_sets:new()},
+    Sub = Sub1#sub{v=[],s=sets:new([{version, 2}])},
     B = body(B0, Ctxt, BodySub),
     Arg = core_lib:make_values(Args),
     opt_simple_let_2(Let, Vs, Arg, B, B0, Sub).
@@ -2865,12 +2865,12 @@ verify_scope(E, #sub{s=Scope}) ->
 	false ->
 	    io:format("~p\n", [E]),
 	    io:format("~p\n", [Free]),
-	    io:format("~p\n", [ordsets:from_list(cerl_sets:to_list(Scope))]),
+	    io:format("~p\n", [ordsets:from_list(sets:to_list(Scope))]),
 	    false
     end.
 
 is_subset_of_scope([V|Vs], Scope) ->
-    cerl_sets:is_element(V, Scope) andalso is_subset_of_scope(Vs, Scope);
+    sets:is_element(V, Scope) andalso is_subset_of_scope(Vs, Scope);
 is_subset_of_scope([], _) -> true.
 
 -endif.
diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index fa54a14067..e8576913b3 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -938,7 +938,7 @@ badmap_term(Map, #core{in_guard=false}) ->
     c_tuple([#c_literal{val=badmap},Map]).
 
 map_build_pairs(Map, Es0, Ann, St0) ->
-    {Es,Pre,_,St1} = map_build_pairs_1(Es0, cerl_sets:new(), St0),
+    {Es,Pre,_,St1} = map_build_pairs_1(Es0, sets:new([{version, 2}]), St0),
     {ann_c_map(Ann, Map, Es),Pre,St1}.
 
 map_build_pairs_1([{Op0,L,K0,V0}|Es], Used0, St0) ->
@@ -958,11 +958,11 @@ maybe_warn_repeated_keys(Ck,Line,Used,St) ->
         false -> {Used,St};
         true ->
             K = cerl:concrete(Ck),
-            case cerl_sets:is_element(K,Used) of
+            case sets:is_element(K,Used) of
                 true ->
                     {Used, add_warning(Line, {map_key_repeated,K}, St)};
                 false ->
-                    {cerl_sets:add_element(K,Used), St}
+                    {sets:add_element(K,Used), St}
             end
     end.
 
diff --git a/lib/compiler/src/v3_kernel.erl b/lib/compiler/src/v3_kernel.erl
index be7f9824fb..eb04a2c916 100644
--- a/lib/compiler/src/v3_kernel.erl
+++ b/lib/compiler/src/v3_kernel.erl
@@ -115,12 +115,12 @@ copy_anno(Kdst, Ksrc) ->
                fargs=[] :: [#k_var{}],          %Arguments for current function
 	       vcount=0,			%Variable counter
 	       fcount=0,			%Fun counter
-               ds=cerl_sets:new() :: cerl_sets:set(), %Defined variables
+               ds=sets:new([{version, 2}]) :: sets:set(), %Defined variables
 	       funs=[],				%Fun functions
 	       free=#{},			%Free variables
 	       ws=[]   :: [warning()],		%Warnings.
                no_shared_fun_wrappers=false :: boolean(),
-               labels=cerl_sets:new()
+               labels=sets:new([{version, 2}])
               }).
 
 -spec module(cerl:c_module(), [compile:option()]) ->
@@ -165,7 +165,7 @@ function({#c_var{name={F,Arity}=FA},Body}, St0) ->
         %% the function. We use integers as variable names to avoid
         %% filling up the atom table when compiling huge functions.
         Count = cerl_trees:next_free_variable_name(Body),
-	St1 = St0#kern{func=FA,vcount=Count,fcount=0,ds=cerl_sets:new()},
+	St1 = St0#kern{func=FA,vcount=Count,fcount=0,ds=sets:new([{version, 2}])},
 	{#ifun{anno=Ab,vars=Kvs,body=B0},[],St2} = expr(Body, new_sub(), St1),
 	{B1,_,St3} = ubody(B0, return, St2),
 	%%B1 = B0, St3 = St2,				%Null second pass
@@ -394,7 +394,7 @@ letrec_local_function(A, Cfs, Cb, Sub0, St0) ->
 
 letrec_goto([{#c_var{name={Label,0}},Cfail}], Cb, Sub0,
             #kern{labels=Labels0}=St0) ->
-    Labels = cerl_sets:add_element(Label, Labels0),
+    Labels = sets:add_element(Label, Labels0),
     {Kb,Pb,St1} = body(Cb, Sub0, St0#kern{labels=Labels}),
     #c_fun{body=FailBody} = Cfail,
     {Kfail,Fb,St2} = body(FailBody, Sub0, St1),
@@ -559,7 +559,7 @@ match_vars(Ka, St0) ->
 %%  Transform application.
 
 c_apply(A, #c_var{anno=Ra,name={F0,Ar}}, Cargs, Sub, #kern{labels=Labels}=St0) ->
-    case Ar =:= 0 andalso cerl_sets:is_element(F0, Labels) of
+    case Ar =:= 0 andalso sets:is_element(F0, Labels) of
         true ->
             %% This is a goto to a label in a letrec_goto construct.
             {#k_goto{label=F0},[],St0};
@@ -666,15 +666,15 @@ force_variable(Ke, St0) ->
 %%  handling.
 
 pattern(#c_var{anno=A,name=V}, _Isub, Osub, St0) ->
-    case cerl_sets:is_element(V, St0#kern.ds) of
+    case sets:is_element(V, St0#kern.ds) of
 	true ->
 	    {New,St1} = new_var_name(St0),
 	    {#k_var{anno=A,name=New},
 	     set_vsub(V, New, Osub),
-	     St1#kern{ds=cerl_sets:add_element(New, St1#kern.ds)}};
+	     St1#kern{ds=sets:add_element(New, St1#kern.ds)}};
 	false ->
 	    {#k_var{anno=A,name=V},Osub,
-	     St0#kern{ds=cerl_sets:add_element(V, St0#kern.ds)}}
+	     St0#kern{ds=sets:add_element(V, St0#kern.ds)}}
     end;
 pattern(#c_literal{anno=A,val=Val}, _Isub, Osub, St) ->
     {#k_literal{anno=A,val=Val},Osub,St};
@@ -1446,7 +1446,7 @@ partition_intersection(_, Us, Cs, St) ->
 
 partition_keys(#k_map{es=Pairs}=Map, Ks) ->
     F = fun(#k_map_pair{key=Key}) ->
-                cerl_sets:is_element(map_key_clean(Key), Ks)
+                sets:is_element(map_key_clean(Key), Ks)
         end,
     {Ps1,Ps2} = partition(F, Pairs),
     {Map#k_map{es=Ps1},Map#k_map{es=Ps2}};
@@ -1456,9 +1456,9 @@ partition_keys(#ialias{pat=Map}=Alias, Ks) ->
     {Map1,Alias#ialias{pat=Map2}}.
 
 find_key_intersection(Ps) ->
-    Sets = [cerl_sets:from_list(Ks) || Ks <- Ps],
-    Intersection = cerl_sets:intersection(Sets),
-    case cerl_sets:size(Intersection) of
+    Sets = [sets:from_list(Ks, [{version, 2}]) || Ks <- Ps],
+    Intersection = sets:intersection(Sets),
+    case sets:size(Intersection) of
         0 ->
             none;
         _ ->
-- 
2.26.2

openSUSE Build Service is sponsored by