diff --git a/src/kernel_internals/typing/mergecil.ml b/src/kernel_internals/typing/mergecil.ml
index 9f6b3b97c101362a3b677d4a1a07c1ced59e6ac2..0ef1c773dbe80583e455cda43402ac07cdd8f31d 100644
--- a/src/kernel_internals/typing/mergecil.ml
+++ b/src/kernel_internals/typing/mergecil.ml
@@ -284,8 +284,11 @@ struct
   let findReplacement pathcomp eq fidx name =
     let dkey = Kernel.dkey_linker_find in
     Kernel.debug ~dkey "findReplacement for %a(%d)" H.output name fidx;
-    try
-      let nd = Heq.find eq (fidx, name) in
+    match Heq.find_opt eq (fidx, name) with
+    | None ->
+      Kernel.debug ~dkey "not found in the map";
+      None
+    | Some nd ->
       if nd.nrep == nd then begin
         Kernel.debug ~dkey "is a representative";
         None (* No replacement if this is the representative of its class *)
@@ -295,19 +298,18 @@ struct
           Kernel.abort "find does not return the representative" ;
         Kernel.debug ~dkey "RES = %a(%d)" H.output rep.nname rep.nfidx;
         Some (rep.ndata, rep.nfidx)
-    with Not_found -> begin
-        Kernel.debug ~dkey "not found in the map";
-        None
-      end
 
   (* Make a node if one does not already exist. Otherwise return the
    * representative *)
   let getNode eq syn fidx name data l =
     let dkey = Kernel.dkey_linker_find in
     Kernel.debug ~dkey "getNode(%a(%d), %a)" H.output name fidx d_nloc l;
-    try
-      let res = Heq.find eq (fidx, name) in
-
+    match Heq.find_opt eq (fidx, name) with
+    | None ->
+      let res = mkSelfNode eq syn fidx name data l in
+      Kernel.debug ~dkey "made a new one";
+      res
+    | Some res ->
       (match res.nloc, l with
        (* Maybe we have a better location now *)
          None, Some _ -> res.nloc <- l
@@ -321,11 +323,6 @@ struct
        | _, _ -> ());
       Kernel.debug ~dkey "node already found";
       find false res (* No path compression *)
-    with Not_found -> begin
-        let res = mkSelfNode eq syn fidx name data l in
-        Kernel.debug ~dkey "made a new one";
-        res
-      end
 
   let doMergeSynonyms syn compare =
     Hsyn.iter
@@ -1683,8 +1680,12 @@ let oneFilePass1 (f:file) : unit =
     let vinode =
       PlainMerging.mkSelfNode vEq vSyn !currentFidx vi.vname vi (Some l)
     in
-    try
-      let oldvinode = PlainMerging.find true (H.find vEnv vi.vname) in
+    match H.find_opt vEnv vi.vname with
+    | None ->
+      (* Not present in the previous files. Remember it for later  *)
+      H.add vEnv vi.vname vinode
+    | Some oldvi ->
+      let oldvinode = PlainMerging.find true oldvi in
       let oldloc, _ =
         match oldvinode.nloc with
           None ->  (Kernel.fatal "old variable is undefined")
@@ -1777,9 +1778,6 @@ let oneFilePass1 (f:file) : unit =
       newrep.ndata.vstorage <- newstorage;
       newrep.ndata.vattr <- addAttributes oldvi.vattr vi.vattr;
       newrep.ndata.vdecl <- newdecl
-    with Not_found ->
-      (* Not present in the previous files. Remember it for later  *)
-      H.add vEnv vi.vname vinode
   in
   List.iter
     (function
@@ -2730,9 +2728,12 @@ let oneFilePass2 (f: file) =
 
         let emitIt:bool =
           (not mergeGlobals) ||
-          try
-            let _prevVar, prevInitOpt, prevLoc =
-              (H.find emittedVarDefn vi'.vname) in
+          match H.find_opt emittedVarDefn vi'.vname with
+          | None ->
+            (* no previous definition *)
+            H.add emittedVarDefn vi'.vname (vi', init.init, l);
+            true (* emit it *)
+          | Some (_prevVar, prevInitOpt, prevLoc) ->
             (* previously defined; same initializer? *)
             if (equalInitOpts prevInitOpt init.init)
             then (
@@ -2748,11 +2749,6 @@ let oneFilePass2 (f: file) =
                 Cil_printer.pp_location l Cil_printer.pp_location prevLoc;
               false
             )
-          with Not_found -> begin
-              (* no previous definition *)
-              H.add emittedVarDefn vi'.vname (vi', init.init, l);
-              true (* emit it *)
-            end
         in
 
         if emitIt then
@@ -2880,8 +2876,14 @@ let oneFilePass2 (f: file) =
               "Looking for previous definition of inline %s(%d)"
               origname !currentFidx;
           end;
-          try
-            let oldinode = H.find inlineBodies printout in
+          let finalize_process_varinfo () =
+            if debugInlines then Kernel.debug " Not found";
+            H.add inlineBodies printout inode;
+            mergePushGlobal g'
+          in
+          match H.find_opt inlineBodies printout with
+          | None -> finalize_process_varinfo ()
+          | Some oldinode ->
             if debugInlines then
               Kernel.debug "  Matches %s(%d)"
                 oldinode.nname oldinode.nfidx;
@@ -2896,7 +2898,7 @@ let oneFilePass2 (f: file) =
                   "Inline function %s because \
                    it is used before it is defined"
                   fdec'.svar.vname;
-                raise Not_found
+                finalize_process_varinfo ()
               end
             end;
             let _ = union oldinode inode in
@@ -2905,11 +2907,6 @@ let oneFilePass2 (f: file) =
              * we can find the replacement name. *)
             fdec'.svar.vname <- origname;
             () (* Drop this definition *)
-          with Not_found -> begin
-              if debugInlines then Kernel.debug " Not found";
-              H.add inlineBodies printout inode;
-              mergePushGlobal g'
-            end
         end else begin
           (* either the function is not inline, or we're not attempting to
            * merge inlines *)
@@ -2921,10 +2918,12 @@ let oneFilePass2 (f: file) =
              * consider dropping it if a same-named function has already
              * been put into the merged file *)
             let curSum = (functionChecksum fdec') in
-            try
-              let _prevFun, prevLoc, prevSum =
-                (H.find emittedFunDefn fdec'.svar.vname)
-              in
+            match H.find_opt emittedFunDefn fdec'.svar.vname with
+            | None ->
+              (* there was no previous definition *)
+              (mergePushGlobal g');
+              (H.add emittedFunDefn fdec'.svar.vname (fdec', l, curSum))
+            | Some (_prevFun, prevLoc, prevSum) ->
               (* restore old binding for vi, as we are about to drop
                  the new definition and its formals.
               *)
@@ -2953,11 +2952,6 @@ let oneFilePass2 (f: file) =
                   Cil_printer.pp_location prevLoc
                   prevSum Cil_printer.pp_location prevLoc
               end
-            with Not_found -> begin
-                (* there was no previous definition *)
-                (mergePushGlobal g');
-                (H.add emittedFunDefn fdec'.svar.vname (fdec', l, curSum))
-              end
           end else begin
             (* not attempting to merge global functions, or it was static
              * or inline *)
@@ -3171,10 +3165,13 @@ let global_merge_spec g =
   in
   match g with
   | GFun(fdec,loc) ->
-    (try
-       Kernel.debug ~dkey:Kernel.dkey_linker
-         "Merging global definition %a" Cil_printer.pp_global g;
-       let specs = Cil_datatype.Varinfo.Hashtbl.find spec_to_merge fdec.svar in
+    Kernel.debug ~dkey:Kernel.dkey_linker
+      "Merging global definition %a" Cil_printer.pp_global g;
+    (match Cil_datatype.Varinfo.Hashtbl.find_opt spec_to_merge fdec.svar with
+     | None ->
+       Kernel.debug ~dkey:Kernel.dkey_linker "No spec_to_merge";
+       rename fdec.svar fdec.sspec
+     | Some specs ->
        List.iter
          (fun s ->
             Kernel.debug ~dkey:Kernel.dkey_linker
@@ -3188,14 +3185,17 @@ let global_merge_spec g =
        Cil.CurrentLoc.set loc;
        rename fdec.svar fdec.sspec;
        merge_specs fdec.sspec specs
-     with Not_found ->
-       Kernel.debug ~dkey:Kernel.dkey_linker "No spec_to_merge";
-       rename fdec.svar fdec.sspec)
+    )
   | GFunDecl(spec,v,loc) ->
     Kernel.debug ~dkey:Kernel.dkey_linker
       "Merging global declaration %a" Cil_printer.pp_global g;
-    (try
-       let specs = Cil_datatype.Varinfo.Hashtbl.find spec_to_merge v in
+    (match Cil_datatype.Varinfo.Hashtbl.find_opt spec_to_merge v with
+     | None ->
+       Kernel.debug ~dkey:Kernel.dkey_linker "No spec_to_merge for declaration" ;
+       rename v spec;
+       Kernel.debug ~dkey:Kernel.dkey_linker
+         "Renamed to %a" Cil_printer.pp_funspec spec ;
+     | Some specs ->
        List.iter
          (fun s ->
             Kernel.debug ~dkey:Kernel.dkey_linker
@@ -3213,11 +3213,6 @@ let global_merge_spec g =
        merge_specs spec specs;
        Kernel.debug ~dkey:Kernel.dkey_linker
          "Merged into %a" Cil_printer.pp_funspec spec ;
-     with Not_found ->
-       Kernel.debug ~dkey:Kernel.dkey_linker "No spec_to_merge for declaration" ;
-       rename v spec;
-       Kernel.debug ~dkey:Kernel.dkey_linker
-         "Renamed to %a" Cil_printer.pp_funspec spec ;
     )
   | _ -> ()