From 3e1613da9ec1ff12d03e0c438304187f9a479462 Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Mon, 29 Apr 2019 15:21:46 +0200
Subject: [PATCH] [translate] better code generation for logic function calls

---
 src/plugins/e-acsl/at_with_lscope.ml          |   83 +-
 src/plugins/e-acsl/dup_functions.ml           |    3 +-
 src/plugins/e-acsl/env.ml                     |   60 +-
 src/plugins/e-acsl/env.mli                    |   14 +-
 src/plugins/e-acsl/gmpz.ml                    |    3 +-
 src/plugins/e-acsl/interval.ml                |    2 +-
 src/plugins/e-acsl/keep_status.ml             |    8 +-
 src/plugins/e-acsl/logic_functions.ml         |  720 ++++-------
 src/plugins/e-acsl/logic_functions.mli        |   20 +-
 src/plugins/e-acsl/loops.ml                   |    4 +-
 src/plugins/e-acsl/tests/gmp/functions_rec.c  |   10 +-
 .../tests/gmp/oracle/functions.0.res.oracle   |    9 +-
 .../tests/gmp/oracle/functions.1.res.oracle   |   24 +-
 .../gmp/oracle/functions_rec.0.res.oracle     |   86 +-
 .../gmp/oracle/functions_rec.1.res.oracle     |  109 +-
 .../e-acsl/tests/gmp/oracle/gen_functions.c   |  322 ++---
 .../e-acsl/tests/gmp/oracle/gen_functions2.c  |  405 +++---
 .../tests/gmp/oracle/gen_functions_rec.c      |  663 ++--------
 .../tests/gmp/oracle/gen_functions_rec2.c     | 1123 +++++++----------
 .../tests/temporal/oracle/t_getenv.res.oracle |    2 +-
 .../tests/temporal/oracle/t_memcpy.res.oracle |    3 +-
 src/plugins/e-acsl/translate.ml               |   64 +-
 src/plugins/e-acsl/typing.ml                  |   90 +-
 src/plugins/e-acsl/typing.mli                 |   10 +-
 src/plugins/e-acsl/visit.ml                   |   16 +-
 25 files changed, 1576 insertions(+), 2277 deletions(-)

diff --git a/src/plugins/e-acsl/at_with_lscope.ml b/src/plugins/e-acsl/at_with_lscope.ml
index c4981badab3..9602bb5b614 100644
--- a/src/plugins/e-acsl/at_with_lscope.ml
+++ b/src/plugins/e-acsl/at_with_lscope.ml
@@ -237,46 +237,47 @@ let to_exp ~loc kf env pot label =
     end
   in
   let ty_ptr = TPtr(ty, []) in
-  let vi_at, e_at, env = Env.new_var
-    ~loc
-    ~name:"at"
-    ~scope:Env.Function
-    env
-    None
-    ty_ptr
-    (fun vi e ->
-      (* Handle [malloc] and [free] stmts *)
-      let lty_sizeof = Ctype Cil.(theMachine.typeOfSizeOf) in
-      let t_sizeof = Logic_const.term ~loc (TSizeOf ty) lty_sizeof in
-      let t_size = size_from_sizes_and_shifts ~loc sizes_and_shifts in
-      let t_size =
-        Logic_const.term ~loc (TBinOp(Mult, t_sizeof, t_size)) lty_sizeof
-      in
-      Typing.type_term ~use_gmp_opt:false t_size;
-      let malloc_stmt = match Typing.get_integer_ty t_size with
-      | Typing.C_type IInt ->
-        let e_size, _ = term_to_exp kf env t_size in
-        let e_size = Cil.constFold false e_size in
-        let malloc_stmt =
-          Misc.mk_call ~loc ~result:(Cil.var vi) "malloc" [e_size]
-        in
-        malloc_stmt
-      | Typing.C_type _ | Typing.Gmp ->
-        Error.not_yet
-          "\\at on purely logic variables that needs to allocate \
-            too much memory (bigger than int_max bytes)"
-      | Typing.Other ->
-        Options.fatal
-          "quantification over non-integer type is not part of E-ACSL"
-      in
-      let free_stmt = Misc.mk_call ~loc "free" [e] in
-      (* The list of stmts returned by the current closure are inserted
-        LOCALLY to the block where the new var is FIRST used, whatever scope
-        is indicated to [Env.new_var].
-        Thus we need to add [malloc] and [free] through dedicated functions. *)
-      Malloc.add kf malloc_stmt;
-      Free.add kf free_stmt;
-      [])
+  let vi_at, e_at, env =
+    Env.new_var
+      ~loc
+      ~name:"at"
+      ~scope:Env.Function
+      env
+      None
+      ty_ptr
+      (fun vi e ->
+         (* Handle [malloc] and [free] stmts *)
+         let lty_sizeof = Ctype Cil.(theMachine.typeOfSizeOf) in
+         let t_sizeof = Logic_const.term ~loc (TSizeOf ty) lty_sizeof in
+         let t_size = size_from_sizes_and_shifts ~loc sizes_and_shifts in
+         let t_size =
+           Logic_const.term ~loc (TBinOp(Mult, t_sizeof, t_size)) lty_sizeof
+         in
+         Typing.type_term ~use_gmp_opt:false t_size;
+         let malloc_stmt = match Typing.get_integer_ty t_size with
+           | Typing.C_type IInt ->
+             let e_size, _ = term_to_exp kf env t_size in
+             let e_size = Cil.constFold false e_size in
+             let malloc_stmt =
+               Misc.mk_call ~loc ~result:(Cil.var vi) "malloc" [e_size]
+             in
+             malloc_stmt
+           | Typing.C_type _ | Typing.Gmp ->
+             Error.not_yet
+               "\\at on purely logic variables that needs to allocate \
+                too much memory (bigger than int_max bytes)"
+           | Typing.Other ->
+             Options.fatal
+               "quantification over non-integer type is not part of E-ACSL"
+         in
+         let free_stmt = Misc.mk_call ~loc "free" [e] in
+         (* The list of stmts returned by the current closure are inserted
+            LOCALLY to the block where the new var is FIRST used, whatever scope
+            is indicated to [Env.new_var]. Thus we need to add [malloc] and
+            [free] through dedicated functions. *)
+         Malloc.add kf malloc_stmt;
+         Free.add kf free_stmt;
+         [])
   in
   (* Index *)
   let t_index = index_from_sizes_and_shifts ~loc sizes_and_shifts in
@@ -337,4 +338,4 @@ let to_exp ~loc kf env pot label =
   (* Returning *)
   let lval_at_index, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in
   let e = Cil.new_exp ~loc (Lval lval_at_index) in
-  e, env
\ No newline at end of file
+  e, env
diff --git a/src/plugins/e-acsl/dup_functions.ml b/src/plugins/e-acsl/dup_functions.ml
index 1e4b879d319..0deac191f99 100644
--- a/src/plugins/e-acsl/dup_functions.ml
+++ b/src/plugins/e-acsl/dup_functions.ml
@@ -123,7 +123,8 @@ let dup_fundec loc spec bhv sound_verdict_vi kf vi new_vi =
       if vi.vname = "" then
         (* unnamed formal parameter: must generate a fresh name since a fundec
            cannot have unnamed formals (see bts #2303). *)
-        Env.Varname.get ~scope:Env.Function
+        Env.Varname.get
+          ~scope:Env.Function
           (Functions.RTL.mk_gen_name "unamed_formal")
       else
         vi.vname
diff --git a/src/plugins/e-acsl/env.ml b/src/plugins/e-acsl/env.ml
index e987bd4f613..fd2e6d3b208 100644
--- a/src/plugins/e-acsl/env.ml
+++ b/src/plugins/e-acsl/env.ml
@@ -24,6 +24,11 @@ module E_acsl_label = Label
 open Cil_types
 open Cil_datatype
 
+type localized_scope =
+  | LGlobal
+  | LFunction of kernel_function
+  | LLocal_block of kernel_function
+
 type scope =
   | Global
   | Function
@@ -55,7 +60,7 @@ type t =
       lscope: Lscope.t;
       lscope_reset: bool;
       annotation_kind: Misc.annotation_kind;
-      new_global_vars: (varinfo * scope) list;
+      new_global_vars: (varinfo * localized_scope) list;
       (* generated variables. The scope indicates the level where the variable
          should be added. *)
       global_mpz_tbl: mpz_tbl;
@@ -141,6 +146,19 @@ let has_no_new_stmt env =
   let local, _ = top env in
   local.block_info = empty_block
 
+let current_kf env =
+  let v = env.visitor in
+  match v#current_kf with
+  | None -> None
+  | Some kf -> Some (Cil.get_kernel_function v#behavior kf)
+
+let set_current_kf env kf =
+  let v = env.visitor in
+  v#set_current_kf kf
+
+let get_visitor env = env.visitor
+let get_behavior env = env.visitor#behavior
+
 (* ************************************************************************** *)
 (** {2 Loop invariants} *)
 (* ************************************************************************** *)
@@ -189,6 +207,11 @@ let do_new_var ~loc ?(scope=Local_block) ?(name="") env t ty mk_stmts =
       ty
   in
   v.vreferenced <- true;
+  let lscope = match scope with
+    | Global -> LGlobal
+    | Function -> LFunction (Extlib.the (current_kf env))
+    | Local_block -> LLocal_block (Extlib.the (current_kf env))
+  in
 (*  Options.feedback "new variable %a (global? %b)" Varinfo.pretty v global;*)
   let e = Cil.evar v in
   let stmts = mk_stmts v e in
@@ -222,7 +245,7 @@ let do_new_var ~loc ?(scope=Local_block) ?(name="") env t ty mk_stmts =
       (* also memoize the new variable, but must never be used *)
       { env with
 	cpt = n;
-        new_global_vars = (v, scope) :: env.new_global_vars;
+        new_global_vars = (v, lscope) :: env.new_global_vars;
 	global_mpz_tbl = extend_tbl env.global_mpz_tbl;
 	env_stack = local_env :: tl_env }
     | Local_block ->
@@ -234,9 +257,9 @@ let do_new_var ~loc ?(scope=Local_block) ?(name="") env t ty mk_stmts =
       { env with 
 	cpt = n; 
 	env_stack = local_env :: tl_env;
-        new_global_vars = (v, scope) :: env.new_global_vars }
+        new_global_vars = (v, lscope) :: env.new_global_vars }
   end else
-    let new_global_vars = (v, scope) :: env.new_global_vars in
+    let new_global_vars = (v, lscope) :: env.new_global_vars in
     let local_env = 
       { local_env with 
 	block_info = new_block; 
@@ -262,10 +285,8 @@ let new_var ~loc ?(scope=Local_block) ?name env t ty mk_stmts =
       do_new_var ~loc ~scope ?name env t ty mk_stmts
   in
   match scope with
-  | Global | Function ->
-    memo env.global_mpz_tbl
-  | Local_block ->
-    memo local_env.mpz_tbl
+  | Global | Function -> memo env.global_mpz_tbl
+  | Local_block -> memo local_env.mpz_tbl
 
 let new_var_and_mpz_init ~loc ?scope ?name env t mk_stmts =
   new_var
@@ -299,8 +320,7 @@ module Logic_binding = struct
         | Ltype _ as ty when Logic_const.is_boolean_type ty -> Cil.charType
         | Ltype _ | Lvar _ | Lreal | Larrow _ as lty ->
           let msg =
-            Format.asprintf
-              "logic variable of type %a" Logic_type.pretty lty
+            Format.asprintf "logic variable of type %a" Logic_type.pretty lty
           in
           Error.not_yet msg
     in
@@ -324,26 +344,12 @@ module Logic_binding = struct
   let remove env logic_v =
     try
       let varinfos = Logic_var.Map.find logic_v env.var_mapping in
-      ignore (Stack.pop varinfos);
-      env
+      ignore (Stack.pop varinfos)
     with Not_found | Stack.Empty ->
       assert false
 
 end
 
-let current_kf env = 
-  let v = env.visitor in
-  match v#current_kf with
-  | None -> None
-  | Some kf -> Some (Cil.get_kernel_function v#behavior kf)
-
-let set_current_kf env kf =
-  let v = env.visitor in
-  v#set_current_kf kf
-
-let get_visitor env = env.visitor
-let get_behavior env = env.visitor#behavior
-
 module Logic_scope = struct
   let get env = env.lscope
   let extend env lvs = { env with lscope = Lscope.add lvs env.lscope }
@@ -512,7 +518,9 @@ module Context = struct
 	{ env with new_global_vars = 
 	    List.filter
               (fun (v, scope) ->
-                (scope = Global || scope = Function)
+                (match scope with
+                | LGlobal | LFunction _ -> true
+                | LLocal_block _ -> false)
                 && List.for_all (fun (v', _) -> v != v') vars)
 	      !ctx 
 	      @ vars }
diff --git a/src/plugins/e-acsl/env.mli b/src/plugins/e-acsl/env.mli
index abb50cb87e9..d3d408eb20d 100644
--- a/src/plugins/e-acsl/env.mli
+++ b/src/plugins/e-acsl/env.mli
@@ -36,6 +36,11 @@ val has_no_new_stmt: t -> bool
 (** Assume that a local context has been previously pushed.
     @return true iff the given env does not contain any new statement. *)
 
+type localized_scope =
+  | LGlobal
+  | LFunction of kernel_function
+  | LLocal_block of kernel_function
+
 type scope =
   | Global
   | Function
@@ -75,8 +80,9 @@ module Logic_binding: sig
   val get: t -> logic_var -> varinfo
   (* Return the latest C binding. *)
 
-  val remove: t -> logic_var -> t
+  val remove: t -> logic_var -> unit
   (* Remove the latest C binding. *)
+
 end
 
 val add_assert: t -> stmt -> predicate -> unit
@@ -115,10 +121,8 @@ val pop: t -> t
 val transfer: from:t -> t -> t
 (** Pop the last local context of [from] and push it into the other env. *)
 
-val get_generated_variables: t -> (varinfo * scope) list
-(** All the new variables local to the visited function. 
-    The boolean indicates whether the varinfo must be added to the outermost
-    function block. *)
+val get_generated_variables: t -> (varinfo * localized_scope) list
+(** All the new variables local to the visited function. *)
 
 val get_visitor: t -> Visitor.generic_frama_c_visitor
 val get_behavior: t -> Cil.visitor_behavior
diff --git a/src/plugins/e-acsl/gmpz.ml b/src/plugins/e-acsl/gmpz.ml
index 91c7c05e864..54e5597f325 100644
--- a/src/plugins/e-acsl/gmpz.ml
+++ b/src/plugins/e-acsl/gmpz.ml
@@ -54,7 +54,8 @@ let t_ptr () = TNamed(
   },
 [])
 
-let is_t ty = Cil_datatype.Typ.equal ty (t ())
+let is_t ty =
+  Cil_datatype.Typ.equal ty (t ()) || Cil_datatype.Typ.equal ty (t_ptr ())
 
 let apply_on_var ~loc funname e = Misc.mk_call ~loc ("__gmpz_" ^ funname) [ e ]
 let init ~loc e = apply_on_var "init" ~loc e
diff --git a/src/plugins/e-acsl/interval.ml b/src/plugins/e-acsl/interval.ml
index bb8c0e6cba3..0332ee10c8f 100644
--- a/src/plugins/e-acsl/interval.ml
+++ b/src/plugins/e-acsl/interval.ml
@@ -348,7 +348,7 @@ and infer_term_lval (host, offset as tlv) =
     let ty = Logic_utils.logicCType (Cil.typeOfTermLval tlv) in
     interv_of_typ ty
 
-and infer_term_host h = match h with
+and infer_term_host = function
   | TVar v ->
     (try Env.find v
      with Not_found ->
diff --git a/src/plugins/e-acsl/keep_status.ml b/src/plugins/e-acsl/keep_status.ml
index 69da4223348..78c2d9551da 100644
--- a/src/plugins/e-acsl/keep_status.ml
+++ b/src/plugins/e-acsl/keep_status.ml
@@ -131,10 +131,11 @@ let must_translate kf kind =
        duplicate by [Dup_function] but they are still associated to the original
        function here *)
     let name = Functions.RTL.get_original_name kf in
+    try
     let info =
-      try Datatype.String.Hashtbl.find keep_status name
-      with Not_found ->
-        Options.fatal "[keep_status] unbound function" Datatype.String.pretty kf
+(*      try*) Datatype.String.Hashtbl.find keep_status name
+(*      with Not_found ->
+        Options.fatal "[keep_status] unbound function" Datatype.String.pretty kf*)
     in
     info.cpt <- info.cpt + 1;
     let kind', keep =
@@ -148,3 +149,4 @@ let must_translate kf kind =
         pretty_kind kind
         pretty_kind kind';
     keep
+    with Not_found -> true
diff --git a/src/plugins/e-acsl/logic_functions.ml b/src/plugins/e-acsl/logic_functions.ml
index 516127af015..8955a154b25 100644
--- a/src/plugins/e-acsl/logic_functions.ml
+++ b/src/plugins/e-acsl/logic_functions.ml
@@ -21,19 +21,13 @@
 (**************************************************************************)
 
 open Cil_types
-
-type lfsig_info = { (* Logic Function SIGnature INFOrmation *)
-  lfs_li: logic_info; (* the logic definition,
-                         base template to be specialized *)
-  lfs_args_lty: logic_type list; (* types of the args for the specialization *)
-  lfs_lty: logic_type (* return type for the specialization *)
-}
+open Cil_datatype
 
 (**************************************************************************)
 (********************** Forward references ********************************)
 (**************************************************************************)
 
-let predicate_to_exp_ref
+let named_predicate_to_exp_ref
   : (kernel_function -> Env.t -> predicate -> exp * Env.t) ref
   = Extlib.mk_fun "named_predicate_to_exp_ref"
 
@@ -41,464 +35,310 @@ let term_to_exp_ref
   : (kernel_function -> Env.t -> term -> exp * Env.t) ref
   = Extlib.mk_fun "term_to_exp_ref"
 
-let add_cast_ref
-  : (location -> Env.t -> typ option -> bool -> exp -> exp * Env.t) ref
-  = Extlib.mk_fun "add_cast_ref"
+(*****************************************************************************)
+(************************** Auxiliary  functions* ****************************)
+(*****************************************************************************)
+
+(* @return true iff the result of the function is provided by reference as the
+   first extra argument at each call *)
+let result_as_extra_argument = Gmpz.is_t
+(* TODO: to be extended to any compound type? E.g. returning a struct is not
+   good practice... *)
 
 (*****************************************************************************)
 (****************** Generation of function bodies ****************************)
 (*****************************************************************************)
 
-let get_fundec kf =
-  try Kernel_function.get_definition kf
-  with Kernel_function.No_Definition ->
-    Options.fatal "no definition for function %a" Kernel_function.pretty kf
+(* Generate the block of code containing the statement assigning [e] to [ret_vi]
+   (the result). *)
+let generate_return_block ~loc env ret_vi e = match e.enode with
+  | Lval (Var _, NoOffset) ->
+    (* the returned value is a variable: Cil invariant preserved;
+       no need of [ret_vi] *)
+    let return_retres = Cil.mkStmt ~valid_sid:true (Return (Some e, loc)) in
+    let b, env =
+      Env.pop_and_get env return_retres ~global_clear:false Env.After
+    in
+    b.blocals <- b.blocals;
+    b.bscoping <- true;
+    b, env
+  | _ ->
+    (* the returned value is _not_ a variable: restore the invariant *)
+    let init = AssignInit (SingleInit e) in
+    let set =
+      Cil.mkStmtOneInstr ~valid_sid:true (Local_init (ret_vi, init, loc))
+    in
+    let return =
+      Cil.mkStmt ~valid_sid:true (Return (Some (Cil.evar ~loc ret_vi), loc))
+    in
+    let b, env = Env.pop_and_get env set ~global_clear:false Env.Middle in
+    ret_vi.vdefined <- true;
+    b.blocals <- ret_vi :: b.blocals;
+    b.bstmts <- b.bstmts @ [ return ];
+    b.bscoping <- true;
+    b, env
+
+(* Generate the function's body for predicates. *)
+let pred_to_block ~loc kf env ret_vi p =
+  Typing.type_named_predicate ~must_clear:false p;
+  let e, env = !named_predicate_to_exp_ref kf env p in
+  (* for predicate, since the result is either 0 or 1, return it directly (it
+     cannot be provided as extra argument *)
+  generate_return_block ~loc env ret_vi e
 
-(* Determine the C typ corresponding to a formal argument based on its logic
-  type. In particular, [arg_typ_from_lty] MUST NOT return arrays:
-  they should be converted into pointers. *)
-let arg_typ_from_lty lty = match lty with
-  | Linteger ->
-    Gmpz.t_ptr () (* but not [Gmpz.t] as returned by [Typing.typ_of_lty] *)
-  | Lreal ->
-    Error.not_yet "[arg_typ_from_lty] reals" (* TODO: handle in MR !226 *)
-  | Ctype _ | Ltype _ | Lvar _ | Larrow _ ->
-    let typ = Typing.typ_of_lty lty in
-    if Cil.isArrayType typ then Error.not_yet "[arg_typ_from_lty] array"
-    else typ
+(* Generate the function's body for terms. *)
+let term_to_block ~loc kf env ret_ty ret_vi t =
+  Typing.type_term ~use_gmp_opt:false ~ctx:(Typing.integer_ty_of_typ ret_ty) t;
+  let e, env = !term_to_exp_ref kf env t in
+  if Cil.isVoidType ret_ty then
+    (* if the function's result is a GMP, it is the first parameter of the
+       function (by reference). *)
+    let set =
+      let lv_star_ret = Cil.mkMem ~addr:(Cil.evar ~loc ret_vi) ~off:NoOffset in
+      let star_ret = Cil.new_exp ~loc (Lval lv_star_ret) in
+      Gmpz.init_set ~loc lv_star_ret star_ret e
+    in
+    let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in
+    let b, env = Env.pop_and_get env set ~global_clear:false Env.Middle in
+    b.bstmts <- b.bstmts @ [ return_void ];
+    b.bscoping <- true;
+    b, env
+  else
+    generate_return_block ~loc env ret_vi e
+
+let generate_body ~loc kf env ret_ty ret_vi = function
+  | LBnone | LBreads _ ->
+    Options.abort
+      "logic function or predicate without explicit definition are not part of \
+       E-ACSL"
+  | LBterm t -> term_to_block ~loc kf env ret_ty ret_vi t
+  | LBpred p -> pred_to_block ~loc kf env ret_vi p
+  | LBinductive _ -> Error.not_yet "inductive definition"
 
-(* Creates a new [kf] with an empty body. Its body is to be filled
-  through [fill_kf] afterwards. These two operations are purposefully
-  made distinct in order to avoid non-termination in case of recursive
-  definitions. *)
-let empty_kf lfs typ =
-  let li = lfs.lfs_li in
-  let fname =
-    Functions.RTL.mk_gen_name
-      (Env.Varname.get ~scope:Env.Global li.l_var_info.lv_name)
+(* Generate a kernel function from a given logic info [li] *)
+let generate_kf ~loc fname env ret_ty params_ty li =
+  (* build the formal parameters *)
+  let params, params_ty =
+    List.fold_right2
+      (fun lvi pty (params, params_ty) ->
+        let ty = match pty with
+          | Typing.Gmp ->
+            (* GMP's integer are arrays: consider them as pointers in function's
+               parameters *)
+            Gmpz.t_ptr ()
+          | Typing.C_type ik -> TInt(ik, [])
+          | Typing.Other -> Typing.typ_of_lty lvi.lv_type
+        in
+        (* build the formals: cannot use [Cil.makeFormal] since the function
+           does not yet exist *)
+        let vi = Cil.makeVarinfo false true lvi.lv_name ty in
+        vi :: params, (lvi.lv_name, ty, []) :: params_ty)
+      li.l_profile
+      params_ty
+      ([], [])
+  in
+  (* build the varinfo storing the result *)
+  let ret_vi, ret_ty, params_with_ret, params_ty_with_ret =
+    let vname = "__retres" in
+    if result_as_extra_argument ret_ty then
+      let ret_ty_ptr = TPtr(ret_ty, []) (* call by reference *) in
+      let vname = vname ^ "_arg" in
+      let vi = Cil.makeVarinfo false true vname ret_ty_ptr in
+      vi, Cil.voidType, vi :: params, (vname, ret_ty_ptr, []) :: params_ty
+    else
+      Cil.makeVarinfo false false vname ret_ty, ret_ty, params, params_ty
   in
-  let is_not_returnable = Cil.isArrayType typ in
-  let ty_f = if is_not_returnable then Cil.voidType else typ in
-  let vi_f = Cil.makeGlobalVar
-    fname
-    (TFun
-      (ty_f,
-      None, (* Typs of the arguments. Will be updated in the following
-               through [Cil.makeFormalVar] *)
-      false,
-      li.l_var_info.lv_attr))
+  (* build the function's varinfo *)
+  let vi =
+    Cil.makeGlobalVar
+      fname
+      (TFun
+         (ret_ty,
+          Some params_ty_with_ret,
+          false,
+          li.l_var_info.lv_attr))
   in
+  vi.vdefined <- true;
+  (* create the fundec *)
   let fundec =
-    { svar = vi_f;
-      sformals = []; (* Will be updated in the following
-                        through [Cil.makeFormalVar] *)
-      slocals = []; (* Will be updated by [fill_kf] *)
+    { svar = vi;
+      sformals = params_with_ret;
+      slocals = []; (* filled later to break mutual dependencies between
+                       creating this list and creating the kf *)
       smaxid = 0;
-      sbody = Cil.mkBlock []; (* Will be updated by [fill_kf] *)
+      sbody = Cil.mkBlock []; (* filled later; same as above *)
       smaxstmtid = None;
       sallstmts = [];
-      sspec =  Cil.empty_funspec () }
+      sspec = Cil.empty_funspec () }
   in
-  (* Now updating information on arguments *)
-  List.iter2
-    (fun lv lty ->
-      let name = Functions.RTL.mk_gen_name lv.lv_name ^ "_arg" in
-      let typ = arg_typ_from_lty lty in
-      ignore (Cil.makeFormalVar fundec ~where:"$" name typ))
-    li.l_profile
-    lfs.lfs_args_lty;
-  if is_not_returnable then
-    (* If the result of the function cannot be returned,
-      then define it as being the (additional) first argument *)
-    ignore (Cil.makeFormalVar
-      fundec
-      ~where:"^"
-      "__retres_arg"
-      (arg_typ_from_lty (Extlib.the li.l_type)));
-  (* Creating and returning the kf *)
-  { fundec = Definition(fundec, Cil_datatype.Location.unknown);
-    spec = Cil.empty_funspec () }
-
-(* Bind arguments to the intervals corresponding to their logic type. *)
-let add_interv_bindings lfs =
-  List.iter2
-    (fun lv lty ->
-      match lty with
-      | Linteger ->
-        let i = Ival.inject_range None None in
-        Interval.Env.add lv i
-      | Ctype (TFloat _) -> (* TODO: handle in MR !226 *)
-        ()
-      | Lreal ->
-        Error.not_yet "real numbers"
-      | Ctype (TInt(ik, _)) ->
-        let i = Interval.interv_of_typ (TInt(ik, [])) in
-        Interval.Env.add lv i
-      | Ctype _ ->
-        ()
-      | Ltype _ | Lvar _ | Larrow _ ->
-        Options.fatal "unexpected logic type")
-    lfs.lfs_li.l_profile
-    lfs.lfs_args_lty
-
-let remove_interv_bindings lfs =
-  List.iter
-    (fun lv -> Interval.Env.remove lv)
-    lfs.lfs_li.l_profile
-
-let retype lfs = match lfs.lfs_li.l_body with
-  | LBpred p ->
-    Typing.clear_all_pred_or_term (Misc.PoT_pred p);
-    Typing.type_named_predicate ~must_clear:false p
-  | LBterm t ->
-    Typing.clear_all_pred_or_term (Misc.PoT_term t);
-    Typing.type_term ~use_gmp_opt:true t
-  | LBnone ->
-    Error.not_yet "logic functions with no definition nor reads clause"
-  | LBreads _ ->
-    Error.not_yet "logic functions performing read accesses"
-  | LBinductive _ ->
-    Error.not_yet "logic functions inductively defined"
-
-(* Bind lv to C variables.
-  Case A: lv can be directly binded to the formal arg fo the C function.
-          Example: the typ corresponding to lv is [int]
-  Case B: lv CANNOT be directly binded to the formal arg.
-          This is notably the case for GMP since if they were directly binded,
-          then the function would free them before returning. Thus copies are
-          required. *)
-let add_varinfo_bindings ~loc kf env lfs =
-  (* Handle typs that cannot be returned *)
-  let vi_args =
-    let fundec = get_fundec kf in
-    let vi_ty = match fundec.svar.vtype with
-      | TFun(ty, _, _, _) -> ty
-      | _ -> assert false
+  Cil.setMaxId fundec;
+  let spec = Cil.empty_funspec () in
+  Queue.add
+    (fun () -> Globals.Functions.replace_by_definition spec fundec loc)
+    (Env.get_visitor env)#get_filling_actions;
+  (* create the kernel function itself *)
+  let kf = { fundec = Definition(fundec, loc); spec } in
+  (* closure generating the function's body.
+     Delay its generation after filling the memoisation table (for termination
+     of recursive function calls) *)
+  let gen_body () =
+    let env = Env.push env in
+    let old_kf = Extlib.the (Env.current_kf env) in
+    Env.set_current_kf env kf;
+    (* fill the typing environment with the function's parameters
+       before generating the code (code generation invokes typing) *)
+    let env =
+      let add env lvi vi =
+        (match vi.vtype with
+        | TInt _ as ty -> Interval.Env.add lvi (Interval.interv_of_typ ty)
+        | ty ->
+          if Gmpz.is_t ty then
+            Interval.Env.add lvi (Ival.inject_range None None));
+        Env.Logic_binding.add_binding env lvi vi
+      in
+      List.fold_left2 add env li.l_profile params
     in
-    if Cil_datatype.Typ.equal Cil.voidType vi_ty then
-      match fundec.sformals with
-      | [] -> assert false
-      | _ :: vi_args -> vi_args (* First arg is the result *)
-    else
-      fundec.sformals
-  in
-  let env =
-    let lvs_and_ltys =
-      List.map2 (fun lv lty -> lv, lty) lfs.lfs_li.l_profile lfs.lfs_args_lty
+    let b, env = generate_body ~loc kf env ret_ty ret_vi li.l_body in
+    fundec.sbody <- b;
+    (* add the generated variables in the necessary lists *)
+    (* TODO: factorized the code below that add the generated vars with method
+       [add_generated_variables_in_function] in the main visitor *)
+    let vars =
+      let l = Env.get_generated_variables env in
+      if ret_vi.vdefined then (ret_vi, Env.LFunction kf) :: l else l
     in
-    List.fold_left2
-      (fun env (lv, lty) vi_arg ->
-        match Typing.ty_of_logic_ty lty with
-        | Typing.C_type _ | Typing.Other ->
-          (* Case A *)
-          Env.Logic_binding.add_binding env lv vi_arg
-        | Typing.Gmp ->
-          (* Case B *)
-          let ty = Typing.typ_of_lty lv.lv_type in
-          let vi, _, env = Env.Logic_binding.add ~ty env lv in
-          vi_arg.vtype <- Gmpz.t ();
-          let stmt = Gmpz.init_set
-            ~loc (Cil.var vi) (Cil.evar ~loc vi) (Cil.evar ~loc vi_arg)
-          in
-          vi_arg.vtype <- Gmpz.t_ptr ();
-          let env = Env.add_stmt env stmt in
-          env)
-      env
-      lvs_and_ltys
-      vi_args
-  in
-  env
-
-(* Generate the function's body. For predicates. *)
-let pred_to_block ~loc kf env p =
-  (* Translate *)
-  let named_predicate_to_exp = !predicate_to_exp_ref in
-  let e, env = named_predicate_to_exp kf env p in
-  (* Create the variable [retres] to be returned,
-    the stmt [set_retres] setting it,
-    and the stmt [return_retres] returning it. *)
-  let fundec = get_fundec kf in
-  let retres = Cil.makeLocalVar fundec "__retres" Cil.intType in
-  let set_retres =
-    Cil.mkStmtOneInstr ~valid_sid:true (Set (Cil.var retres, e, loc))
-  in
-  let return_retres = Cil.mkStmt
-    ~valid_sid:true (Return (Some (Cil.evar ~loc retres), loc))
-  in
-  (* The whole block *)
-  let b, env =
-    Env.pop_and_get env set_retres ~global_clear:false Env.Middle
-  in
-  b.blocals <- retres :: b.blocals;
-  b.bstmts <- b.bstmts @ [ return_retres ];
-  b.bscoping <- true; (* Kernel details *)
-  b, env
-
-(* Generate the function's body. For terms. *)
-let term_to_block ~loc kf env t lty (* the return type *) =
-  let term_to_exp = !term_to_exp_ref in
-  let e, env = term_to_exp kf env t in
-  (* Functions that are of primitive types are not retyped
-     ==> cast needed in case the type system inferred a different type *)
-  let ctx = Typing.typ_of_lty lty in
-  let add_cast = !add_cast_ref in
-  let e, env = add_cast loc env (Some ctx) false e in
-  (* The body itself *)
-  let fundec = get_fundec kf in
-  begin match Typing.ty_of_logic_ty lty with
-  | Typing.C_type _ | Typing.Other ->
-    let typ = Typing.get_typ t in
-    assert (not (Cil_datatype.Typ.equal Cil.voidType typ));
-    (* Create the variable [retres] to be returned,
-      the stmt [set_retres] setting it,
-      and the stmt [return_retres] returning it. *)
-    let retres = Cil.makeLocalVar fundec "__retres" typ in
-    let set_retres =
-    Cil.mkStmtOneInstr ~valid_sid:true (Set (Cil.var retres, e, loc))
-    in
-    let return_retres = Cil.mkStmt
-      ~valid_sid:true (Return (Some (Cil.evar ~loc retres), loc))
-    in
-    (* The whole block *)
-    let b, env =
-      Env.pop_and_get env set_retres ~global_clear:false Env.Middle
+    let locals, blocks =
+      List.fold_left
+        (fun (local_vars, block_vars as acc) (v, scope) -> match scope with
+        | Env.LFunction kf' when Kernel_function.equal kf kf' ->
+          v :: local_vars, block_vars
+        | Env.LLocal_block kf' when Kernel_function.equal kf kf' ->
+          v :: local_vars, block_vars
+        | _ -> acc)
+        (fundec.slocals, fundec.sbody.blocals)
+        vars
     in
-    b.blocals <- retres :: b.blocals;
-    b.bstmts <- b.bstmts @ [ return_retres ];
-    b.bscoping <- true; (* Kernel details *)
-    b, env
-  | Typing.Gmp ->
-    (* GMPs are not returned but given as (additional) first argument
-      to the function. *)
-    let set_first_arg =
-      let first_arg = List.hd fundec.sformals in
-      Misc.mk_call
-        (* We cannot call [Gmpz.set] since it will only make an alias *)
-        ~loc "__gmpz_init_set" [ Cil.evar ~loc first_arg; e ]
-    in
-    let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in
-    (* The whole block *)
-    let b, env =
-      Env.pop_and_get env set_first_arg ~global_clear:false Env.Middle
-    in
-    b.bstmts <- b.bstmts @ [ return_void ];
-    b.bscoping <- true; (* Kernel details *)
-    b, env
-  end
-
-(* Fill [kf]'s body based on [lfs]. See also: [empty_kf]. *)
-let fill_kf lfs kf =
-  (* Init env *)
-  let env = Env.push Env.dummy in
-  Env.set_current_kf env kf;
-  let loc = Cil_datatype.Location.unknown in
-  let env = add_varinfo_bindings ~loc kf env lfs in
-  (* Create kf's body (the fundec's block) *)
-  let b, env = match lfs.lfs_li.l_body with
-    | LBpred p ->
-      pred_to_block ~loc kf env p
-    | LBterm t ->
-      term_to_block ~loc kf env t lfs.lfs_lty
-    | LBnone ->
-      Error.not_yet "logic functions with no definition nor reads clause"
-    | LBreads _ ->
-      Error.not_yet "logic functions performing read accesses"
-    | LBinductive _ ->
-      Error.not_yet "logic functions inductively defined"
-  in
-  (* Fill the fundec *)
-  let fundec = get_fundec kf in
-  fundec.sbody <- b;
-  let new_vars =
-    List.map (fun (vi, _) -> vi) (Env.get_generated_variables env)
+    fundec.slocals <- locals;
+    fundec.sbody.blocals <- blocks;
+    List.iter
+      (fun lvi ->
+         Interval.Env.remove lvi;
+         ignore (Env.Logic_binding.remove env lvi))
+      li.l_profile;
+    Env.set_current_kf
+      env
+      (Cil.get_original_kernel_function (Env.get_behavior env) old_kf)
   in
-  fundec.slocals <- fundec.slocals @ new_vars
+  vi, kf, gen_body
 
 (**************************************************************************)
 (***************************** Memoization ********************************)
 (**************************************************************************)
 
-module Memo = Hashtbl.Make(struct
-  type t = lfsig_info
-  let equal lfs1 lfs2 =
-    Cil_datatype.Logic_info.equal lfs1.lfs_li lfs2.lfs_li
-    && Cil_datatype.Logic_type.equal lfs1.lfs_lty lfs2.lfs_lty
-    && List.for_all2
-      Cil_datatype.Logic_type.equal
-      lfs1.lfs_args_lty
-      lfs2.lfs_args_lty
-  let hash lfs =
-    Cil_datatype.Logic_info.hash lfs.lfs_li
-    + 257 * let module L = Datatype.List(Cil_datatype.Logic_type) in
-            L.hash (lfs.lfs_lty :: lfs.lfs_args_lty)
-end)
-
-let tbl = Memo.create 7
-
-let memo lfs typ =
-  try Memo.find tbl lfs
-  with Not_found ->
-    (* We need to create a new [kf]. It is done as follows:
-        Step 1: Create a [kf] with an empty body
-        Step 2: Memoize it
-        Step 3: Fill it
-      In particular, its body CANNOT be filled during its creation: it would
-      lead to non-termination for recursive definitions. *)
-    (* Step 1 *)
-    let kf = empty_kf lfs typ in
-    (* Step 2 *)
-    Memo.add tbl lfs kf;
-    (* Step 3 *)
-    fill_kf lfs kf;
-    (* Kernel details *)
-    let fundec = get_fundec kf in
-    fundec.svar.vdefined <- true;
-    Globals.Functions.register kf;
-    (* Return *)
-    kf
-
-(* Returns all the [kf] that have been constructed and memoized
-  so far for the given [logic_info]. *)
-let find_kfs li =
-  Memo.fold
-    (fun lfs kf l ->
-      if Cil_datatype.Logic_info.equal lfs.lfs_li li then kf :: l
-      else l)
-    tbl
-    []
+module Params_ty =
+  Datatype.List_with_collections
+    (Typing.Datatype)
+    (struct let module_name = "E_ACSL.Logic_functions.Params_ty" end)
 
-let reset () = Memo.reset tbl
+(* for each logic_info, associate its possible profiles, i.e. the types of its
+   parameters + the generated varinfo for the function *)
+let memo_tbl:
+    kernel_function Params_ty.Hashtbl.t Logic_info.Hashtbl.t
+  = Logic_info.Hashtbl.create 7
 
-(*****************************************************************************)
-(****************** Generation of function calls *****************************)
-(*****************************************************************************)
+let reset () = Logic_info.Hashtbl.clear memo_tbl
 
-let generate ~loc env t li args args_lty =
-  let name = li.l_var_info.lv_name ^ "_tapp" in
-  let mk_call vi =
-    (* Building the arguments 1/3: If the result is an array (e.g. gmp), then it
-       cannot be returned.  Thus we let it be the (additional) first
-       argument. *)
-    let vi_f_typ = Typing.get_typ t in
-    let args, lvl_opt =
-      if Cil.isArrayType vi_f_typ then Cil.evar ~loc vi :: args, None
-      else args, Some (Cil.var vi)
-    in
-    (* Building the arguments 2/3: AST sanity: arrays that are given as
-       arguments of functions must be explicitely indicated as being pointers *)
-    let args =
-      List.map
-        (fun arg ->
-           if Cil_datatype.Typ.equal (Cil.typeOf arg) (Gmpz.t ()) then
-             (* TODO: real numbers *)
-             Cil.mkCast ~force:true ~e:arg ~newt:(Gmpz.t_ptr ())
-           else
-             arg)
-        args
-    in
-    (* Building the arguments 3/3: E-ACSL typing: short and other integer types
-       less than int are casted into int *)
-    let args =
-      List.map
-        (fun arg ->
-           match Cil.typeOf arg with
-        | TInt(kind, _) ->
-          if Cil.intTypeIncluded kind IInt then
-            Cil.mkCast ~force:false ~e:arg ~newt:Cil.intType
-          else
-            arg
-        | TVoid _ | TFloat _ | TPtr _ | TArray _ | TFun _ | TNamed _
-        | TComp _ |TEnum _ | TBuiltin_va_list _ ->
-          arg)
-      args
-    in
-    let lty = match Typing.get_integer_ty t with
-      | Typing.Gmp -> Linteger
-      | Typing.C_type ik -> Ctype (TInt (ik, []))
-      | Typing.Other -> t.term_type
-    in
-    let lfs = { lfs_li = li; lfs_lty = lty; lfs_args_lty = args_lty } in
-    (* Memoization. We MUST guarantee that interval and type bindings
-      for logic vars, terms and predicates from the logic definition of
-      the function are restored after memoization. *)
-    add_interv_bindings lfs;
-    retype lfs;
-    let kf = memo lfs vi_f_typ in
-    remove_interv_bindings lfs;
-    retype lfs;
-    (* The call stmt *)
-    let fundec = get_fundec kf in
-    let vi_f = fundec.svar in
-    Cil.mkStmtOneInstr (Call (lvl_opt, Cil.evar vi_f, args, loc))
+let add_generated_functions globals =
+  let rec aux acc = function
+    | [] ->
+      acc
+    | GAnnot(Dfun_or_pred(li, loc), _) as g :: l ->
+      let acc = g :: acc in
+      (try
+         (* add the declarations close to its corresponding logic function or
+            predicate *)
+         let params = Logic_info.Hashtbl.find memo_tbl li in
+         let add_fundecl kf acc =
+           GFunDecl(Cil.empty_funspec (), Kernel_function.get_vi kf, loc)
+           :: acc
+         in
+         aux (Params_ty.Hashtbl.fold (fun _ -> add_fundecl) params acc) l
+       with Not_found ->
+         aux acc l)
+    | g :: l ->
+      aux (g :: acc) l
   in
-  match Typing.get_integer_ty t with
-  | Typing.C_type _ | Typing.Other ->
-    let res = Env.new_var
-      ~loc
-      ~name
-      env
-      (Some t)
-      (Typing.get_typ t)
-      (fun vi_app _ -> [ mk_call vi_app ])
+  let rev_globals = aux [] globals in
+  (* add the definitions at the end of [globals] *)
+  let add_fundec kf globals =
+    let fundec =
+      try Kernel_function.get_definition kf
+      with Kernel_function.No_Definition -> assert false
     in
-    res
-  | Typing.Gmp ->
-    Env.new_var_and_mpz_init
-      ~loc
-      ~name
-      env
-      (Some t)
-      (fun vi_app _ -> [ mk_call vi_app ])
-
-(**************************************************************************)
-(******************************** Visitor *********************************)
-(**************************************************************************)
-
-(* TODO: Or is it better to directly use E-ACSL's main visitor in [Visit]?
-  The decision should take into account the fact that [Visit] is already
-  very big. *)
-
-let lfunctions_visitor = object (self)
-  inherit Visitor.frama_c_inplace
-  val mutable new_definitions: global list = []
-  method private insert_lfunctions l = l @ new_definitions
-  method !vglob_aux = function
-    | GAnnot(ga, _) as g ->
-      Cil.DoChildrenPost
-      (fun _ -> match ga with
-        | Dfun_or_pred(li, _) ->
-          begin match li.l_labels with
-          | [] ->
-            (* Case of logic definitions WITHOUT labels. *)
-            let kfs = find_kfs li in
-            let loc = Cil_datatype.Location.unknown in
-            let new_decls = List.map
-              (fun kf ->
-                let fundec = get_fundec kf in
-                let new_g = GFun(fundec, loc) in
-                new_definitions <- new_g :: new_definitions;
-                GFunDecl(Cil.empty_funspec (), fundec.svar, loc))
-              kfs
-            in
-            g :: new_decls
-          | _ :: _ ->
-            (* Case of logic definitions WITH labels. Not yet supported for
-            the time being. Just let it go here: an exception will be raised
-            in [Translate]. *)
-            [g]
-          end
-        | Dvolatile _ | Daxiomatic _ | Dtype _ | Dlemma _ | Dinvariant _
-        | Dtype_annot _ | Dmodel_annot _ | Dcustom_annot _ | Dextended _ ->
-          [g])
-    | GType _ | GCompTag _ | GCompTagDecl _ | GEnumTag _ | GEnumTagDecl _
-    | GVarDecl _ | GFunDecl _ | GVar _ | GFun _ | GAsm _ | GPragma _
-    | GText _ ->
-      Cil.DoChildren
-  method !vfile _ =
-    Cil.DoChildrenPost
-      (fun file ->
-        file.globals <- self#insert_lfunctions file.globals;
-        file)
-end
+    GFun(fundec, Location.unknown) :: globals
+  in
+  let rev_globals =
+    Logic_info.Hashtbl.fold
+      (fun _ -> Params_ty.Hashtbl.fold (fun _ -> add_fundec))
+      memo_tbl
+      rev_globals
+  in
+  List.rev rev_globals
 
-let do_visit f = Visitor.visitFramacFile lfunctions_visitor f
+let tapp_to_exp ~loc fname env t li params_ty args =
+  let ret_ty = Typing.get_typ t in
+  let gen tbl =
+    let vi, kf, gen_body = generate_kf fname ~loc env ret_ty params_ty li in
+    Params_ty.Hashtbl.add tbl params_ty kf;
+    vi, gen_body
+  in
+  (* memoise the function's varinfo *)
+  let fvi, gen_body =
+    try
+      let h = Logic_info.Hashtbl.find memo_tbl li in
+      try
+        let kf = Params_ty.Hashtbl.find h params_ty in
+        Kernel_function.get_vi kf,
+        (fun () -> ()) (* body generation already planified *)
+      with Not_found -> gen h
+    with Not_found ->
+      let h = Params_ty.Hashtbl.create 7 in
+      Logic_info.Hashtbl.add memo_tbl li h;
+      gen h
+  in
+  (* the generation of the function body must be performed after memoizing the
+     kernel function in order to handle recursive calls in finite time :-) *)
+  gen_body ();
+  (* create the function call for the tapp *)
+  let mkcall vi =
+    let mk_args types args =
+      match types (* generated by E-ACSL: no need to unroll *) with
+      | TFun(_, Some params, _, _) ->
+        (* additional casts are necessary whenever the argument is GMP and the
+           parameter is a (small) integralType: after handling the context in
+           [Translate] through [add_cast], the GMP has been translated into a
+           [long] (that is what provided the GMP API). This [long] must now be
+           translated to the parameter's type. It cannot be done before since
+           the exact type of the parameter is only computed when the function is
+           generated *)
+        List.map2
+          (fun (_, newt, _) e -> Cil.mkCast ~force:false ~newt ~e)
+          params
+          args
+      | _ -> assert false
+    in
+    if result_as_extra_argument ret_ty then
+      let args = mk_args fvi.vtype (Cil.mkAddrOf ~loc (Cil.var vi) :: args) in
+      Call(None, Cil.evar fvi, args, loc)
+    else
+      let args = mk_args fvi.vtype args in
+      Call(Some (Cil.var vi), Cil.evar fvi, args, loc)
+  in
+  (* generate the varinfo storing the result of the call *)
+  Env.new_var
+    ~loc
+    ~name:li.l_var_info.lv_name
+    env
+    (Some t)
+    ret_ty
+    (fun vi _ -> [ Cil.mkStmtOneInstr ~valid_sid:true (mkcall vi) ])
diff --git a/src/plugins/e-acsl/logic_functions.mli b/src/plugins/e-acsl/logic_functions.mli
index e8a25ecf350..3e2c0d25c90 100644
--- a/src/plugins/e-acsl/logic_functions.mli
+++ b/src/plugins/e-acsl/logic_functions.mli
@@ -34,25 +34,23 @@ open Cil_types
 (************** Logic functions without labels ****************************)
 (**************************************************************************)
 
-val generate: loc:location -> Env.t -> term -> logic_info ->
-  exp list -> logic_type list -> varinfo * exp * Env.t
-(** [generate ~loc env t_app li args_exp args_lty] generates the C function
-    corresponding to [t_app] and returns the associated call. *)
+val reset: unit -> unit
 
-val do_visit: Cil_types.file -> unit
-(** Put declarations and definitions of the generated functions in the AST. *)
+val tapp_to_exp:
+  loc:location ->
+  string -> Env.t -> term -> logic_info -> Typing.integer_ty list -> exp list ->
+  varinfo * exp * Env.t
 
-val reset: unit -> unit
+val add_generated_functions: global list -> global list
+(* @return the input list of globals in which the generated functions have been
+   inserted at the right places (both their declaration and their definition) *)
 
 (**************************************************************************)
 (********************** Forward references ********************************)
 (**************************************************************************)
 
-val predicate_to_exp_ref:
+val named_predicate_to_exp_ref:
   (kernel_function -> Env.t -> predicate -> exp * Env.t) ref
 
 val term_to_exp_ref:
   (kernel_function -> Env.t -> term -> exp * Env.t) ref
-
-val add_cast_ref:
-  (location -> Env.t -> typ option -> bool -> exp -> exp * Env.t) ref
diff --git a/src/plugins/e-acsl/loops.ml b/src/plugins/e-acsl/loops.ml
index ea01ce00c63..a6da567257a 100644
--- a/src/plugins/e-acsl/loops.ml
+++ b/src/plugins/e-acsl/loops.ml
@@ -297,7 +297,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars =
         Some break_stmt))
     in
     (* remove logic binding before returning *)
-    let env = Env.Logic_binding.remove env logic_x in
+    Env.Logic_binding.remove env logic_x;
     [ start ;  stmt ], env
   | Lscope.Lvs_let(lv, t) :: lscope_vars' ->
     let ty = Typing.get_typ t in
@@ -308,7 +308,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars =
       mk_nested_loops ~loc mk_innermost_block kf env lscope_vars'
     in
     (* remove logic binding now that the block is constructed *)
-    let env = Env.Logic_binding.remove env lv in
+    Env.Logic_binding.remove env lv;
     (* return *)
     let_stmt :: stmts, env
   | Lscope.Lvs_formal _ :: _ ->
diff --git a/src/plugins/e-acsl/tests/gmp/functions_rec.c b/src/plugins/e-acsl/tests/gmp/functions_rec.c
index c6d10713c13..3619ab7c793 100644
--- a/src/plugins/e-acsl/tests/gmp/functions_rec.c
+++ b/src/plugins/e-acsl/tests/gmp/functions_rec.c
@@ -18,13 +18,13 @@
     6; */
 
 int main (void) {
-  /*@ assert f1(0) == 0; */ ;
-  /*@ assert f1(1) == 1; */ ;
-  /*@ assert f1(100) == 5050; */ ;
+  //  /*@ assert f1(0) == 0; */ ;
+  //  /*@ assert f1(1) == 1; */ ;
+  //  /*@ assert f1(100) == 5050; */ ;
 
-  /*@ assert f2(7) == 1; */ ;
+   /*@ assert f2(7) == 1; */ ;
 
   /*@ assert f3(6) == -5; */ ;
 
-  /*@assert f4(9) > 0; */ ;
+  /*@ assert f4(9) > 0; */ ;
 }
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle
index d4d91c76d03..b922d39b016 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle
@@ -14,7 +14,6 @@
 [eva] using specification for function __e_acsl_memory_init
 [eva] using specification for function __e_acsl_assert
 [eva] using specification for function __gmpz_init_set_str
-[eva] using specification for function __gmpz_init_set
 [eva] using specification for function __gmpz_init_set_si
 [eva] using specification for function __gmpz_init
 [eva] using specification for function __gmpz_add
@@ -24,9 +23,9 @@
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/functions.c:47: Warning: 
   function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpz_init_set
 [eva:alarm] tests/gmp/functions.c:48: Warning: 
-  accessing uninitialized left-value.
-  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3);
-[eva:alarm] :0: Warning: 
-  function __gmpz_init_set: precondition ¬\initialized(z) got status invalid.
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:49: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva] done for function main
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle
index 50251e30668..6a88f942fbc 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle
@@ -23,12 +23,28 @@
 [eva:alarm] tests/gmp/functions.c:43: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva] using specification for function __gmpz_init_set_str
-[eva] using specification for function __gmpz_init_set
 [eva:alarm] tests/gmp/functions.c:44: Warning: 
   function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpz_init_set
 [eva:alarm] tests/gmp/functions.c:46: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:47: Warning: 
   accessing uninitialized left-value.
-  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp);
-[eva:alarm] :0: Warning: 
-  function __gmpz_init_set: precondition ¬\initialized(z) got status invalid.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_4);
+[eva:alarm] tests/gmp/functions.c:47: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:48: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:49: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:53: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:56: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:58: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:63: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions.c:25: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva] done for function main
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle
index e3a0950b8f7..c7a7f721fbe 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.0.res.oracle
@@ -10,16 +10,78 @@
   __e_acsl_math_HUGE_VALF ∈ [-3.40282346639e+38 .. 3.40282346639e+38]
   __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308]
 [eva] using specification for function __e_acsl_memory_init
-[eva] tests/gmp/functions_rec.c:21: 
-  cannot evaluate ACSL term, unsupported ACSL construct: logic function f1
-[eva:alarm] tests/gmp/functions_rec.c:21: Warning: assertion got status unknown.
-[eva] using specification for function __gmpz_init
-[eva:alarm] tests/gmp/functions_rec.c:21: Warning: 
-  accessing uninitialized left-value.
-  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp);
-[eva] using specification for function __gmpz_init_set_si
-[eva] using specification for function __gmpz_init_set
-[eva] using specification for function __gmpz_clear
-[eva:alarm] :0: Warning: 
-  function __gmpz_init_set: precondition ¬\initialized(z) got status invalid.
+[eva] tests/gmp/functions_rec.c:25: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f2
+[eva:alarm] tests/gmp/functions_rec.c:25: Warning: assertion got status unknown.
+[eva] tests/gmp/functions_rec.c:9: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <-
+                                             __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva] using specification for function __gen_e_acsl_f2_2
+[eva] tests/gmp/functions_rec.c:9: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <-
+                                             __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva] tests/gmp/functions_rec.c:9: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <-
+                                             __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva] using specification for function __e_acsl_assert
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  division by zero. assert __gen_e_acsl_f2_8 ≢ 0;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  signed overflow.
+  assert -2147483648 ≤ __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  signed overflow. assert __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6 ≤ 2147483647;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  signed overflow.
+  assert
+  (int)(__gen_e_acsl_f2_4 * __gen_e_acsl_f2_6) / __gen_e_acsl_f2_8 ≤
+  2147483647;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  division by zero. assert __gen_e_acsl_f2_13 ≢ 0;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  signed overflow.
+  assert -2147483648 ≤ __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  signed overflow.
+  assert __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11 ≤ 2147483647;
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  signed overflow.
+  assert
+  (int)(__gen_e_acsl_f2_9 * __gen_e_acsl_f2_11) / __gen_e_acsl_f2_13 ≤
+  2147483647;
+[eva:alarm] tests/gmp/functions_rec.c:25: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva] tests/gmp/functions_rec.c:27: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f3
+[eva:alarm] tests/gmp/functions_rec.c:27: Warning: assertion got status unknown.
+[eva] tests/gmp/functions_rec.c:13: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f3_2 (__gen_e_acsl_f3_2 <- __gen_e_acsl_f3_2 :: tests/gmp/functions_rec.c:13 <-
+                                             __gen_e_acsl_f3 :: tests/gmp/functions_rec.c:27 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva] using specification for function __gen_e_acsl_f3_2
+[eva] tests/gmp/functions_rec.c:29: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f4
+[eva:alarm] tests/gmp/functions_rec.c:29: Warning: assertion got status unknown.
+[eva] tests/gmp/functions_rec.c:16: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f4_2 (__gen_e_acsl_f4_2 <- __gen_e_acsl_f4_2 :: tests/gmp/functions_rec.c:16 <-
+                                             __gen_e_acsl_f4 :: tests/gmp/functions_rec.c:29 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva] using specification for function __gen_e_acsl_f4_2
+[eva:alarm] tests/gmp/functions_rec.c:29: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva] done for function main
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle
index 899afbf364f..723a7954d81 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/functions_rec.1.res.oracle
@@ -10,38 +10,107 @@
   __e_acsl_math_HUGE_VALF ∈ [-3.40282346639e+38 .. 3.40282346639e+38]
   __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308]
 [eva] using specification for function __e_acsl_memory_init
-[eva] tests/gmp/functions_rec.c:21: 
-  cannot evaluate ACSL term, unsupported ACSL construct: logic function f1
-[eva:alarm] tests/gmp/functions_rec.c:21: Warning: assertion got status unknown.
-[eva] using specification for function __gmpz_init
-[eva:alarm] tests/gmp/functions_rec.c:21: Warning: 
-  accessing uninitialized left-value.
-  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp);
+[eva] tests/gmp/functions_rec.c:25: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f2
+[eva:alarm] tests/gmp/functions_rec.c:25: Warning: assertion got status unknown.
 [eva] using specification for function __gmpz_init_set_si
 [eva] using specification for function __gmpz_cmp
 [eva] using specification for function __gmpz_init_set
 [eva] using specification for function __gmpz_clear
+[eva] using specification for function __gmpz_init
 [eva] using specification for function __gmpz_sub
-[eva:alarm] tests/gmp/functions_rec.c:6: Warning: 
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
   accessing uninitialized left-value.
   assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub);
-[eva:alarm] tests/gmp/functions_rec.c:6: Warning: 
-  accessing uninitialized left-value.
-  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2);
-[eva] tests/gmp/functions_rec.c:6: Warning: 
+[eva] tests/gmp/functions_rec.c:9: Warning: 
   recursive call during value analysis
-  of __gen_e_acsl_f1_2 (__gen_e_acsl_f1_2 <- __gen_e_acsl_f1_2 :: tests/gmp/functions_rec.c:6 <-
-                                             __gen_e_acsl_f1 :: tests/gmp/functions_rec.c:21 <-
+  of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <-
+                                             __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <-
                                              main).
   Assuming the call has no effect. The analysis will be unsound.
-[eva:alarm] tests/gmp/functions_rec.c:6: Warning: 
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
   accessing uninitialized left-value.
   assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
-[eva:alarm] tests/gmp/functions_rec.c:6: Warning: 
+[eva] using specification for function __gen_e_acsl_f2_2
+[eva] tests/gmp/functions_rec.c:9: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <-
+                                             __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_3);
+[eva] using specification for function __gmpz_mul
+[eva] tests/gmp/functions_rec.c:9: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f2_2 (__gen_e_acsl_f2_2 <- __gen_e_acsl_f2_2 :: tests/gmp/functions_rec.c:9 <-
+                                             __gen_e_acsl_f2 :: tests/gmp/functions_rec.c:25 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_4);
+[eva] :0: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f2
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  assertion 'E_ACSL' got status unknown.
+[eva] using specification for function __e_acsl_assert
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpz_tdiv_q
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_5);
+[eva:alarm] tests/gmp/functions_rec.c:9: Warning: 
   accessing uninitialized left-value.
-  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3);
-[eva] using specification for function __gen_e_acsl_f1_2
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_6);
+[eva:alarm] tests/gmp/functions_rec.c:25: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva] tests/gmp/functions_rec.c:27: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f3
+[eva:alarm] tests/gmp/functions_rec.c:27: Warning: assertion got status unknown.
+[eva:alarm] tests/gmp/functions_rec.c:13: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_7);
+[eva] using specification for function __gmpz_get_si
+[eva] tests/gmp/functions_rec.c:13: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f3_2 (__gen_e_acsl_f3_2 <- __gen_e_acsl_f3_2 :: tests/gmp/functions_rec.c:13 <-
+                                             __gen_e_acsl_f3 :: tests/gmp/functions_rec.c:27 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva:alarm] tests/gmp/functions_rec.c:13: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_8);
+[eva] using specification for function __gen_e_acsl_f3_2
 [eva] using specification for function __gmpz_add
-[eva:alarm] :0: Warning: 
-  function __gmpz_init_set: precondition ¬\initialized(z) got status invalid.
+[eva:alarm] tests/gmp/functions_rec.c:13: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add);
+[eva:alarm] tests/gmp/functions_rec.c:13: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_2);
+[eva] using specification for function __gmpz_neg
+[eva:alarm] tests/gmp/functions_rec.c:27: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva] tests/gmp/functions_rec.c:29: 
+  cannot evaluate ACSL term, unsupported ACSL construct: logic function f4
+[eva:alarm] tests/gmp/functions_rec.c:29: Warning: assertion got status unknown.
+[eva:alarm] tests/gmp/functions_rec.c:16: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_3);
+[eva] tests/gmp/functions_rec.c:16: Warning: 
+  recursive call during value analysis
+  of __gen_e_acsl_f4_2 (__gen_e_acsl_f4_2 <- __gen_e_acsl_f4_2 :: tests/gmp/functions_rec.c:16 <-
+                                             __gen_e_acsl_f4 :: tests/gmp/functions_rec.c:29 <-
+                                             main).
+  Assuming the call has no effect. The analysis will be unsound.
+[eva:alarm] tests/gmp/functions_rec.c:16: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_4);
+[eva] using specification for function __gen_e_acsl_f4_2
+[eva] using specification for function __gmpz_init_set_ui
+[eva:alarm] tests/gmp/functions_rec.c:29: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva] done for function main
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c
index fa452142c65..9dba1dbedad 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c
@@ -10,59 +10,56 @@ struct mystruct {
 typedef struct mystruct mystruct;
 /*@ predicate p1(int x, int y) = x + y > 0;
  */
-int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg);
+int __gen_e_acsl_p1(int x, int y);
 
 /*@ predicate p2(ℤ x, ℤ y) = x + y > 0;
 
 */
-int __gen_e_acsl_p2_3(int __gen_e_acsl_x_arg, long __gen_e_acsl_y_arg);
+int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y);
 
-int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg);
+int __gen_e_acsl_p2_5(int x, long y);
 
-int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg,
-                      __e_acsl_mpz_struct * __gen_e_acsl_y_arg);
+int __gen_e_acsl_p2(int x, int y);
 
 /*@ logic ℤ f1(ℤ x, ℤ y) = x + y;
 
 */
-long __gen_e_acsl_f1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg);
+void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x,
+                       __e_acsl_mpz_struct * y);
 
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       int __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg);
+void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x,
+                       __e_acsl_mpz_struct * y);
 
-void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg);
+long __gen_e_acsl_f1(int x, int y);
 
 /*@ logic char h_char(char c) = c;
  */
-char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg);
+char __gen_e_acsl_h_char(int c);
 
 /*@ logic short h_short(short s) = s;
  */
-short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg);
+short __gen_e_acsl_h_short(int s);
 
 /*@ logic int g_hidden(int x) = x;
  */
-int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg);
+int __gen_e_acsl_g_hidden(int x);
 
 /*@ logic int g(int x) = g_hidden(x);
  */
-int __gen_e_acsl_g(int __gen_e_acsl_x_arg);
+int __gen_e_acsl_g(int x);
 
 /*@ logic mystruct t1(mystruct m) = m;
  */
-mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg);
+mystruct __gen_e_acsl_t1(mystruct m);
 
 /*@ logic ℤ t2(mystruct m) = m.k + m.l;
  */
-long __gen_e_acsl_t2(mystruct __gen_e_acsl_m_arg);
+long __gen_e_acsl_t2(mystruct m);
 
 /*@ predicate k_pred(ℤ x) = x > 0;
 
 */
-int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg);
+int __gen_e_acsl_k_pred(int x);
 
 /*@ requires k_pred(x); */
 void __gen_e_acsl_k(int x);
@@ -91,67 +88,61 @@ int main(void)
   int y = 2;
   /*@ assert p1(x, y); */
   {
-    int __gen_e_acsl_p1_tapp;
-    __gen_e_acsl_p1_tapp = __gen_e_acsl_p1(x,y);
-    __e_acsl_assert(__gen_e_acsl_p1_tapp,(char *)"Assertion",(char *)"main",
+    int __gen_e_acsl_p1_2;
+    __gen_e_acsl_p1_2 = __gen_e_acsl_p1(x,y);
+    __e_acsl_assert(__gen_e_acsl_p1_2,(char *)"Assertion",(char *)"main",
                     (char *)"p1(x, y)",42);
   }
   /*@ assert p2(3, 4); */
   {
-    int __gen_e_acsl_p2_tapp;
-    __gen_e_acsl_p2_tapp = __gen_e_acsl_p2(3,4);
-    __e_acsl_assert(__gen_e_acsl_p2_tapp,(char *)"Assertion",(char *)"main",
+    int __gen_e_acsl_p2_2;
+    __gen_e_acsl_p2_2 = __gen_e_acsl_p2(3,4);
+    __e_acsl_assert(__gen_e_acsl_p2_2,(char *)"Assertion",(char *)"main",
                     (char *)"p2(3, 4)",43);
   }
   /*@ assert p2(5, 99999999999999999999999999999); */
   {
     __e_acsl_mpz_t __gen_e_acsl_;
-    int __gen_e_acsl_p2_tapp_2;
+    int __gen_e_acsl_p2_4;
     __gmpz_init_set_str(__gen_e_acsl_,"99999999999999999999999999999",10);
-    __gen_e_acsl_p2_tapp_2 = __gen_e_acsl_p2_2(5,
-                                               (__e_acsl_mpz_struct *)__gen_e_acsl_);
-    __e_acsl_assert(__gen_e_acsl_p2_tapp_2,(char *)"Assertion",
-                    (char *)"main",
+    __gen_e_acsl_p2_4 = __gen_e_acsl_p2_3(5,
+                                          (__e_acsl_mpz_struct *)__gen_e_acsl_);
+    __e_acsl_assert(__gen_e_acsl_p2_4,(char *)"Assertion",(char *)"main",
                     (char *)"p2(5, 99999999999999999999999999999)",44);
     __gmpz_clear(__gen_e_acsl_);
   }
   /*@ assert f1(x, y) ≡ 3; */
   {
-    long __gen_e_acsl_f1_tapp;
-    __gen_e_acsl_f1_tapp = __gen_e_acsl_f1(x,y);
-    __e_acsl_assert(__gen_e_acsl_f1_tapp == 3L,(char *)"Assertion",
+    long __gen_e_acsl_f1_2;
+    __gen_e_acsl_f1_2 = __gen_e_acsl_f1(x,y);
+    __e_acsl_assert(__gen_e_acsl_f1_2 == 3L,(char *)"Assertion",
                     (char *)"main",(char *)"f1(x, y) == 3",46);
   }
   /*@ assert p2(x, f1(3, 4)); */
   {
-    long __gen_e_acsl_f1_tapp_2;
-    int __gen_e_acsl_p2_tapp_3;
-    __gen_e_acsl_f1_tapp_2 = __gen_e_acsl_f1(3,4);
-    __gen_e_acsl_p2_tapp_3 = __gen_e_acsl_p2_3(x,__gen_e_acsl_f1_tapp_2);
-    __e_acsl_assert(__gen_e_acsl_p2_tapp_3,(char *)"Assertion",
-                    (char *)"main",(char *)"p2(x, f1(3, 4))",47);
+    long __gen_e_acsl_f1_4;
+    int __gen_e_acsl_p2_6;
+    __gen_e_acsl_f1_4 = __gen_e_acsl_f1(3,4);
+    __gen_e_acsl_p2_6 = __gen_e_acsl_p2_5(x,__gen_e_acsl_f1_4);
+    __e_acsl_assert(__gen_e_acsl_p2_6,(char *)"Assertion",(char *)"main",
+                    (char *)"p2(x, f1(3, 4))",47);
   }
   /*@ assert f1(9, 99999999999999999999999999999) > 0; */
   {
     __e_acsl_mpz_t __gen_e_acsl__4;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3;
+    __e_acsl_mpz_t __gen_e_acsl_f1_6;
     __e_acsl_mpz_t __gen_e_acsl__5;
     int __gen_e_acsl_gt_3;
     __gmpz_init_set_str(__gen_e_acsl__4,"99999999999999999999999999999",10);
-    __gmpz_init(__gen_e_acsl_f1_tapp_3);
-    /*@ assert
-        Eva: initialization:
-          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3);
-    */
-    __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3,9,
+    __gen_e_acsl_f1_5(& __gen_e_acsl_f1_6,9,
                       (__e_acsl_mpz_struct *)__gen_e_acsl__4);
     __gmpz_init_set_si(__gen_e_acsl__5,0L);
-    __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3),
+    __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
     __e_acsl_assert(__gen_e_acsl_gt_3 > 0,(char *)"Assertion",(char *)"main",
                     (char *)"f1(9, 99999999999999999999999999999) > 0",48);
     __gmpz_clear(__gen_e_acsl__4);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_3);
+    __gmpz_clear(__gen_e_acsl_f1_6);
     __gmpz_clear(__gen_e_acsl__5);
   }
   /*@ assert
@@ -160,46 +151,44 @@ int main(void)
   */
   {
     __e_acsl_mpz_t __gen_e_acsl__6;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4;
+    __e_acsl_mpz_t __gen_e_acsl_f1_8;
     __e_acsl_mpz_t __gen_e_acsl__7;
     int __gen_e_acsl_eq;
     __gmpz_init_set_str(__gen_e_acsl__6,"99999999999999999999999999999",10);
-    __gmpz_init(__gen_e_acsl_f1_tapp_4);
-    __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4,
+    __gen_e_acsl_f1_7(& __gen_e_acsl_f1_8,
                       (__e_acsl_mpz_struct *)__gen_e_acsl__6,
                       (__e_acsl_mpz_struct *)__gen_e_acsl__6);
     __gmpz_init_set_str(__gen_e_acsl__7,"199999999999999999999999999998",10);
-    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4),
+    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8),
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
     __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
                     (char *)"f1(99999999999999999999999999999, 99999999999999999999999999999) ==\n199999999999999999999999999998",
                     49);
     __gmpz_clear(__gen_e_acsl__6);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_4);
+    __gmpz_clear(__gen_e_acsl_f1_8);
     __gmpz_clear(__gen_e_acsl__7);
   }
   /*@ assert g(x) ≡ x; */
   {
-    int __gen_e_acsl_g_tapp;
-    __gen_e_acsl_g_tapp = __gen_e_acsl_g(x);
-    __e_acsl_assert(__gen_e_acsl_g_tapp == x,(char *)"Assertion",
-                    (char *)"main",(char *)"g(x) == x",53);
+    int __gen_e_acsl_g_2;
+    __gen_e_acsl_g_2 = __gen_e_acsl_g(x);
+    __e_acsl_assert(__gen_e_acsl_g_2 == x,(char *)"Assertion",(char *)"main",
+                    (char *)"g(x) == x",53);
   }
   char c = (char)'c';
   /*@ assert h_char(c) ≡ c; */
   {
-    char __gen_e_acsl_h_char_tapp;
-    __gen_e_acsl_h_char_tapp = __gen_e_acsl_h_char((int)c);
-    __e_acsl_assert((int)__gen_e_acsl_h_char_tapp == (int)c,
-                    (char *)"Assertion",(char *)"main",
-                    (char *)"h_char(c) == c",56);
+    char __gen_e_acsl_h_char_2;
+    __gen_e_acsl_h_char_2 = __gen_e_acsl_h_char((int)c);
+    __e_acsl_assert((int)__gen_e_acsl_h_char_2 == (int)c,(char *)"Assertion",
+                    (char *)"main",(char *)"h_char(c) == c",56);
   }
   short s = (short)1;
   /*@ assert h_short(s) ≡ s; */
   {
-    short __gen_e_acsl_h_short_tapp;
-    __gen_e_acsl_h_short_tapp = __gen_e_acsl_h_short((int)s);
-    __e_acsl_assert((int)__gen_e_acsl_h_short_tapp == (int)s,
+    short __gen_e_acsl_h_short_2;
+    __gen_e_acsl_h_short_2 = __gen_e_acsl_h_short((int)s);
+    __e_acsl_assert((int)__gen_e_acsl_h_short_2 == (int)s,
                     (char *)"Assertion",(char *)"main",
                     (char *)"h_short(s) == s",58);
   }
@@ -207,11 +196,11 @@ int main(void)
   m.l = 9;
   /*@ assert t2(t1(m)) ≡ 17; */
   {
-    mystruct __gen_e_acsl_t1_tapp;
-    long __gen_e_acsl_t2_tapp;
-    __gen_e_acsl_t1_tapp = __gen_e_acsl_t1(m);
-    __gen_e_acsl_t2_tapp = __gen_e_acsl_t2(__gen_e_acsl_t1_tapp);
-    __e_acsl_assert(__gen_e_acsl_t2_tapp == 17L,(char *)"Assertion",
+    mystruct __gen_e_acsl_t1_2;
+    long __gen_e_acsl_t2_2;
+    __gen_e_acsl_t1_2 = __gen_e_acsl_t1(m);
+    __gen_e_acsl_t2_2 = __gen_e_acsl_t2(__gen_e_acsl_t1_2);
+    __e_acsl_assert(__gen_e_acsl_t2_2 == 17L,(char *)"Assertion",
                     (char *)"main",(char *)"t2(t1(m)) == 17",63);
   }
   __gen_e_acsl_k(9);
@@ -223,180 +212,145 @@ int main(void)
 void __gen_e_acsl_k(int x)
 {
   {
-    int __gen_e_acsl_k_pred_tapp;
-    __gen_e_acsl_k_pred_tapp = __gen_e_acsl_k_pred(x);
-    __e_acsl_assert(__gen_e_acsl_k_pred_tapp,(char *)"Precondition",
-                    (char *)"k",(char *)"k_pred(x)",25);
+    int __gen_e_acsl_k_pred_2;
+    __gen_e_acsl_k_pred_2 = __gen_e_acsl_k_pred(x);
+    __e_acsl_assert(__gen_e_acsl_k_pred_2,(char *)"Precondition",(char *)"k",
+                    (char *)"k_pred(x)",25);
   }
   k(x);
   return;
 }
 
-int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg)
+short __gen_e_acsl_h_short(int s)
 {
-  int __retres;
-  __retres = __gen_e_acsl_x_arg > 0;
+  short __retres = (short)s;
   return __retres;
 }
 
-long __gen_e_acsl_t2(mystruct __gen_e_acsl_m_arg)
+int __gen_e_acsl_g_hidden(int x)
 {
-  long __retres;
-  __retres = __gen_e_acsl_m_arg.k + (long)__gen_e_acsl_m_arg.l;
-  return __retres;
+  return x;
 }
 
-mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg)
+int __gen_e_acsl_g(int x)
 {
-  mystruct __retres;
-  __retres = __gen_e_acsl_m_arg;
-  return __retres;
+  int __gen_e_acsl_g_hidden_2;
+  __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x);
+  return __gen_e_acsl_g_hidden_2;
 }
 
-int __gen_e_acsl_g(int __gen_e_acsl_x_arg)
+mystruct __gen_e_acsl_t1(mystruct m)
 {
-  int __retres;
-  int __gen_e_acsl_g_hidden_tapp;
-  __gen_e_acsl_g_hidden_tapp = __gen_e_acsl_g_hidden(__gen_e_acsl_x_arg);
-  __retres = __gen_e_acsl_g_hidden_tapp;
-  return __retres;
+  return m;
 }
 
-int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg)
+int __gen_e_acsl_p1(int x, int y)
 {
-  int __retres;
-  __retres = __gen_e_acsl_x_arg;
+  int __retres = x + (long)y > 0L;
   return __retres;
 }
 
-short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg)
-{
-  int __retres;
-  __retres = (short)__gen_e_acsl_s_arg;
-  return __retres;
-}
-
-char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg)
-{
-  int __retres;
-  __retres = (char)__gen_e_acsl_c_arg;
-  return __retres;
-}
-
-void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_x_4;
-  __e_acsl_mpz_t __gen_e_acsl_y_4;
-  __e_acsl_mpz_t __gen_e_acsl_add_4;
-  __gmpz_init_set(__gen_e_acsl_x_4,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_arg));
-  __gmpz_init_set(__gen_e_acsl_y_4,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg));
-  __gmpz_init(__gen_e_acsl_add_4);
-  __gmpz_add(__gen_e_acsl_add_4,
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_4));
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4));
-  __gmpz_clear(__gen_e_acsl_x_4);
-  __gmpz_clear(__gen_e_acsl_y_4);
-  __gmpz_clear(__gen_e_acsl_add_4);
-  return;
-}
-
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       int __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg)
+long __gen_e_acsl_t2(mystruct m)
 {
-  __e_acsl_mpz_t __gen_e_acsl_y_3;
-  __e_acsl_mpz_t __gen_e_acsl_x_3;
-  __e_acsl_mpz_t __gen_e_acsl_add_3;
-  __gmpz_init_set(__gen_e_acsl_y_3,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg));
-  __gmpz_init_set_si(__gen_e_acsl_x_3,(long)__gen_e_acsl_x_arg);
-  __gmpz_init(__gen_e_acsl_add_3);
-  __gmpz_add(__gen_e_acsl_add_3,
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_3));
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3));
-  __gmpz_clear(__gen_e_acsl_y_3);
-  __gmpz_clear(__gen_e_acsl_x_3);
-  __gmpz_clear(__gen_e_acsl_add_3);
-  return;
-}
-
-long __gen_e_acsl_f1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
-{
-  long __retres;
-  __retres = __gen_e_acsl_x_arg + (long)__gen_e_acsl_y_arg;
+  long __retres = m.k + (long)m.l;
   return __retres;
 }
 
-int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg,
-                      __e_acsl_mpz_struct * __gen_e_acsl_y_arg)
+int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y)
 {
-  int __retres;
-  __e_acsl_mpz_t __gen_e_acsl_y;
   __e_acsl_mpz_t __gen_e_acsl_x;
   __e_acsl_mpz_t __gen_e_acsl_add;
   __e_acsl_mpz_t __gen_e_acsl__2;
   int __gen_e_acsl_gt;
-  __gmpz_init_set(__gen_e_acsl_y,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg));
-  __gmpz_init_set_si(__gen_e_acsl_x,(long)__gen_e_acsl_x_arg);
+  __gmpz_init_set_si(__gen_e_acsl_x,(long)x);
   __gmpz_init(__gen_e_acsl_add);
   __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y));
+             (__e_acsl_mpz_struct const *)(y));
   __gmpz_init_set_si(__gen_e_acsl__2,0L);
   __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add),
                                (__e_acsl_mpz_struct const *)(__gen_e_acsl__2));
-  __retres = __gen_e_acsl_gt > 0;
-  __gmpz_clear(__gen_e_acsl_y);
+  int __retres = __gen_e_acsl_gt > 0;
   __gmpz_clear(__gen_e_acsl_x);
   __gmpz_clear(__gen_e_acsl_add);
   __gmpz_clear(__gen_e_acsl__2);
   return __retres;
 }
 
-int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
+int __gen_e_acsl_p2_5(int x, long y)
 {
-  int __retres;
-  __retres = __gen_e_acsl_x_arg + (long)__gen_e_acsl_y_arg > 0L;
-  return __retres;
-}
-
-int __gen_e_acsl_p2_3(int __gen_e_acsl_x_arg, long __gen_e_acsl_y_arg)
-{
-  int __retres;
   __e_acsl_mpz_t __gen_e_acsl_x_2;
-  __e_acsl_mpz_t __gen_e_acsl_y_2;
+  __e_acsl_mpz_t __gen_e_acsl_y;
   __e_acsl_mpz_t __gen_e_acsl_add_2;
   __e_acsl_mpz_t __gen_e_acsl__3;
   int __gen_e_acsl_gt_2;
-  __gmpz_init_set_si(__gen_e_acsl_x_2,(long)__gen_e_acsl_x_arg);
-  __gmpz_init_set_si(__gen_e_acsl_y_2,__gen_e_acsl_y_arg);
+  __gmpz_init_set_si(__gen_e_acsl_x_2,(long)x);
+  __gmpz_init_set_si(__gen_e_acsl_y,y);
   __gmpz_init(__gen_e_acsl_add_2);
   __gmpz_add(__gen_e_acsl_add_2,
              (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_2),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_2));
+             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y));
   __gmpz_init_set_si(__gen_e_acsl__3,0L);
   __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2),
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__3));
-  __retres = __gen_e_acsl_gt_2 > 0;
+  int __retres = __gen_e_acsl_gt_2 > 0;
   __gmpz_clear(__gen_e_acsl_x_2);
-  __gmpz_clear(__gen_e_acsl_y_2);
+  __gmpz_clear(__gen_e_acsl_y);
   __gmpz_clear(__gen_e_acsl_add_2);
   __gmpz_clear(__gen_e_acsl__3);
   return __retres;
 }
 
-int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
+int __gen_e_acsl_p2(int x, int y)
 {
-  int __retres;
-  __retres = __gen_e_acsl_x_arg + (long)__gen_e_acsl_y_arg > 0L;
+  int __retres = x + (long)y > 0L;
+  return __retres;
+}
+
+int __gen_e_acsl_k_pred(int x)
+{
+  int __retres = x > 0;
+  return __retres;
+}
+
+void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x,
+                       __e_acsl_mpz_struct * y)
+{
+  __e_acsl_mpz_t __gen_e_acsl_add_4;
+  __gmpz_init(__gen_e_acsl_add_4);
+  __gmpz_add(__gen_e_acsl_add_4,(__e_acsl_mpz_struct const *)(x),
+             (__e_acsl_mpz_struct const *)(y));
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4));
+  __gmpz_clear(__gen_e_acsl_add_4);
+  return;
+}
+
+void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x,
+                       __e_acsl_mpz_struct * y)
+{
+  __e_acsl_mpz_t __gen_e_acsl_x_3;
+  __e_acsl_mpz_t __gen_e_acsl_add_3;
+  __gmpz_init_set_si(__gen_e_acsl_x_3,(long)x);
+  __gmpz_init(__gen_e_acsl_add_3);
+  __gmpz_add(__gen_e_acsl_add_3,
+             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3),
+             (__e_acsl_mpz_struct const *)(y));
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3));
+  __gmpz_clear(__gen_e_acsl_x_3);
+  __gmpz_clear(__gen_e_acsl_add_3);
+  return;
+}
+
+long __gen_e_acsl_f1(int x, int y)
+{
+  long __retres = x + (long)y;
+  return __retres;
+}
+
+char __gen_e_acsl_h_char(int c)
+{
+  char __retres = (char)c;
   return __retres;
 }
 
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c
index f742b5af9b1..bdacabaaf9c 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c
@@ -10,60 +10,54 @@ struct mystruct {
 typedef struct mystruct mystruct;
 /*@ predicate p1(int x, int y) = x + y > 0;
  */
-int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg);
+int __gen_e_acsl_p1(int x, int y);
 
 /*@ predicate p2(ℤ x, ℤ y) = x + y > 0;
 
 */
-int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg);
+int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y);
 
-int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg,
-                      __e_acsl_mpz_struct * __gen_e_acsl_y_arg);
+int __gen_e_acsl_p2(int x, int y);
 
 /*@ logic ℤ f1(ℤ x, ℤ y) = x + y;
 
 */
-void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg);
+void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x,
+                       __e_acsl_mpz_struct * y);
 
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       int __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg);
+void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x,
+                       __e_acsl_mpz_struct * y);
 
-void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg);
+void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int x, int y);
 
 /*@ logic char h_char(char c) = c;
  */
-char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg);
+char __gen_e_acsl_h_char(int c);
 
 /*@ logic short h_short(short s) = s;
  */
-short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg);
+short __gen_e_acsl_h_short(int s);
 
 /*@ logic int g_hidden(int x) = x;
  */
-int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg);
+int __gen_e_acsl_g_hidden(int x);
 
 /*@ logic int g(int x) = g_hidden(x);
  */
-int __gen_e_acsl_g(int __gen_e_acsl_x_arg);
+int __gen_e_acsl_g(int x);
 
 /*@ logic mystruct t1(mystruct m) = m;
  */
-mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg);
+mystruct __gen_e_acsl_t1(mystruct m);
 
 /*@ logic ℤ t2(mystruct m) = m.k + m.l;
-
-*/
-void __gen_e_acsl_t2(__e_acsl_mpz_struct * __retres_arg,
-                     mystruct __gen_e_acsl_m_arg);
+ */
+void __gen_e_acsl_t2(__e_acsl_mpz_t *__retres_arg, mystruct m);
 
 /*@ predicate k_pred(ℤ x) = x > 0;
 
 */
-int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg);
+int __gen_e_acsl_k_pred(int x);
 
 /*@ requires k_pred(x); */
 void __gen_e_acsl_k(int x);
@@ -92,78 +86,74 @@ int main(void)
   int y = 2;
   /*@ assert p1(x, y); */
   {
-    int __gen_e_acsl_p1_tapp;
-    __gen_e_acsl_p1_tapp = __gen_e_acsl_p1(x,y);
-    __e_acsl_assert(__gen_e_acsl_p1_tapp,(char *)"Assertion",(char *)"main",
+    int __gen_e_acsl_p1_2;
+    __gen_e_acsl_p1_2 = __gen_e_acsl_p1(x,y);
+    __e_acsl_assert(__gen_e_acsl_p1_2,(char *)"Assertion",(char *)"main",
                     (char *)"p1(x, y)",42);
   }
   /*@ assert p2(3, 4); */
   {
-    int __gen_e_acsl_p2_tapp;
-    __gen_e_acsl_p2_tapp = __gen_e_acsl_p2(3,4);
-    __e_acsl_assert(__gen_e_acsl_p2_tapp,(char *)"Assertion",(char *)"main",
+    int __gen_e_acsl_p2_2;
+    __gen_e_acsl_p2_2 = __gen_e_acsl_p2(3,4);
+    __e_acsl_assert(__gen_e_acsl_p2_2,(char *)"Assertion",(char *)"main",
                     (char *)"p2(3, 4)",43);
   }
   /*@ assert p2(5, 99999999999999999999999999999); */
   {
     __e_acsl_mpz_t __gen_e_acsl__3;
-    int __gen_e_acsl_p2_tapp_2;
+    int __gen_e_acsl_p2_4;
     __gmpz_init_set_str(__gen_e_acsl__3,"99999999999999999999999999999",10);
-    __gen_e_acsl_p2_tapp_2 = __gen_e_acsl_p2_2(5,
-                                               (__e_acsl_mpz_struct *)__gen_e_acsl__3);
-    __e_acsl_assert(__gen_e_acsl_p2_tapp_2,(char *)"Assertion",
-                    (char *)"main",
+    __gen_e_acsl_p2_4 = __gen_e_acsl_p2_3(5,
+                                          (__e_acsl_mpz_struct *)__gen_e_acsl__3);
+    __e_acsl_assert(__gen_e_acsl_p2_4,(char *)"Assertion",(char *)"main",
                     (char *)"p2(5, 99999999999999999999999999999)",44);
     __gmpz_clear(__gen_e_acsl__3);
   }
   /*@ assert f1(x, y) ≡ 3; */
   {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp;
+    __e_acsl_mpz_t __gen_e_acsl_f1_2;
     __e_acsl_mpz_t __gen_e_acsl__5;
     int __gen_e_acsl_eq;
-    __gmpz_init(__gen_e_acsl_f1_tapp);
-    /*@ assert
-        Eva: initialization:
-          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp);
-    */
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp,x,y);
+    __gen_e_acsl_f1(& __gen_e_acsl_f1_2,x,y);
     __gmpz_init_set_si(__gen_e_acsl__5,3L);
-    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp),
+    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_2),
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
     __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
                     (char *)"f1(x, y) == 3",46);
-    __gmpz_clear(__gen_e_acsl_f1_tapp);
+    __gmpz_clear(__gen_e_acsl_f1_2);
     __gmpz_clear(__gen_e_acsl__5);
   }
   /*@ assert p2(x, f1(3, 4)); */
   {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_2;
-    int __gen_e_acsl_p2_tapp_3;
-    __gmpz_init(__gen_e_acsl_f1_tapp_2);
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2,3,4);
-    __gen_e_acsl_p2_tapp_3 = __gen_e_acsl_p2_2(x,
-                                               (__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2);
-    __e_acsl_assert(__gen_e_acsl_p2_tapp_3,(char *)"Assertion",
-                    (char *)"main",(char *)"p2(x, f1(3, 4))",47);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_2);
+    __e_acsl_mpz_t __gen_e_acsl_f1_4;
+    int __gen_e_acsl_p2_6;
+    __gen_e_acsl_f1(& __gen_e_acsl_f1_4,3,4);
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_4);
+    */
+    __gen_e_acsl_p2_6 = __gen_e_acsl_p2_3(x,
+                                          (__e_acsl_mpz_struct *)__gen_e_acsl_f1_4);
+    __e_acsl_assert(__gen_e_acsl_p2_6,(char *)"Assertion",(char *)"main",
+                    (char *)"p2(x, f1(3, 4))",47);
+    __gmpz_clear(__gen_e_acsl_f1_4);
   }
   /*@ assert f1(9, 99999999999999999999999999999) > 0; */
   {
     __e_acsl_mpz_t __gen_e_acsl__6;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3;
+    __e_acsl_mpz_t __gen_e_acsl_f1_6;
     __e_acsl_mpz_t __gen_e_acsl__7;
     int __gen_e_acsl_gt_4;
     __gmpz_init_set_str(__gen_e_acsl__6,"99999999999999999999999999999",10);
-    __gmpz_init(__gen_e_acsl_f1_tapp_3);
-    __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3,9,
+    __gen_e_acsl_f1_5(& __gen_e_acsl_f1_6,9,
                       (__e_acsl_mpz_struct *)__gen_e_acsl__6);
     __gmpz_init_set_si(__gen_e_acsl__7,0L);
-    __gen_e_acsl_gt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3),
+    __gen_e_acsl_gt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
     __e_acsl_assert(__gen_e_acsl_gt_4 > 0,(char *)"Assertion",(char *)"main",
                     (char *)"f1(9, 99999999999999999999999999999) > 0",48);
     __gmpz_clear(__gen_e_acsl__6);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_3);
+    __gmpz_clear(__gen_e_acsl_f1_6);
     __gmpz_clear(__gen_e_acsl__7);
   }
   /*@ assert
@@ -172,50 +162,49 @@ int main(void)
   */
   {
     __e_acsl_mpz_t __gen_e_acsl__8;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4;
+    __e_acsl_mpz_t __gen_e_acsl_f1_8;
     __e_acsl_mpz_t __gen_e_acsl__9;
     int __gen_e_acsl_eq_2;
     __gmpz_init_set_str(__gen_e_acsl__8,"99999999999999999999999999999",10);
-    __gmpz_init(__gen_e_acsl_f1_tapp_4);
-    __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4,
+    __gen_e_acsl_f1_7(& __gen_e_acsl_f1_8,
                       (__e_acsl_mpz_struct *)__gen_e_acsl__8,
                       (__e_acsl_mpz_struct *)__gen_e_acsl__8);
     __gmpz_init_set_str(__gen_e_acsl__9,"199999999999999999999999999998",10);
-    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4),
+    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
     __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
                     (char *)"main",
                     (char *)"f1(99999999999999999999999999999, 99999999999999999999999999999) ==\n199999999999999999999999999998",
                     49);
     __gmpz_clear(__gen_e_acsl__8);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_4);
+    __gmpz_clear(__gen_e_acsl_f1_8);
     __gmpz_clear(__gen_e_acsl__9);
   }
   /*@ assert g(x) ≡ x; */
   {
-    int __gen_e_acsl_g_tapp;
+    int __gen_e_acsl_g_2;
     __e_acsl_mpz_t __gen_e_acsl_app;
-    __e_acsl_mpz_t __gen_e_acsl_x_7;
+    __e_acsl_mpz_t __gen_e_acsl_x_6;
     int __gen_e_acsl_eq_3;
-    __gen_e_acsl_g_tapp = __gen_e_acsl_g(x);
-    __gmpz_init_set_si(__gen_e_acsl_app,(long)__gen_e_acsl_g_tapp);
-    __gmpz_init_set_si(__gen_e_acsl_x_7,(long)x);
+    __gen_e_acsl_g_2 = __gen_e_acsl_g(x);
+    __gmpz_init_set_si(__gen_e_acsl_app,(long)__gen_e_acsl_g_2);
+    __gmpz_init_set_si(__gen_e_acsl_x_6,(long)x);
     __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_app),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_7));
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_6));
     __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"g(x) == x",53);
     __gmpz_clear(__gen_e_acsl_app);
-    __gmpz_clear(__gen_e_acsl_x_7);
+    __gmpz_clear(__gen_e_acsl_x_6);
   }
   char c = (char)'c';
   /*@ assert h_char(c) ≡ c; */
   {
-    char __gen_e_acsl_h_char_tapp;
+    char __gen_e_acsl_h_char_2;
     __e_acsl_mpz_t __gen_e_acsl_app_2;
     __e_acsl_mpz_t __gen_e_acsl_c;
     int __gen_e_acsl_eq_4;
-    __gen_e_acsl_h_char_tapp = __gen_e_acsl_h_char((int)c);
-    __gmpz_init_set_si(__gen_e_acsl_app_2,(long)__gen_e_acsl_h_char_tapp);
+    __gen_e_acsl_h_char_2 = __gen_e_acsl_h_char((int)c);
+    __gmpz_init_set_si(__gen_e_acsl_app_2,(long)__gen_e_acsl_h_char_2);
     __gmpz_init_set_si(__gen_e_acsl_c,(long)c);
     __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_app_2),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_c));
@@ -227,12 +216,12 @@ int main(void)
   short s = (short)1;
   /*@ assert h_short(s) ≡ s; */
   {
-    short __gen_e_acsl_h_short_tapp;
+    short __gen_e_acsl_h_short_2;
     __e_acsl_mpz_t __gen_e_acsl_app_3;
     __e_acsl_mpz_t __gen_e_acsl_s;
     int __gen_e_acsl_eq_5;
-    __gen_e_acsl_h_short_tapp = __gen_e_acsl_h_short((int)s);
-    __gmpz_init_set_si(__gen_e_acsl_app_3,(long)__gen_e_acsl_h_short_tapp);
+    __gen_e_acsl_h_short_2 = __gen_e_acsl_h_short((int)s);
+    __gmpz_init_set_si(__gen_e_acsl_app_3,(long)__gen_e_acsl_h_short_2);
     __gmpz_init_set_si(__gen_e_acsl_s,(long)s);
     __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_app_3),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_s));
@@ -245,20 +234,18 @@ int main(void)
   m.l = 9;
   /*@ assert t2(t1(m)) ≡ 17; */
   {
-    mystruct __gen_e_acsl_t1_tapp;
-    __e_acsl_mpz_t __gen_e_acsl_t2_tapp;
+    mystruct __gen_e_acsl_t1_2;
+    __e_acsl_mpz_t __gen_e_acsl_t2_2;
     __e_acsl_mpz_t __gen_e_acsl__12;
     int __gen_e_acsl_eq_6;
-    __gen_e_acsl_t1_tapp = __gen_e_acsl_t1(m);
-    __gmpz_init(__gen_e_acsl_t2_tapp);
-    __gen_e_acsl_t2((__e_acsl_mpz_struct *)__gen_e_acsl_t2_tapp,
-                    __gen_e_acsl_t1_tapp);
+    __gen_e_acsl_t1_2 = __gen_e_acsl_t1(m);
+    __gen_e_acsl_t2(& __gen_e_acsl_t2_2,__gen_e_acsl_t1_2);
     __gmpz_init_set_si(__gen_e_acsl__12,17L);
-    __gen_e_acsl_eq_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_t2_tapp),
+    __gen_e_acsl_eq_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_t2_2),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
     __e_acsl_assert(__gen_e_acsl_eq_6 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"t2(t1(m)) == 17",63);
-    __gmpz_clear(__gen_e_acsl_t2_tapp);
+    __gmpz_clear(__gen_e_acsl_t2_2);
     __gmpz_clear(__gen_e_acsl__12);
   }
   __gen_e_acsl_k(9);
@@ -270,44 +257,73 @@ int main(void)
 void __gen_e_acsl_k(int x)
 {
   {
-    int __gen_e_acsl_k_pred_tapp;
-    __gen_e_acsl_k_pred_tapp = __gen_e_acsl_k_pred(x);
-    __e_acsl_assert(__gen_e_acsl_k_pred_tapp,(char *)"Precondition",
-                    (char *)"k",(char *)"k_pred(x)",25);
+    int __gen_e_acsl_k_pred_2;
+    __gen_e_acsl_k_pred_2 = __gen_e_acsl_k_pred(x);
+    __e_acsl_assert(__gen_e_acsl_k_pred_2,(char *)"Precondition",(char *)"k",
+                    (char *)"k_pred(x)",25);
   }
   k(x);
   return;
 }
 
-int __gen_e_acsl_k_pred(int __gen_e_acsl_x_arg)
+short __gen_e_acsl_h_short(int s)
+{
+  short __retres = (short)s;
+  return __retres;
+}
+
+int __gen_e_acsl_g_hidden(int x)
+{
+  return x;
+}
+
+int __gen_e_acsl_g(int x)
+{
+  int __gen_e_acsl_g_hidden_2;
+  __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x);
+  return __gen_e_acsl_g_hidden_2;
+}
+
+mystruct __gen_e_acsl_t1(mystruct m)
+{
+  return m;
+}
+
+int __gen_e_acsl_p1(int x, int y)
 {
-  int __retres;
   __e_acsl_mpz_t __gen_e_acsl_x;
+  __e_acsl_mpz_t __gen_e_acsl_y;
+  __e_acsl_mpz_t __gen_e_acsl_add;
   __e_acsl_mpz_t __gen_e_acsl_;
   int __gen_e_acsl_gt;
-  __gmpz_init_set_si(__gen_e_acsl_x,(long)__gen_e_acsl_x_arg);
+  __gmpz_init_set_si(__gen_e_acsl_x,(long)x);
+  __gmpz_init_set_si(__gen_e_acsl_y,(long)y);
+  __gmpz_init(__gen_e_acsl_add);
+  __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x),
+             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y));
   __gmpz_init_set_si(__gen_e_acsl_,0L);
-  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_x),
+  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add),
                                (__e_acsl_mpz_struct const *)(__gen_e_acsl_));
-  __retres = __gen_e_acsl_gt > 0;
+  int __retres = __gen_e_acsl_gt > 0;
   __gmpz_clear(__gen_e_acsl_x);
+  __gmpz_clear(__gen_e_acsl_y);
+  __gmpz_clear(__gen_e_acsl_add);
   __gmpz_clear(__gen_e_acsl_);
   return __retres;
 }
 
-void __gen_e_acsl_t2(__e_acsl_mpz_struct * __retres_arg,
-                     mystruct __gen_e_acsl_m_arg)
+void __gen_e_acsl_t2(__e_acsl_mpz_t *__retres_arg, mystruct m)
 {
   __e_acsl_mpz_t __gen_e_acsl__10;
   __e_acsl_mpz_t __gen_e_acsl__11;
   __e_acsl_mpz_t __gen_e_acsl_add_7;
-  __gmpz_init_set_si(__gen_e_acsl__10,(long)__gen_e_acsl_m_arg.k);
-  __gmpz_init_set_si(__gen_e_acsl__11,(long)__gen_e_acsl_m_arg.l);
+  __gmpz_init_set_si(__gen_e_acsl__10,(long)m.k);
+  __gmpz_init_set_si(__gen_e_acsl__11,(long)m.l);
   __gmpz_init(__gen_e_acsl_add_7);
   __gmpz_add(__gen_e_acsl_add_7,
              (__e_acsl_mpz_struct const *)(__gen_e_acsl__10),
              (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
-  __gmpz_init_set(__retres_arg,
+  __gmpz_init_set(*__retres_arg,
                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_7));
   __gmpz_clear(__gen_e_acsl__10);
   __gmpz_clear(__gen_e_acsl__11);
@@ -315,145 +331,36 @@ void __gen_e_acsl_t2(__e_acsl_mpz_struct * __retres_arg,
   return;
 }
 
-mystruct __gen_e_acsl_t1(mystruct __gen_e_acsl_m_arg)
-{
-  mystruct __retres;
-  __retres = __gen_e_acsl_m_arg;
-  return __retres;
-}
-
-int __gen_e_acsl_g(int __gen_e_acsl_x_arg)
-{
-  int __retres;
-  int __gen_e_acsl_g_hidden_tapp;
-  __gen_e_acsl_g_hidden_tapp = __gen_e_acsl_g_hidden(__gen_e_acsl_x_arg);
-  __retres = __gen_e_acsl_g_hidden_tapp;
-  return __retres;
-}
-
-int __gen_e_acsl_g_hidden(int __gen_e_acsl_x_arg)
-{
-  int __retres;
-  __retres = __gen_e_acsl_x_arg;
-  return __retres;
-}
-
-short __gen_e_acsl_h_short(int __gen_e_acsl_s_arg)
-{
-  int __retres;
-  __retres = (short)__gen_e_acsl_s_arg;
-  return __retres;
-}
-
-char __gen_e_acsl_h_char(int __gen_e_acsl_c_arg)
-{
-  int __retres;
-  __retres = (char)__gen_e_acsl_c_arg;
-  return __retres;
-}
-
-void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_x_6;
-  __e_acsl_mpz_t __gen_e_acsl_y_6;
-  __e_acsl_mpz_t __gen_e_acsl_add_6;
-  __gmpz_init_set(__gen_e_acsl_x_6,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_arg));
-  __gmpz_init_set(__gen_e_acsl_y_6,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg));
-  __gmpz_init(__gen_e_acsl_add_6);
-  __gmpz_add(__gen_e_acsl_add_6,
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_6),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_6));
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_6));
-  __gmpz_clear(__gen_e_acsl_x_6);
-  __gmpz_clear(__gen_e_acsl_y_6);
-  __gmpz_clear(__gen_e_acsl_add_6);
-  return;
-}
-
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       int __gen_e_acsl_x_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_y_arg)
+int __gen_e_acsl_p2_3(int x, __e_acsl_mpz_struct * y)
 {
-  __e_acsl_mpz_t __gen_e_acsl_y_5;
-  __e_acsl_mpz_t __gen_e_acsl_x_5;
-  __e_acsl_mpz_t __gen_e_acsl_add_5;
-  __gmpz_init_set(__gen_e_acsl_y_5,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg));
-  __gmpz_init_set_si(__gen_e_acsl_x_5,(long)__gen_e_acsl_x_arg);
-  __gmpz_init(__gen_e_acsl_add_5);
-  __gmpz_add(__gen_e_acsl_add_5,
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_5),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_5));
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_5));
-  __gmpz_clear(__gen_e_acsl_y_5);
-  __gmpz_clear(__gen_e_acsl_x_5);
-  __gmpz_clear(__gen_e_acsl_add_5);
-  return;
-}
-
-void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_x_4;
-  __e_acsl_mpz_t __gen_e_acsl_y_4;
-  __e_acsl_mpz_t __gen_e_acsl_add_4;
-  __gmpz_init_set_si(__gen_e_acsl_x_4,(long)__gen_e_acsl_x_arg);
-  __gmpz_init_set_si(__gen_e_acsl_y_4,(long)__gen_e_acsl_y_arg);
-  __gmpz_init(__gen_e_acsl_add_4);
-  __gmpz_add(__gen_e_acsl_add_4,
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_4));
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4));
-  __gmpz_clear(__gen_e_acsl_x_4);
-  __gmpz_clear(__gen_e_acsl_y_4);
-  __gmpz_clear(__gen_e_acsl_add_4);
-  return;
-}
-
-int __gen_e_acsl_p2_2(int __gen_e_acsl_x_arg,
-                      __e_acsl_mpz_struct * __gen_e_acsl_y_arg)
-{
-  int __retres;
-  __e_acsl_mpz_t __gen_e_acsl_y_3;
   __e_acsl_mpz_t __gen_e_acsl_x_3;
   __e_acsl_mpz_t __gen_e_acsl_add_3;
   __e_acsl_mpz_t __gen_e_acsl__4;
   int __gen_e_acsl_gt_3;
-  __gmpz_init_set(__gen_e_acsl_y_3,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_arg));
-  __gmpz_init_set_si(__gen_e_acsl_x_3,(long)__gen_e_acsl_x_arg);
+  __gmpz_init_set_si(__gen_e_acsl_x_3,(long)x);
   __gmpz_init(__gen_e_acsl_add_3);
   __gmpz_add(__gen_e_acsl_add_3,
              (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_3),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_3));
+             (__e_acsl_mpz_struct const *)(y));
   __gmpz_init_set_si(__gen_e_acsl__4,0L);
   __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3),
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
-  __retres = __gen_e_acsl_gt_3 > 0;
-  __gmpz_clear(__gen_e_acsl_y_3);
+  int __retres = __gen_e_acsl_gt_3 > 0;
   __gmpz_clear(__gen_e_acsl_x_3);
   __gmpz_clear(__gen_e_acsl_add_3);
   __gmpz_clear(__gen_e_acsl__4);
   return __retres;
 }
 
-int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
+int __gen_e_acsl_p2(int x, int y)
 {
-  int __retres;
   __e_acsl_mpz_t __gen_e_acsl_x_2;
   __e_acsl_mpz_t __gen_e_acsl_y_2;
   __e_acsl_mpz_t __gen_e_acsl_add_2;
   __e_acsl_mpz_t __gen_e_acsl__2;
   int __gen_e_acsl_gt_2;
-  __gmpz_init_set_si(__gen_e_acsl_x_2,(long)__gen_e_acsl_x_arg);
-  __gmpz_init_set_si(__gen_e_acsl_y_2,(long)__gen_e_acsl_y_arg);
+  __gmpz_init_set_si(__gen_e_acsl_x_2,(long)x);
+  __gmpz_init_set_si(__gen_e_acsl_y_2,(long)y);
   __gmpz_init(__gen_e_acsl_add_2);
   __gmpz_add(__gen_e_acsl_add_2,
              (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_2),
@@ -461,7 +368,7 @@ int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
   __gmpz_init_set_si(__gen_e_acsl__2,0L);
   __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2),
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__2));
-  __retres = __gen_e_acsl_gt_2 > 0;
+  int __retres = __gen_e_acsl_gt_2 > 0;
   __gmpz_clear(__gen_e_acsl_x_2);
   __gmpz_clear(__gen_e_acsl_y_2);
   __gmpz_clear(__gen_e_acsl_add_2);
@@ -469,28 +376,74 @@ int __gen_e_acsl_p2(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
   return __retres;
 }
 
-int __gen_e_acsl_p1(int __gen_e_acsl_x_arg, int __gen_e_acsl_y_arg)
+int __gen_e_acsl_k_pred(int x)
 {
-  int __retres;
   __e_acsl_mpz_t __gen_e_acsl_x;
-  __e_acsl_mpz_t __gen_e_acsl_y;
-  __e_acsl_mpz_t __gen_e_acsl_add;
   __e_acsl_mpz_t __gen_e_acsl_;
   int __gen_e_acsl_gt;
-  __gmpz_init_set_si(__gen_e_acsl_x,(long)__gen_e_acsl_x_arg);
-  __gmpz_init_set_si(__gen_e_acsl_y,(long)__gen_e_acsl_y_arg);
-  __gmpz_init(__gen_e_acsl_add);
-  __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x),
-             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y));
+  __gmpz_init_set_si(__gen_e_acsl_x,(long)x);
   __gmpz_init_set_si(__gen_e_acsl_,0L);
-  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add),
+  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_x),
                                (__e_acsl_mpz_struct const *)(__gen_e_acsl_));
-  __retres = __gen_e_acsl_gt > 0;
+  int __retres = __gen_e_acsl_gt > 0;
   __gmpz_clear(__gen_e_acsl_x);
-  __gmpz_clear(__gen_e_acsl_y);
-  __gmpz_clear(__gen_e_acsl_add);
   __gmpz_clear(__gen_e_acsl_);
   return __retres;
 }
 
+void __gen_e_acsl_f1_7(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * x,
+                       __e_acsl_mpz_struct * y)
+{
+  __e_acsl_mpz_t __gen_e_acsl_add_6;
+  __gmpz_init(__gen_e_acsl_add_6);
+  __gmpz_add(__gen_e_acsl_add_6,(__e_acsl_mpz_struct const *)(x),
+             (__e_acsl_mpz_struct const *)(y));
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_6));
+  __gmpz_clear(__gen_e_acsl_add_6);
+  return;
+}
+
+void __gen_e_acsl_f1_5(__e_acsl_mpz_t *__retres_arg, int x,
+                       __e_acsl_mpz_struct * y)
+{
+  __e_acsl_mpz_t __gen_e_acsl_x_5;
+  __e_acsl_mpz_t __gen_e_acsl_add_5;
+  __gmpz_init_set_si(__gen_e_acsl_x_5,(long)x);
+  __gmpz_init(__gen_e_acsl_add_5);
+  __gmpz_add(__gen_e_acsl_add_5,
+             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_5),
+             (__e_acsl_mpz_struct const *)(y));
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_5));
+  __gmpz_clear(__gen_e_acsl_x_5);
+  __gmpz_clear(__gen_e_acsl_add_5);
+  return;
+}
+
+void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int x, int y)
+{
+  __e_acsl_mpz_t __gen_e_acsl_x_4;
+  __e_acsl_mpz_t __gen_e_acsl_y_3;
+  __e_acsl_mpz_t __gen_e_acsl_add_4;
+  __gmpz_init_set_si(__gen_e_acsl_x_4,(long)x);
+  __gmpz_init_set_si(__gen_e_acsl_y_3,(long)y);
+  __gmpz_init(__gen_e_acsl_add_4);
+  __gmpz_add(__gen_e_acsl_add_4,
+             (__e_acsl_mpz_struct const *)(__gen_e_acsl_x_4),
+             (__e_acsl_mpz_struct const *)(__gen_e_acsl_y_3));
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4));
+  __gmpz_clear(__gen_e_acsl_x_4);
+  __gmpz_clear(__gen_e_acsl_y_3);
+  __gmpz_clear(__gen_e_acsl_add_4);
+  return;
+}
+
+char __gen_e_acsl_h_char(int c)
+{
+  char __retres = (char)c;
+  return __retres;
+}
+
 
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c
index 57ff6cf6273..5c263c6479e 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec.c
@@ -2,622 +2,207 @@
 #include "stdio.h"
 #include "stdlib.h"
 /*@ logic ℤ f1(ℤ n) = n ≤ 0? 0: f1(n - 1) + n;
-
-*/
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       long __gen_e_acsl_n_arg);
-
-void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg);
-
-void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg);
-
+ */
 /*@ logic ℤ f2(ℤ n) = n < 0? 1: (f2(n - 1) * f2(n - 2)) / f2(n - 3);
+ */
+int __gen_e_acsl_f2_2(long n);
 
-*/
-int __gen_e_acsl_f2_2(long __gen_e_acsl_n_arg);
-
-int __gen_e_acsl_f2(int __gen_e_acsl_n_arg);
-
-int __gen_e_acsl_f2_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+int __gen_e_acsl_f2(int n);
 
 /*@ logic ℤ g(ℤ n) = 0;
+ */
+int __gen_e_acsl_g_5(long n);
 
-*/
-int __gen_e_acsl_g_2(long __gen_e_acsl_n_arg);
-
-int __gen_e_acsl_g(int __gen_e_acsl_n_arg);
-
-int __gen_e_acsl_g_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+int __gen_e_acsl_g(int n);
 
 /*@ logic ℤ f3(ℤ n) = n > 0? g(n) * f3(n - 1) - 5: g(n + 1);
+ */
+int __gen_e_acsl_f3_2(long n);
 
-*/
-int __gen_e_acsl_f3_2(long __gen_e_acsl_n_arg);
-
-int __gen_e_acsl_f3(int __gen_e_acsl_n_arg);
-
-int __gen_e_acsl_f3_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+int __gen_e_acsl_f3(int n);
 
 /*@
 logic ℤ f4(ℤ n) =
   n < 100? f4(n + 1): (n < 0x7fffffffffffffffL? 0x7fffffffffffffffL: 6);
 
 */
-unsigned long __gen_e_acsl_f4_2(long __gen_e_acsl_n_arg);
-
-unsigned long __gen_e_acsl_f4(int __gen_e_acsl_n_arg);
+unsigned long __gen_e_acsl_f4_2(long n);
 
-unsigned long __gen_e_acsl_f4_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+unsigned long __gen_e_acsl_f4(int n);
 
 int main(void)
 {
   int __retres;
   __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
-  /*@ assert f1(0) ≡ 0; */
-  {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp;
-    __e_acsl_mpz_t __gen_e_acsl__7;
-    int __gen_e_acsl_eq;
-    __gmpz_init(__gen_e_acsl_f1_tapp);
-    /*@ assert
-        Eva: initialization:
-          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp);
-    */
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp,0);
-    __gmpz_init_set_si(__gen_e_acsl__7,0L);
-    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
-    __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
-                    (char *)"f1(0) == 0",21);
-    __gmpz_clear(__gen_e_acsl_f1_tapp);
-    __gmpz_clear(__gen_e_acsl__7);
-  }
-  /*@ assert f1(1) ≡ 1; */
-  {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_5;
-    __e_acsl_mpz_t __gen_e_acsl__8;
-    int __gen_e_acsl_eq_2;
-    __gmpz_init(__gen_e_acsl_f1_tapp_5);
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_5,1);
-    __gmpz_init_set_si(__gen_e_acsl__8,1L);
-    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_5),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
-    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
-                    (char *)"main",(char *)"f1(1) == 1",22);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_5);
-    __gmpz_clear(__gen_e_acsl__8);
-  }
-  /*@ assert f1(100) ≡ 5050; */
-  {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_6;
-    __e_acsl_mpz_t __gen_e_acsl__9;
-    int __gen_e_acsl_eq_3;
-    __gmpz_init(__gen_e_acsl_f1_tapp_6);
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_6,100);
-    __gmpz_init_set_si(__gen_e_acsl__9,5050L);
-    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_6),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
-    __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion",
-                    (char *)"main",(char *)"f1(100) == 5050",23);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_6);
-    __gmpz_clear(__gen_e_acsl__9);
-  }
   /*@ assert f2(7) ≡ 1; */
   {
-    int __gen_e_acsl_f2_tapp;
-    __gen_e_acsl_f2_tapp = __gen_e_acsl_f2(7);
-    __e_acsl_assert(__gen_e_acsl_f2_tapp == 1,(char *)"Assertion",
+    int __gen_e_acsl_f2_14;
+    __gen_e_acsl_f2_14 = __gen_e_acsl_f2(7);
+    __e_acsl_assert(__gen_e_acsl_f2_14 == 1,(char *)"Assertion",
                     (char *)"main",(char *)"f2(7) == 1",25);
   }
   /*@ assert f3(6) ≡ -5; */
   {
-    int __gen_e_acsl_f3_tapp;
-    __gen_e_acsl_f3_tapp = __gen_e_acsl_f3(6);
-    __e_acsl_assert(__gen_e_acsl_f3_tapp == -5,(char *)"Assertion",
+    int __gen_e_acsl_f3_6;
+    __gen_e_acsl_f3_6 = __gen_e_acsl_f3(6);
+    __e_acsl_assert(__gen_e_acsl_f3_6 == -5,(char *)"Assertion",
                     (char *)"main",(char *)"f3(6) == -5",27);
   }
   /*@ assert f4(9) > 0; */
   {
-    unsigned long __gen_e_acsl_f4_tapp;
-    __gen_e_acsl_f4_tapp = __gen_e_acsl_f4(9);
-    __e_acsl_assert(__gen_e_acsl_f4_tapp > 0UL,(char *)"Assertion",
+    unsigned long __gen_e_acsl_f4_6;
+    __gen_e_acsl_f4_6 = __gen_e_acsl_f4(9);
+    __e_acsl_assert(__gen_e_acsl_f4_6 > 0UL,(char *)"Assertion",
                     (char *)"main",(char *)"f4(9) > 0",29);
   }
   __retres = 0;
   return __retres;
 }
 
-unsigned long __gen_e_acsl_f4_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg)
+int __gen_e_acsl_f2_2(long n)
 {
-  unsigned long __retres;
-  __e_acsl_mpz_t __gen_e_acsl_n_11;
-  __e_acsl_mpz_t __gen_e_acsl__23;
-  int __gen_e_acsl_lt_2;
-  unsigned long __gen_e_acsl_if_11;
-  __gmpz_init_set(__gen_e_acsl_n_11,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__23,100L);
-  __gen_e_acsl_lt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__23));
-  if (__gen_e_acsl_lt_2 < 0) {
-    __e_acsl_mpz_t __gen_e_acsl__24;
-    __e_acsl_mpz_t __gen_e_acsl_add_7;
-    unsigned long __gen_e_acsl_f4_tapp_4;
-    __gmpz_init_set_si(__gen_e_acsl__24,1L);
-    __gmpz_init(__gen_e_acsl_add_7);
-    __gmpz_add(__gen_e_acsl_add_7,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__24));
-    __gen_e_acsl_f4_tapp_4 = __gen_e_acsl_f4_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_7);
-    __gen_e_acsl_if_11 = __gen_e_acsl_f4_tapp_4;
-    __gmpz_clear(__gen_e_acsl__24);
-    __gmpz_clear(__gen_e_acsl_add_7);
-  }
+  int __gen_e_acsl_if;
+  if (n < 0L) __gen_e_acsl_if = 1;
   else {
-    __e_acsl_mpz_t __gen_e_acsl__25;
-    int __gen_e_acsl_lt_3;
-    unsigned long __gen_e_acsl_if_10;
-    __gmpz_init_set_ui(__gen_e_acsl__25,9223372036854775807UL);
-    __gen_e_acsl_lt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__25));
-    if (__gen_e_acsl_lt_3 < 0) __gen_e_acsl_if_10 = 9223372036854775807UL;
-    else __gen_e_acsl_if_10 = 6UL;
-    __gen_e_acsl_if_11 = __gen_e_acsl_if_10;
-    __gmpz_clear(__gen_e_acsl__25);
+    int __gen_e_acsl_f2_4;
+    int __gen_e_acsl_f2_6;
+    int __gen_e_acsl_f2_8;
+    __gen_e_acsl_f2_4 = __gen_e_acsl_f2_2(n - 1L);
+    __gen_e_acsl_f2_6 = __gen_e_acsl_f2_2(n - 2L);
+    __gen_e_acsl_f2_8 = __gen_e_acsl_f2_2(n - 3L);
+    __e_acsl_assert(__gen_e_acsl_f2_8 != 0,(char *)"RTE",(char *)"f2_2",
+                    (char *)"division_by_zero: __gen_e_acsl_f2_8 != 0",9);
+    /*@ assert Eva: division_by_zero: __gen_e_acsl_f2_8 ≢ 0; */
+    /*@ assert
+        Eva: signed_overflow:
+          -2147483648 ≤ __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6;
+    */
+    /*@ assert
+        Eva: signed_overflow:
+          __gen_e_acsl_f2_4 * __gen_e_acsl_f2_6 ≤ 2147483647;
+    */
+    /*@ assert
+        Eva: signed_overflow:
+          (int)(__gen_e_acsl_f2_4 * __gen_e_acsl_f2_6) / __gen_e_acsl_f2_8
+          ≤ 2147483647;
+    */
+    __gen_e_acsl_if = (__gen_e_acsl_f2_4 * __gen_e_acsl_f2_6) / __gen_e_acsl_f2_8;
   }
-  __retres = __gen_e_acsl_if_11;
-  __gmpz_clear(__gen_e_acsl_n_11);
-  __gmpz_clear(__gen_e_acsl__23);
-  return __retres;
+  return __gen_e_acsl_if;
 }
 
-unsigned long __gen_e_acsl_f4(int __gen_e_acsl_n_arg)
+int __gen_e_acsl_f2(int n)
 {
-  unsigned long __retres;
-  unsigned long __gen_e_acsl_if_15;
-  if (__gen_e_acsl_n_arg < 100) {
-    unsigned long __gen_e_acsl_f4_tapp_2;
-    __gen_e_acsl_f4_tapp_2 = __gen_e_acsl_f4_2(__gen_e_acsl_n_arg + 1L);
-    __gen_e_acsl_if_15 = __gen_e_acsl_f4_tapp_2;
-  }
+  int __gen_e_acsl_if_2;
+  if (n < 0) __gen_e_acsl_if_2 = 1;
   else {
-    unsigned long __gen_e_acsl_if_14;
-    if ((long)__gen_e_acsl_n_arg < 9223372036854775807L) __gen_e_acsl_if_14 = 9223372036854775807UL;
-    else __gen_e_acsl_if_14 = 6UL;
-    __gen_e_acsl_if_15 = __gen_e_acsl_if_14;
+    int __gen_e_acsl_f2_9;
+    int __gen_e_acsl_f2_11;
+    int __gen_e_acsl_f2_13;
+    __gen_e_acsl_f2_9 = __gen_e_acsl_f2_2(n - 1L);
+    __gen_e_acsl_f2_11 = __gen_e_acsl_f2_2(n - 2L);
+    __gen_e_acsl_f2_13 = __gen_e_acsl_f2_2(n - 3L);
+    __e_acsl_assert(__gen_e_acsl_f2_13 != 0,(char *)"RTE",(char *)"f2",
+                    (char *)"division_by_zero: __gen_e_acsl_f2_13 != 0",9);
+    /*@ assert Eva: division_by_zero: __gen_e_acsl_f2_13 ≢ 0; */
+    /*@ assert
+        Eva: signed_overflow:
+          -2147483648 ≤ __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11;
+    */
+    /*@ assert
+        Eva: signed_overflow:
+          __gen_e_acsl_f2_9 * __gen_e_acsl_f2_11 ≤ 2147483647;
+    */
+    /*@ assert
+        Eva: signed_overflow:
+          (int)(__gen_e_acsl_f2_9 * __gen_e_acsl_f2_11) / __gen_e_acsl_f2_13
+          ≤ 2147483647;
+    */
+    __gen_e_acsl_if_2 = (__gen_e_acsl_f2_9 * __gen_e_acsl_f2_11) / __gen_e_acsl_f2_13;
   }
-  __retres = __gen_e_acsl_if_15;
-  return __retres;
+  return __gen_e_acsl_if_2;
 }
 
-unsigned long __gen_e_acsl_f4_2(long __gen_e_acsl_n_arg)
+int __gen_e_acsl_g_5(long n)
 {
-  unsigned long __retres;
-  unsigned long __gen_e_acsl_if_13;
-  if (__gen_e_acsl_n_arg < 100L) {
-    __e_acsl_mpz_t __gen_e_acsl_n_10;
-    __e_acsl_mpz_t __gen_e_acsl__22;
-    __e_acsl_mpz_t __gen_e_acsl_add_6;
-    unsigned long __gen_e_acsl_f4_tapp_3;
-    __gmpz_init_set_si(__gen_e_acsl_n_10,__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__22,1L);
-    __gmpz_init(__gen_e_acsl_add_6);
-    __gmpz_add(__gen_e_acsl_add_6,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_10),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__22));
-    __gen_e_acsl_f4_tapp_3 = __gen_e_acsl_f4_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_6);
-    __gen_e_acsl_if_13 = __gen_e_acsl_f4_tapp_3;
-    __gmpz_clear(__gen_e_acsl_n_10);
-    __gmpz_clear(__gen_e_acsl__22);
-    __gmpz_clear(__gen_e_acsl_add_6);
-  }
-  else {
-    unsigned long __gen_e_acsl_if_12;
-    if (__gen_e_acsl_n_arg < 9223372036854775807L) __gen_e_acsl_if_12 = 9223372036854775807UL;
-    else __gen_e_acsl_if_12 = 6UL;
-    __gen_e_acsl_if_13 = __gen_e_acsl_if_12;
-  }
-  __retres = __gen_e_acsl_if_13;
+  int __retres = 0;
   return __retres;
 }
 
-int __gen_e_acsl_f3_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg)
+int __gen_e_acsl_g(int n)
 {
-  int __retres;
-  __e_acsl_mpz_t __gen_e_acsl_n_7;
-  __e_acsl_mpz_t __gen_e_acsl__18;
-  int __gen_e_acsl_gt;
-  int __gen_e_acsl_if_7;
-  __gmpz_init_set(__gen_e_acsl_n_7,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__18,0L);
-  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7),
-                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__18));
-  if (__gen_e_acsl_gt > 0) {
-    int __gen_e_acsl_g_tapp_3;
-    __e_acsl_mpz_t __gen_e_acsl__19;
-    __e_acsl_mpz_t __gen_e_acsl_sub_10;
-    int __gen_e_acsl_f3_tapp_4;
-    __gen_e_acsl_g_tapp_3 = __gen_e_acsl_g_3((__e_acsl_mpz_struct *)__gen_e_acsl_n_7);
-    __gmpz_init_set_si(__gen_e_acsl__19,1L);
-    __gmpz_init(__gen_e_acsl_sub_10);
-    __gmpz_sub(__gen_e_acsl_sub_10,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__19));
-    __gen_e_acsl_f3_tapp_4 = __gen_e_acsl_f3_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_10);
-    __gen_e_acsl_if_7 = __gen_e_acsl_g_tapp_3 * __gen_e_acsl_f3_tapp_4 - 5;
-    __gmpz_clear(__gen_e_acsl__19);
-    __gmpz_clear(__gen_e_acsl_sub_10);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl__20;
-    __e_acsl_mpz_t __gen_e_acsl_add_4;
-    int __gen_e_acsl_g_tapp_4;
-    __gmpz_init_set_si(__gen_e_acsl__20,1L);
-    __gmpz_init(__gen_e_acsl_add_4);
-    __gmpz_add(__gen_e_acsl_add_4,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__20));
-    __gen_e_acsl_g_tapp_4 = __gen_e_acsl_g_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_4);
-    __gen_e_acsl_if_7 = __gen_e_acsl_g_tapp_4;
-    __gmpz_clear(__gen_e_acsl__20);
-    __gmpz_clear(__gen_e_acsl_add_4);
-  }
-  __retres = __gen_e_acsl_if_7;
-  __gmpz_clear(__gen_e_acsl_n_7);
-  __gmpz_clear(__gen_e_acsl__18);
+  int __retres = 0;
   return __retres;
 }
 
-int __gen_e_acsl_f3(int __gen_e_acsl_n_arg)
+int __gen_e_acsl_f3_2(long n)
 {
-  int __retres;
-  int __gen_e_acsl_if_9;
-  if (__gen_e_acsl_n_arg > 0) {
-    int __gen_e_acsl_g_tapp;
-    int __gen_e_acsl_f3_tapp_2;
-    __gen_e_acsl_g_tapp = __gen_e_acsl_g(__gen_e_acsl_n_arg);
-    __gen_e_acsl_f3_tapp_2 = __gen_e_acsl_f3_2(__gen_e_acsl_n_arg - 1L);
-    __gen_e_acsl_if_9 = __gen_e_acsl_g_tapp * __gen_e_acsl_f3_tapp_2 - 5;
+  int __gen_e_acsl_if_3;
+  if (n > 0L) {
+    int __gen_e_acsl_g_4;
+    int __gen_e_acsl_f3_4;
+    __gen_e_acsl_g_4 = __gen_e_acsl_g((int)n);
+    __gen_e_acsl_f3_4 = __gen_e_acsl_f3_2(n - 1L);
+    __gen_e_acsl_if_3 = __gen_e_acsl_g_4 * __gen_e_acsl_f3_4 - 5;
   }
   else {
-    int __gen_e_acsl_g_tapp_6;
-    __gen_e_acsl_g_tapp_6 = __gen_e_acsl_g_2(__gen_e_acsl_n_arg + 1L);
-    __gen_e_acsl_if_9 = __gen_e_acsl_g_tapp_6;
+    int __gen_e_acsl_g_6;
+    __gen_e_acsl_g_6 = __gen_e_acsl_g_5(n + 1L);
+    __gen_e_acsl_if_3 = __gen_e_acsl_g_6;
   }
-  __retres = __gen_e_acsl_if_9;
-  return __retres;
+  return __gen_e_acsl_if_3;
 }
 
-int __gen_e_acsl_f3_2(long __gen_e_acsl_n_arg)
+int __gen_e_acsl_f3(int n)
 {
-  int __retres;
-  int __gen_e_acsl_if_8;
-  if (__gen_e_acsl_n_arg > 0L) {
-    int __gen_e_acsl_g_tapp_2;
-    __e_acsl_mpz_t __gen_e_acsl_n_6;
-    __e_acsl_mpz_t __gen_e_acsl__17;
-    __e_acsl_mpz_t __gen_e_acsl_sub_9;
-    int __gen_e_acsl_f3_tapp_3;
-    __gen_e_acsl_g_tapp_2 = __gen_e_acsl_g_2(__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl_n_6,__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__17,1L);
-    __gmpz_init(__gen_e_acsl_sub_9);
-    __gmpz_sub(__gen_e_acsl_sub_9,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__17));
-    __gen_e_acsl_f3_tapp_3 = __gen_e_acsl_f3_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_9);
-    __gen_e_acsl_if_8 = __gen_e_acsl_g_tapp_2 * __gen_e_acsl_f3_tapp_3 - 5;
-    __gmpz_clear(__gen_e_acsl_n_6);
-    __gmpz_clear(__gen_e_acsl__17);
-    __gmpz_clear(__gen_e_acsl_sub_9);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl_n_9;
-    __e_acsl_mpz_t __gen_e_acsl__21;
-    __e_acsl_mpz_t __gen_e_acsl_add_5;
-    int __gen_e_acsl_g_tapp_5;
-    __gmpz_init_set_si(__gen_e_acsl_n_9,__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__21,1L);
-    __gmpz_init(__gen_e_acsl_add_5);
-    __gmpz_add(__gen_e_acsl_add_5,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__21));
-    __gen_e_acsl_g_tapp_5 = __gen_e_acsl_g_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_5);
-    __gen_e_acsl_if_8 = __gen_e_acsl_g_tapp_5;
-    __gmpz_clear(__gen_e_acsl_n_9);
-    __gmpz_clear(__gen_e_acsl__21);
-    __gmpz_clear(__gen_e_acsl_add_5);
-  }
-  __retres = __gen_e_acsl_if_8;
-  return __retres;
-}
-
-int __gen_e_acsl_g_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  int __retres;
-  __e_acsl_mpz_t __gen_e_acsl_n_8;
-  __gmpz_init_set(__gen_e_acsl_n_8,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __retres = 0;
-  __gmpz_clear(__gen_e_acsl_n_8);
-  return __retres;
-}
-
-int __gen_e_acsl_g(int __gen_e_acsl_n_arg)
-{
-  int __retres;
-  __retres = 0;
-  return __retres;
-}
-
-int __gen_e_acsl_g_2(long __gen_e_acsl_n_arg)
-{
-  int __retres;
-  __retres = 0;
-  return __retres;
-}
-
-int __gen_e_acsl_f2_3(__e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  int __retres;
-  __e_acsl_mpz_t __gen_e_acsl_n_5;
-  __e_acsl_mpz_t __gen_e_acsl__11;
-  int __gen_e_acsl_lt;
   int __gen_e_acsl_if_4;
-  __gmpz_init_set(__gen_e_acsl_n_5,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__11,0L);
-  __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
-  if (__gen_e_acsl_lt < 0) __gen_e_acsl_if_4 = 1;
-  else {
-    __e_acsl_mpz_t __gen_e_acsl__12;
-    __e_acsl_mpz_t __gen_e_acsl_sub_4;
-    int __gen_e_acsl_f2_tapp_4;
-    __e_acsl_mpz_t __gen_e_acsl__13;
-    __e_acsl_mpz_t __gen_e_acsl_sub_5;
-    int __gen_e_acsl_f2_tapp_5;
-    __e_acsl_mpz_t __gen_e_acsl__14;
-    __e_acsl_mpz_t __gen_e_acsl_sub_6;
-    int __gen_e_acsl_f2_tapp_6;
-    __gmpz_init_set_si(__gen_e_acsl__12,1L);
-    __gmpz_init(__gen_e_acsl_sub_4);
-    __gmpz_sub(__gen_e_acsl_sub_4,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
-    __gen_e_acsl_f2_tapp_4 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_4);
-    __gmpz_init_set_si(__gen_e_acsl__13,2L);
-    __gmpz_init(__gen_e_acsl_sub_5);
-    __gmpz_sub(__gen_e_acsl_sub_5,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
-    __gen_e_acsl_f2_tapp_5 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_5);
-    __gmpz_init_set_si(__gen_e_acsl__14,3L);
-    __gmpz_init(__gen_e_acsl_sub_6);
-    __gmpz_sub(__gen_e_acsl_sub_6,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__14));
-    __gen_e_acsl_f2_tapp_6 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_6);
-    __e_acsl_assert(__gen_e_acsl_f2_tapp_6 != 0,(char *)"RTE",(char *)"f2_3",
-                    (char *)"division_by_zero: __gen_e_acsl_f2_tapp_6 != 0",
-                    9);
-    __gen_e_acsl_if_4 = (__gen_e_acsl_f2_tapp_4 * __gen_e_acsl_f2_tapp_5) / __gen_e_acsl_f2_tapp_6;
-    __gmpz_clear(__gen_e_acsl__12);
-    __gmpz_clear(__gen_e_acsl_sub_4);
-    __gmpz_clear(__gen_e_acsl__13);
-    __gmpz_clear(__gen_e_acsl_sub_5);
-    __gmpz_clear(__gen_e_acsl__14);
-    __gmpz_clear(__gen_e_acsl_sub_6);
-  }
-  __retres = __gen_e_acsl_if_4;
-  __gmpz_clear(__gen_e_acsl_n_5);
-  __gmpz_clear(__gen_e_acsl__11);
-  return __retres;
-}
-
-int __gen_e_acsl_f2(int __gen_e_acsl_n_arg)
-{
-  int __retres;
-  int __gen_e_acsl_if_6;
-  if (__gen_e_acsl_n_arg < 0) __gen_e_acsl_if_6 = 1;
-  else {
-    int __gen_e_acsl_f2_tapp_2;
-    int __gen_e_acsl_f2_tapp_9;
-    int __gen_e_acsl_f2_tapp_10;
-    __gen_e_acsl_f2_tapp_2 = __gen_e_acsl_f2_2(__gen_e_acsl_n_arg - 1L);
-    __gen_e_acsl_f2_tapp_9 = __gen_e_acsl_f2_2(__gen_e_acsl_n_arg - 2L);
-    __gen_e_acsl_f2_tapp_10 = __gen_e_acsl_f2_2(__gen_e_acsl_n_arg - 3L);
-    __e_acsl_assert(__gen_e_acsl_f2_tapp_10 != 0,(char *)"RTE",(char *)"f2",
-                    (char *)"division_by_zero: __gen_e_acsl_f2_tapp_10 != 0",
-                    9);
-    __gen_e_acsl_if_6 = (__gen_e_acsl_f2_tapp_2 * __gen_e_acsl_f2_tapp_9) / __gen_e_acsl_f2_tapp_10;
-  }
-  __retres = __gen_e_acsl_if_6;
-  return __retres;
-}
-
-int __gen_e_acsl_f2_2(long __gen_e_acsl_n_arg)
-{
-  int __retres;
-  int __gen_e_acsl_if_5;
-  if (__gen_e_acsl_n_arg < 0L) __gen_e_acsl_if_5 = 1;
-  else {
-    __e_acsl_mpz_t __gen_e_acsl_n_4;
-    __e_acsl_mpz_t __gen_e_acsl__10;
-    __e_acsl_mpz_t __gen_e_acsl_sub_3;
-    int __gen_e_acsl_f2_tapp_3;
-    __e_acsl_mpz_t __gen_e_acsl__15;
-    __e_acsl_mpz_t __gen_e_acsl_sub_7;
-    int __gen_e_acsl_f2_tapp_7;
-    __e_acsl_mpz_t __gen_e_acsl__16;
-    __e_acsl_mpz_t __gen_e_acsl_sub_8;
-    int __gen_e_acsl_f2_tapp_8;
-    __gmpz_init_set_si(__gen_e_acsl_n_4,__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__10,1L);
-    __gmpz_init(__gen_e_acsl_sub_3);
-    __gmpz_sub(__gen_e_acsl_sub_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
-    __gen_e_acsl_f2_tapp_3 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_3);
-    __gmpz_init_set_si(__gen_e_acsl__15,2L);
-    __gmpz_init(__gen_e_acsl_sub_7);
-    __gmpz_sub(__gen_e_acsl_sub_7,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__15));
-    __gen_e_acsl_f2_tapp_7 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_7);
-    __gmpz_init_set_si(__gen_e_acsl__16,3L);
-    __gmpz_init(__gen_e_acsl_sub_8);
-    __gmpz_sub(__gen_e_acsl_sub_8,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__16));
-    __gen_e_acsl_f2_tapp_8 = __gen_e_acsl_f2_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_8);
-    __e_acsl_assert(__gen_e_acsl_f2_tapp_8 != 0,(char *)"RTE",(char *)"f2_2",
-                    (char *)"division_by_zero: __gen_e_acsl_f2_tapp_8 != 0",
-                    9);
-    __gen_e_acsl_if_5 = (__gen_e_acsl_f2_tapp_3 * __gen_e_acsl_f2_tapp_7) / __gen_e_acsl_f2_tapp_8;
-    __gmpz_clear(__gen_e_acsl_n_4);
-    __gmpz_clear(__gen_e_acsl__10);
-    __gmpz_clear(__gen_e_acsl_sub_3);
-    __gmpz_clear(__gen_e_acsl__15);
-    __gmpz_clear(__gen_e_acsl_sub_7);
-    __gmpz_clear(__gen_e_acsl__16);
-    __gmpz_clear(__gen_e_acsl_sub_8);
-  }
-  __retres = __gen_e_acsl_if_5;
-  return __retres;
-}
-
-void __gen_e_acsl_f1_3(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_2;
-  __e_acsl_mpz_t __gen_e_acsl__4;
-  int __gen_e_acsl_le;
-  __e_acsl_mpz_t __gen_e_acsl_if;
-  __gmpz_init_set(__gen_e_acsl_n_2,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__4,0L);
-  __gen_e_acsl_le = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2),
-                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
-  if (__gen_e_acsl_le <= 0) {
-    __e_acsl_mpz_t __gen_e_acsl__5;
-    __gmpz_init_set_si(__gen_e_acsl__5,0L);
-    __gmpz_init_set(__gen_e_acsl_if,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
-    __gmpz_clear(__gen_e_acsl__5);
+  if (n > 0) {
+    int __gen_e_acsl_g_2;
+    int __gen_e_acsl_f3_5;
+    __gen_e_acsl_g_2 = __gen_e_acsl_g(n);
+    __gen_e_acsl_f3_5 = __gen_e_acsl_f3_2(n - 1L);
+    __gen_e_acsl_if_4 = __gen_e_acsl_g_2 * __gen_e_acsl_f3_5 - 5;
   }
   else {
-    __e_acsl_mpz_t __gen_e_acsl__6;
-    __e_acsl_mpz_t __gen_e_acsl_sub_2;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4;
-    __e_acsl_mpz_t __gen_e_acsl_add;
-    __gmpz_init_set_si(__gen_e_acsl__6,1L);
-    __gmpz_init(__gen_e_acsl_sub_2);
-    __gmpz_sub(__gen_e_acsl_sub_2,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
-    __gmpz_init(__gen_e_acsl_f1_tapp_4);
-    __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
-    __gmpz_init(__gen_e_acsl_add);
-    __gmpz_add(__gen_e_acsl_add,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2));
-    __gmpz_init_set(__gen_e_acsl_if,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add));
-    __gmpz_clear(__gen_e_acsl__6);
-    __gmpz_clear(__gen_e_acsl_sub_2);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_4);
-    __gmpz_clear(__gen_e_acsl_add);
+    int __gen_e_acsl_g_8;
+    __gen_e_acsl_g_8 = __gen_e_acsl_g_5(n + 1L);
+    __gen_e_acsl_if_4 = __gen_e_acsl_g_8;
   }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if));
-  __gmpz_clear(__gen_e_acsl_n_2);
-  __gmpz_clear(__gen_e_acsl__4);
-  __gmpz_clear(__gen_e_acsl_if);
-  return;
+  return __gen_e_acsl_if_4;
 }
 
-void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg)
+unsigned long __gen_e_acsl_f4_2(long n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_if_3;
-  if (__gen_e_acsl_n_arg <= 0) {
-    __e_acsl_mpz_t __gen_e_acsl_;
-    __gmpz_init_set_si(__gen_e_acsl_,0L);
-    __gmpz_init_set(__gen_e_acsl_if_3,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_));
-    __gmpz_clear(__gen_e_acsl_);
+  unsigned long __gen_e_acsl_if_6;
+  if (n < 100L) {
+    unsigned long __gen_e_acsl_f4_4;
+    __gen_e_acsl_f4_4 = __gen_e_acsl_f4_2(n + 1L);
+    __gen_e_acsl_if_6 = __gen_e_acsl_f4_4;
   }
   else {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_2;
-    __e_acsl_mpz_t __gen_e_acsl_n_3;
-    __e_acsl_mpz_t __gen_e_acsl_add_3;
-    __gmpz_init(__gen_e_acsl_f1_tapp_2);
-    __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2,
-                      __gen_e_acsl_n_arg - 1L);
-    __gmpz_init_set_si(__gen_e_acsl_n_3,(long)__gen_e_acsl_n_arg);
-    __gmpz_init(__gen_e_acsl_add_3);
-    __gmpz_add(__gen_e_acsl_add_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_2),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3));
-    __gmpz_init_set(__gen_e_acsl_if_3,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3));
-    __gmpz_clear(__gen_e_acsl_f1_tapp_2);
-    __gmpz_clear(__gen_e_acsl_n_3);
-    __gmpz_clear(__gen_e_acsl_add_3);
+    unsigned long __gen_e_acsl_if_5;
+    if (n < 9223372036854775807L) __gen_e_acsl_if_5 = 9223372036854775807UL;
+    else __gen_e_acsl_if_5 = 6UL;
+    __gen_e_acsl_if_6 = __gen_e_acsl_if_5;
   }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_3));
-  __gmpz_clear(__gen_e_acsl_if_3);
-  return;
+  return __gen_e_acsl_if_6;
 }
 
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       long __gen_e_acsl_n_arg)
+unsigned long __gen_e_acsl_f4(int n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_if_2;
-  if (__gen_e_acsl_n_arg <= 0L) {
-    __e_acsl_mpz_t __gen_e_acsl__2;
-    __gmpz_init_set_si(__gen_e_acsl__2,0L);
-    __gmpz_init_set(__gen_e_acsl_if_2,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__2));
-    __gmpz_clear(__gen_e_acsl__2);
+  unsigned long __gen_e_acsl_if_8;
+  if (n < 100) {
+    unsigned long __gen_e_acsl_f4_5;
+    __gen_e_acsl_f4_5 = __gen_e_acsl_f4_2(n + 1L);
+    __gen_e_acsl_if_8 = __gen_e_acsl_f4_5;
   }
   else {
-    __e_acsl_mpz_t __gen_e_acsl_n;
-    __e_acsl_mpz_t __gen_e_acsl__3;
-    __e_acsl_mpz_t __gen_e_acsl_sub;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3;
-    __e_acsl_mpz_t __gen_e_acsl_add_2;
-    __gmpz_init_set_si(__gen_e_acsl_n,__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__3,1L);
-    __gmpz_init(__gen_e_acsl_sub);
-    __gmpz_sub(__gen_e_acsl_sub,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__3));
-    __gmpz_init(__gen_e_acsl_f1_tapp_3);
-    __gen_e_acsl_f1_3((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub);
-    __gmpz_init(__gen_e_acsl_add_2);
-    __gmpz_add(__gen_e_acsl_add_2,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n));
-    __gmpz_init_set(__gen_e_acsl_if_2,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2));
-    __gmpz_clear(__gen_e_acsl_n);
-    __gmpz_clear(__gen_e_acsl__3);
-    __gmpz_clear(__gen_e_acsl_sub);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_3);
-    __gmpz_clear(__gen_e_acsl_add_2);
+    unsigned long __gen_e_acsl_if_7;
+    if ((long)n < 9223372036854775807L) __gen_e_acsl_if_7 = 9223372036854775807UL;
+    else __gen_e_acsl_if_7 = 6UL;
+    __gen_e_acsl_if_8 = __gen_e_acsl_if_7;
   }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_2));
-  __gmpz_clear(__gen_e_acsl_if_2);
-  return;
+  return __gen_e_acsl_if_8;
 }
 
 
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c
index 114902cf4bc..b7ac1c6bd4b 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions_rec2.c
@@ -2,678 +2,103 @@
 #include "stdio.h"
 #include "stdlib.h"
 /*@ logic ℤ f1(ℤ n) = n ≤ 0? 0: f1(n - 1) + n;
-
-*/
-void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg);
-
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg);
-
+ */
 /*@ logic ℤ f2(ℤ n) = n < 0? 1: (f2(n - 1) * f2(n - 2)) / f2(n - 3);
 
 */
-void __gen_e_acsl_f2(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg);
+void __gen_e_acsl_f2_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n);
 
-void __gen_e_acsl_f2_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+void __gen_e_acsl_f2(__e_acsl_mpz_t *__retres_arg, int n);
 
 /*@ logic ℤ g(ℤ n) = 0;
 
 */
-void __gen_e_acsl_g(__e_acsl_mpz_struct * __retres_arg,
-                    int __gen_e_acsl_n_arg);
+void __gen_e_acsl_g_5(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n);
 
-void __gen_e_acsl_g_2(__e_acsl_mpz_struct * __retres_arg,
-                      __e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+void __gen_e_acsl_g(__e_acsl_mpz_t *__retres_arg, int n);
 
 /*@ logic ℤ f3(ℤ n) = n > 0? g(n) * f3(n - 1) - 5: g(n + 1);
 
 */
-void __gen_e_acsl_f3(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg);
+void __gen_e_acsl_f3_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n);
 
-void __gen_e_acsl_f3_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+void __gen_e_acsl_f3(__e_acsl_mpz_t *__retres_arg, int n);
 
 /*@
 logic ℤ f4(ℤ n) =
   n < 100? f4(n + 1): (n < 0x7fffffffffffffffL? 0x7fffffffffffffffL: 6);
 
 */
-void __gen_e_acsl_f4(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg);
+void __gen_e_acsl_f4_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n);
 
-void __gen_e_acsl_f4_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg);
+void __gen_e_acsl_f4(__e_acsl_mpz_t *__retres_arg, int n);
 
 int main(void)
 {
   int __retres;
   __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
-  /*@ assert f1(0) ≡ 0; */
+  /*@ assert f2(7) ≡ 1; */
   {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp;
-    __e_acsl_mpz_t __gen_e_acsl__7;
+    __e_acsl_mpz_t __gen_e_acsl_f2_14;
+    __e_acsl_mpz_t __gen_e_acsl__13;
     int __gen_e_acsl_eq;
-    __gmpz_init(__gen_e_acsl_f1_tapp);
-    /*@ assert
-        Eva: initialization:
-          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp);
-    */
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp,0);
-    __gmpz_init_set_si(__gen_e_acsl__7,0L);
-    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
+    __gen_e_acsl_f2(& __gen_e_acsl_f2_14,7);
+    __gmpz_init_set_si(__gen_e_acsl__13,1L);
+    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_14),
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
     __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
-                    (char *)"f1(0) == 0",21);
-    __gmpz_clear(__gen_e_acsl_f1_tapp);
-    __gmpz_clear(__gen_e_acsl__7);
-  }
-  /*@ assert f1(1) ≡ 1; */
-  {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_4;
-    __e_acsl_mpz_t __gen_e_acsl__8;
-    int __gen_e_acsl_eq_2;
-    __gmpz_init(__gen_e_acsl_f1_tapp_4);
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_4,1);
-    __gmpz_init_set_si(__gen_e_acsl__8,1L);
-    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_4),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
-    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
-                    (char *)"main",(char *)"f1(1) == 1",22);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_4);
-    __gmpz_clear(__gen_e_acsl__8);
-  }
-  /*@ assert f1(100) ≡ 5050; */
-  {
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_5;
-    __e_acsl_mpz_t __gen_e_acsl__9;
-    int __gen_e_acsl_eq_3;
-    __gmpz_init(__gen_e_acsl_f1_tapp_5);
-    __gen_e_acsl_f1((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_5,100);
-    __gmpz_init_set_si(__gen_e_acsl__9,5050L);
-    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_5),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
-    __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion",
-                    (char *)"main",(char *)"f1(100) == 5050",23);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_5);
-    __gmpz_clear(__gen_e_acsl__9);
-  }
-  /*@ assert f2(7) ≡ 1; */
-  {
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp;
-    __e_acsl_mpz_t __gen_e_acsl__22;
-    int __gen_e_acsl_eq_4;
-    __gmpz_init(__gen_e_acsl_f2_tapp);
-    __gen_e_acsl_f2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp,7);
-    __gmpz_init_set_si(__gen_e_acsl__22,1L);
-    __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__22));
-    __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion",
-                    (char *)"main",(char *)"f2(7) == 1",25);
-    __gmpz_clear(__gen_e_acsl_f2_tapp);
-    __gmpz_clear(__gen_e_acsl__22);
+                    (char *)"f2(7) == 1",25);
+    __gmpz_clear(__gen_e_acsl_f2_14);
+    __gmpz_clear(__gen_e_acsl__13);
   }
   /*@ assert f3(6) ≡ -5; */
   {
-    __e_acsl_mpz_t __gen_e_acsl_f3_tapp;
-    __e_acsl_mpz_t __gen_e_acsl__33;
+    __e_acsl_mpz_t __gen_e_acsl_f3_6;
+    __e_acsl_mpz_t __gen_e_acsl__23;
     __e_acsl_mpz_t __gen_e_acsl_neg;
-    int __gen_e_acsl_eq_5;
-    __gmpz_init(__gen_e_acsl_f3_tapp);
-    __gen_e_acsl_f3((__e_acsl_mpz_struct *)__gen_e_acsl_f3_tapp,6);
-    __gmpz_init_set_si(__gen_e_acsl__33,5L);
+    int __gen_e_acsl_eq_2;
+    __gen_e_acsl_f3(& __gen_e_acsl_f3_6,6);
+    __gmpz_init_set_si(__gen_e_acsl__23,5L);
     __gmpz_init(__gen_e_acsl_neg);
     __gmpz_neg(__gen_e_acsl_neg,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__33));
-    __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_tapp),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__23));
+    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_6),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_neg));
-    __e_acsl_assert(__gen_e_acsl_eq_5 == 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"f3(6) == -5",27);
-    __gmpz_clear(__gen_e_acsl_f3_tapp);
-    __gmpz_clear(__gen_e_acsl__33);
+    __gmpz_clear(__gen_e_acsl_f3_6);
+    __gmpz_clear(__gen_e_acsl__23);
     __gmpz_clear(__gen_e_acsl_neg);
   }
   /*@ assert f4(9) > 0; */
   {
-    __e_acsl_mpz_t __gen_e_acsl_f4_tapp;
-    __e_acsl_mpz_t __gen_e_acsl__44;
+    __e_acsl_mpz_t __gen_e_acsl_f4_6;
+    __e_acsl_mpz_t __gen_e_acsl__34;
     int __gen_e_acsl_gt_3;
-    __gmpz_init(__gen_e_acsl_f4_tapp);
-    __gen_e_acsl_f4((__e_acsl_mpz_struct *)__gen_e_acsl_f4_tapp,9);
-    __gmpz_init_set_si(__gen_e_acsl__44,0L);
-    __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_tapp),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__44));
+    __gen_e_acsl_f4(& __gen_e_acsl_f4_6,9);
+    __gmpz_init_set_si(__gen_e_acsl__34,0L);
+    __gen_e_acsl_gt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_6),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__34));
     __e_acsl_assert(__gen_e_acsl_gt_3 > 0,(char *)"Assertion",(char *)"main",
                     (char *)"f4(9) > 0",29);
-    __gmpz_clear(__gen_e_acsl_f4_tapp);
-    __gmpz_clear(__gen_e_acsl__44);
+    __gmpz_clear(__gen_e_acsl_f4_6);
+    __gmpz_clear(__gen_e_acsl__34);
   }
   __retres = 0;
   return __retres;
 }
 
-void __gen_e_acsl_f4_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_14;
-  __e_acsl_mpz_t __gen_e_acsl__36;
-  int __gen_e_acsl_lt_4;
-  __e_acsl_mpz_t __gen_e_acsl_if_8;
-  __gmpz_init_set(__gen_e_acsl_n_14,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__36,100L);
-  __gen_e_acsl_lt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_14),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__36));
-  if (__gen_e_acsl_lt_4 < 0) {
-    __e_acsl_mpz_t __gen_e_acsl__37;
-    __e_acsl_mpz_t __gen_e_acsl_add_6;
-    __e_acsl_mpz_t __gen_e_acsl_f4_tapp_3;
-    __gmpz_init_set_si(__gen_e_acsl__37,1L);
-    __gmpz_init(__gen_e_acsl_add_6);
-    __gmpz_add(__gen_e_acsl_add_6,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_14),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__37));
-    __gmpz_init(__gen_e_acsl_f4_tapp_3);
-    __gen_e_acsl_f4_2((__e_acsl_mpz_struct *)__gen_e_acsl_f4_tapp_3,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_add_6);
-    __gmpz_init_set(__gen_e_acsl_if_8,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_tapp_3));
-    __gmpz_clear(__gen_e_acsl__37);
-    __gmpz_clear(__gen_e_acsl_add_6);
-    __gmpz_clear(__gen_e_acsl_f4_tapp_3);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl__38;
-    int __gen_e_acsl_lt_5;
-    __e_acsl_mpz_t __gen_e_acsl_if_7;
-    __gmpz_init_set_ui(__gen_e_acsl__38,9223372036854775807UL);
-    __gen_e_acsl_lt_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_14),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__38));
-    if (__gen_e_acsl_lt_5 < 0) {
-      __e_acsl_mpz_t __gen_e_acsl__39;
-      __gmpz_init_set_ui(__gen_e_acsl__39,9223372036854775807UL);
-      __gmpz_init_set(__gen_e_acsl_if_7,
-                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__39));
-      __gmpz_clear(__gen_e_acsl__39);
-    }
-    else {
-      __e_acsl_mpz_t __gen_e_acsl__40;
-      __gmpz_init_set_si(__gen_e_acsl__40,6L);
-      __gmpz_init_set(__gen_e_acsl_if_7,
-                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__40));
-      __gmpz_clear(__gen_e_acsl__40);
-    }
-    __gmpz_init_set(__gen_e_acsl_if_8,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_7));
-    __gmpz_clear(__gen_e_acsl__38);
-    __gmpz_clear(__gen_e_acsl_if_7);
-  }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_8));
-  __gmpz_clear(__gen_e_acsl_n_14);
-  __gmpz_clear(__gen_e_acsl__36);
-  __gmpz_clear(__gen_e_acsl_if_8);
-  return;
-}
-
-void __gen_e_acsl_f4(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_12;
-  __e_acsl_mpz_t __gen_e_acsl__34;
-  int __gen_e_acsl_lt_3;
-  __e_acsl_mpz_t __gen_e_acsl_if_10;
-  __gmpz_init_set_si(__gen_e_acsl_n_12,(long)__gen_e_acsl_n_arg);
-  __gmpz_init_set_si(__gen_e_acsl__34,100L);
-  __gen_e_acsl_lt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_12),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__34));
-  if (__gen_e_acsl_lt_3 < 0) {
-    __e_acsl_mpz_t __gen_e_acsl_n_13;
-    __e_acsl_mpz_t __gen_e_acsl__35;
-    __e_acsl_mpz_t __gen_e_acsl_add_5;
-    __e_acsl_mpz_t __gen_e_acsl_f4_tapp_2;
-    __gmpz_init_set_si(__gen_e_acsl_n_13,(long)__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__35,1L);
-    __gmpz_init(__gen_e_acsl_add_5);
-    __gmpz_add(__gen_e_acsl_add_5,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_13),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__35));
-    __gmpz_init(__gen_e_acsl_f4_tapp_2);
-    __gen_e_acsl_f4_2((__e_acsl_mpz_struct *)__gen_e_acsl_f4_tapp_2,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_add_5);
-    __gmpz_init_set(__gen_e_acsl_if_10,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_tapp_2));
-    __gmpz_clear(__gen_e_acsl_n_13);
-    __gmpz_clear(__gen_e_acsl__35);
-    __gmpz_clear(__gen_e_acsl_add_5);
-    __gmpz_clear(__gen_e_acsl_f4_tapp_2);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl_n_15;
-    __e_acsl_mpz_t __gen_e_acsl__41;
-    int __gen_e_acsl_lt_6;
-    __e_acsl_mpz_t __gen_e_acsl_if_9;
-    __gmpz_init_set_si(__gen_e_acsl_n_15,(long)__gen_e_acsl_n_arg);
-    __gmpz_init_set_ui(__gen_e_acsl__41,9223372036854775807UL);
-    __gen_e_acsl_lt_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_15),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__41));
-    if (__gen_e_acsl_lt_6 < 0) {
-      __e_acsl_mpz_t __gen_e_acsl__42;
-      __gmpz_init_set_ui(__gen_e_acsl__42,9223372036854775807UL);
-      __gmpz_init_set(__gen_e_acsl_if_9,
-                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__42));
-      __gmpz_clear(__gen_e_acsl__42);
-    }
-    else {
-      __e_acsl_mpz_t __gen_e_acsl__43;
-      __gmpz_init_set_si(__gen_e_acsl__43,6L);
-      __gmpz_init_set(__gen_e_acsl_if_9,
-                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__43));
-      __gmpz_clear(__gen_e_acsl__43);
-    }
-    __gmpz_init_set(__gen_e_acsl_if_10,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_9));
-    __gmpz_clear(__gen_e_acsl_n_15);
-    __gmpz_clear(__gen_e_acsl__41);
-    __gmpz_clear(__gen_e_acsl_if_9);
-  }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_10));
-  __gmpz_clear(__gen_e_acsl_n_12);
-  __gmpz_clear(__gen_e_acsl__34);
-  __gmpz_clear(__gen_e_acsl_if_10);
-  return;
-}
-
-void __gen_e_acsl_f3_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_9;
-  __e_acsl_mpz_t __gen_e_acsl__26;
-  int __gen_e_acsl_gt_2;
-  __e_acsl_mpz_t __gen_e_acsl_if_5;
-  __gmpz_init_set(__gen_e_acsl_n_9,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__26,0L);
-  __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__26));
-  if (__gen_e_acsl_gt_2 > 0) {
-    __e_acsl_mpz_t __gen_e_acsl_g_tapp_2;
-    __e_acsl_mpz_t __gen_e_acsl__28;
-    __e_acsl_mpz_t __gen_e_acsl_sub_10;
-    __e_acsl_mpz_t __gen_e_acsl_f3_tapp_3;
-    __e_acsl_mpz_t __gen_e_acsl_mul_3;
-    __e_acsl_mpz_t __gen_e_acsl__29;
-    __e_acsl_mpz_t __gen_e_acsl_sub_11;
-    __gmpz_init(__gen_e_acsl_g_tapp_2);
-    __gen_e_acsl_g_2((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp_2,
-                     (__e_acsl_mpz_struct *)__gen_e_acsl_n_9);
-    __gmpz_init_set_si(__gen_e_acsl__28,1L);
-    __gmpz_init(__gen_e_acsl_sub_10);
-    __gmpz_sub(__gen_e_acsl_sub_10,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__28));
-    __gmpz_init(__gen_e_acsl_f3_tapp_3);
-    __gen_e_acsl_f3_2((__e_acsl_mpz_struct *)__gen_e_acsl_f3_tapp_3,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_10);
-    __gmpz_init(__gen_e_acsl_mul_3);
-    __gmpz_mul(__gen_e_acsl_mul_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp_2),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_tapp_3));
-    __gmpz_init_set_si(__gen_e_acsl__29,5L);
-    __gmpz_init(__gen_e_acsl_sub_11);
-    __gmpz_sub(__gen_e_acsl_sub_11,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_3),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__29));
-    __gmpz_init_set(__gen_e_acsl_if_5,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_11));
-    __gmpz_clear(__gen_e_acsl_g_tapp_2);
-    __gmpz_clear(__gen_e_acsl__28);
-    __gmpz_clear(__gen_e_acsl_sub_10);
-    __gmpz_clear(__gen_e_acsl_f3_tapp_3);
-    __gmpz_clear(__gen_e_acsl_mul_3);
-    __gmpz_clear(__gen_e_acsl__29);
-    __gmpz_clear(__gen_e_acsl_sub_11);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl__30;
-    __e_acsl_mpz_t __gen_e_acsl_add_3;
-    __e_acsl_mpz_t __gen_e_acsl_g_tapp_3;
-    __gmpz_init_set_si(__gen_e_acsl__30,1L);
-    __gmpz_init(__gen_e_acsl_add_3);
-    __gmpz_add(__gen_e_acsl_add_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_9),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__30));
-    __gmpz_init(__gen_e_acsl_g_tapp_3);
-    __gen_e_acsl_g_2((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp_3,
-                     (__e_acsl_mpz_struct *)__gen_e_acsl_add_3);
-    __gmpz_init_set(__gen_e_acsl_if_5,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp_3));
-    __gmpz_clear(__gen_e_acsl__30);
-    __gmpz_clear(__gen_e_acsl_add_3);
-    __gmpz_clear(__gen_e_acsl_g_tapp_3);
-  }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_5));
-  __gmpz_clear(__gen_e_acsl_n_9);
-  __gmpz_clear(__gen_e_acsl__26);
-  __gmpz_clear(__gen_e_acsl_if_5);
-  return;
-}
-
-void __gen_e_acsl_f3(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_7;
-  __e_acsl_mpz_t __gen_e_acsl__23;
-  int __gen_e_acsl_gt;
-  __e_acsl_mpz_t __gen_e_acsl_if_6;
-  __gmpz_init_set_si(__gen_e_acsl_n_7,(long)__gen_e_acsl_n_arg);
-  __gmpz_init_set_si(__gen_e_acsl__23,0L);
-  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7),
-                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__23));
-  if (__gen_e_acsl_gt > 0) {
-    __e_acsl_mpz_t __gen_e_acsl_g_tapp;
-    __e_acsl_mpz_t __gen_e_acsl_n_8;
-    __e_acsl_mpz_t __gen_e_acsl__25;
-    __e_acsl_mpz_t __gen_e_acsl_sub_9;
-    __e_acsl_mpz_t __gen_e_acsl_f3_tapp_2;
-    __e_acsl_mpz_t __gen_e_acsl_mul_4;
-    __e_acsl_mpz_t __gen_e_acsl__31;
-    __e_acsl_mpz_t __gen_e_acsl_sub_12;
-    __gmpz_init(__gen_e_acsl_g_tapp);
-    __gen_e_acsl_g((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp,
-                   __gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl_n_8,(long)__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__25,1L);
-    __gmpz_init(__gen_e_acsl_sub_9);
-    __gmpz_sub(__gen_e_acsl_sub_9,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_8),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__25));
-    __gmpz_init(__gen_e_acsl_f3_tapp_2);
-    __gen_e_acsl_f3_2((__e_acsl_mpz_struct *)__gen_e_acsl_f3_tapp_2,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_9);
-    __gmpz_init(__gen_e_acsl_mul_4);
-    __gmpz_mul(__gen_e_acsl_mul_4,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_tapp_2));
-    __gmpz_init_set_si(__gen_e_acsl__31,5L);
-    __gmpz_init(__gen_e_acsl_sub_12);
-    __gmpz_sub(__gen_e_acsl_sub_12,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_4),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__31));
-    __gmpz_init_set(__gen_e_acsl_if_6,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_12));
-    __gmpz_clear(__gen_e_acsl_g_tapp);
-    __gmpz_clear(__gen_e_acsl_n_8);
-    __gmpz_clear(__gen_e_acsl__25);
-    __gmpz_clear(__gen_e_acsl_sub_9);
-    __gmpz_clear(__gen_e_acsl_f3_tapp_2);
-    __gmpz_clear(__gen_e_acsl_mul_4);
-    __gmpz_clear(__gen_e_acsl__31);
-    __gmpz_clear(__gen_e_acsl_sub_12);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl_n_11;
-    __e_acsl_mpz_t __gen_e_acsl__32;
-    __e_acsl_mpz_t __gen_e_acsl_add_4;
-    __e_acsl_mpz_t __gen_e_acsl_g_tapp_4;
-    __gmpz_init_set_si(__gen_e_acsl_n_11,(long)__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__32,1L);
-    __gmpz_init(__gen_e_acsl_add_4);
-    __gmpz_add(__gen_e_acsl_add_4,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_11),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__32));
-    __gmpz_init(__gen_e_acsl_g_tapp_4);
-    __gen_e_acsl_g_2((__e_acsl_mpz_struct *)__gen_e_acsl_g_tapp_4,
-                     (__e_acsl_mpz_struct *)__gen_e_acsl_add_4);
-    __gmpz_init_set(__gen_e_acsl_if_6,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_tapp_4));
-    __gmpz_clear(__gen_e_acsl_n_11);
-    __gmpz_clear(__gen_e_acsl__32);
-    __gmpz_clear(__gen_e_acsl_add_4);
-    __gmpz_clear(__gen_e_acsl_g_tapp_4);
-  }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_6));
-  __gmpz_clear(__gen_e_acsl_n_7);
-  __gmpz_clear(__gen_e_acsl__23);
-  __gmpz_clear(__gen_e_acsl_if_6);
-  return;
-}
-
-void __gen_e_acsl_g_2(__e_acsl_mpz_struct * __retres_arg,
-                      __e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_10;
-  __e_acsl_mpz_t __gen_e_acsl__27;
-  __gmpz_init_set(__gen_e_acsl_n_10,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__27,0L);
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__27));
-  __gmpz_clear(__gen_e_acsl_n_10);
-  __gmpz_clear(__gen_e_acsl__27);
-  return;
-}
-
-void __gen_e_acsl_g(__e_acsl_mpz_struct * __retres_arg,
-                    int __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl__24;
-  __gmpz_init_set_si(__gen_e_acsl__24,0L);
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__24));
-  __gmpz_clear(__gen_e_acsl__24);
-  return;
-}
-
-void __gen_e_acsl_f2_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_6;
-  __e_acsl_mpz_t __gen_e_acsl__13;
-  int __gen_e_acsl_lt_2;
-  __e_acsl_mpz_t __gen_e_acsl_if_3;
-  __gmpz_init_set(__gen_e_acsl_n_6,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
-  __gmpz_init_set_si(__gen_e_acsl__13,0L);
-  __gen_e_acsl_lt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
-  if (__gen_e_acsl_lt_2 < 0) {
-    __e_acsl_mpz_t __gen_e_acsl__14;
-    __gmpz_init_set_si(__gen_e_acsl__14,1L);
-    __gmpz_init_set(__gen_e_acsl_if_3,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__14));
-    __gmpz_clear(__gen_e_acsl__14);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl__15;
-    __e_acsl_mpz_t __gen_e_acsl_sub_4;
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp_3;
-    __e_acsl_mpz_t __gen_e_acsl__16;
-    __e_acsl_mpz_t __gen_e_acsl_sub_5;
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp_4;
-    __e_acsl_mpz_t __gen_e_acsl_mul;
-    __e_acsl_mpz_t __gen_e_acsl__17;
-    __e_acsl_mpz_t __gen_e_acsl_sub_6;
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp_5;
-    __e_acsl_mpz_t __gen_e_acsl__18;
-    int __gen_e_acsl_div_guard;
-    __e_acsl_mpz_t __gen_e_acsl_div;
-    __gmpz_init_set_si(__gen_e_acsl__15,1L);
-    __gmpz_init(__gen_e_acsl_sub_4);
-    __gmpz_sub(__gen_e_acsl_sub_4,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__15));
-    __gmpz_init(__gen_e_acsl_f2_tapp_3);
-    __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_3,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_4);
-    __gmpz_init_set_si(__gen_e_acsl__16,2L);
-    __gmpz_init(__gen_e_acsl_sub_5);
-    __gmpz_sub(__gen_e_acsl_sub_5,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__16));
-    __gmpz_init(__gen_e_acsl_f2_tapp_4);
-    __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_4,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_5);
-    __gmpz_init(__gen_e_acsl_mul);
-    __gmpz_mul(__gen_e_acsl_mul,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_3),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_4));
-    __gmpz_init_set_si(__gen_e_acsl__17,3L);
-    __gmpz_init(__gen_e_acsl_sub_6);
-    __gmpz_sub(__gen_e_acsl_sub_6,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__17));
-    __gmpz_init(__gen_e_acsl_f2_tapp_5);
-    __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_5,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_6);
-    __gmpz_init_set_si(__gen_e_acsl__18,0L);
-    __gen_e_acsl_div_guard = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_5),
-                                        (__e_acsl_mpz_struct const *)(__gen_e_acsl__18));
-    __gmpz_init(__gen_e_acsl_div);
-    __e_acsl_assert(! (__gen_e_acsl_div_guard == 0),(char *)"Assertion",
-                    (char *)"f2_2",(char *)"f2(n - 3) == 0",9);
-    __gmpz_tdiv_q(__gen_e_acsl_div,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul),
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_5));
-    __gmpz_init_set(__gen_e_acsl_if_3,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_div));
-    __gmpz_clear(__gen_e_acsl__15);
-    __gmpz_clear(__gen_e_acsl_sub_4);
-    __gmpz_clear(__gen_e_acsl_f2_tapp_3);
-    __gmpz_clear(__gen_e_acsl__16);
-    __gmpz_clear(__gen_e_acsl_sub_5);
-    __gmpz_clear(__gen_e_acsl_f2_tapp_4);
-    __gmpz_clear(__gen_e_acsl_mul);
-    __gmpz_clear(__gen_e_acsl__17);
-    __gmpz_clear(__gen_e_acsl_sub_6);
-    __gmpz_clear(__gen_e_acsl_f2_tapp_5);
-    __gmpz_clear(__gen_e_acsl__18);
-    __gmpz_clear(__gen_e_acsl_div);
-  }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_3));
-  __gmpz_clear(__gen_e_acsl_n_6);
-  __gmpz_clear(__gen_e_acsl__13);
-  __gmpz_clear(__gen_e_acsl_if_3);
-  return;
-}
-
-void __gen_e_acsl_f2(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg)
+void __gen_e_acsl_f2_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_n_4;
-  __e_acsl_mpz_t __gen_e_acsl__10;
-  int __gen_e_acsl_lt;
-  __e_acsl_mpz_t __gen_e_acsl_if_4;
-  __gmpz_init_set_si(__gen_e_acsl_n_4,(long)__gen_e_acsl_n_arg);
-  __gmpz_init_set_si(__gen_e_acsl__10,0L);
-  __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4),
-                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
-  if (__gen_e_acsl_lt < 0) {
-    __e_acsl_mpz_t __gen_e_acsl__11;
-    __gmpz_init_set_si(__gen_e_acsl__11,1L);
-    __gmpz_init_set(__gen_e_acsl_if_4,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
-    __gmpz_clear(__gen_e_acsl__11);
-  }
-  else {
-    __e_acsl_mpz_t __gen_e_acsl_n_5;
-    __e_acsl_mpz_t __gen_e_acsl__12;
-    __e_acsl_mpz_t __gen_e_acsl_sub_3;
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp_2;
-    __e_acsl_mpz_t __gen_e_acsl__19;
-    __e_acsl_mpz_t __gen_e_acsl_sub_7;
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp_6;
-    __e_acsl_mpz_t __gen_e_acsl_mul_2;
-    __e_acsl_mpz_t __gen_e_acsl__20;
-    __e_acsl_mpz_t __gen_e_acsl_sub_8;
-    __e_acsl_mpz_t __gen_e_acsl_f2_tapp_7;
-    __e_acsl_mpz_t __gen_e_acsl__21;
-    int __gen_e_acsl_div_guard_2;
-    __e_acsl_mpz_t __gen_e_acsl_div_2;
-    __gmpz_init_set_si(__gen_e_acsl_n_5,(long)__gen_e_acsl_n_arg);
-    __gmpz_init_set_si(__gen_e_acsl__12,1L);
-    __gmpz_init(__gen_e_acsl_sub_3);
-    __gmpz_sub(__gen_e_acsl_sub_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
-    __gmpz_init(__gen_e_acsl_f2_tapp_2);
-    __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_2,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_3);
-    __gmpz_init_set_si(__gen_e_acsl__19,2L);
-    __gmpz_init(__gen_e_acsl_sub_7);
-    __gmpz_sub(__gen_e_acsl_sub_7,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__19));
-    __gmpz_init(__gen_e_acsl_f2_tapp_6);
-    __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_6,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_7);
-    __gmpz_init(__gen_e_acsl_mul_2);
-    __gmpz_mul(__gen_e_acsl_mul_2,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_2),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_6));
-    __gmpz_init_set_si(__gen_e_acsl__20,3L);
-    __gmpz_init(__gen_e_acsl_sub_8);
-    __gmpz_sub(__gen_e_acsl_sub_8,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__20));
-    __gmpz_init(__gen_e_acsl_f2_tapp_7);
-    __gen_e_acsl_f2_2((__e_acsl_mpz_struct *)__gen_e_acsl_f2_tapp_7,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_8);
-    __gmpz_init_set_si(__gen_e_acsl__21,0L);
-    __gen_e_acsl_div_guard_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_7),
-                                          (__e_acsl_mpz_struct const *)(__gen_e_acsl__21));
-    __gmpz_init(__gen_e_acsl_div_2);
-    __e_acsl_assert(! (__gen_e_acsl_div_guard_2 == 0),(char *)"Assertion",
-                    (char *)"f2_2",(char *)"f2(n - 3) == 0",9);
-    __gmpz_tdiv_q(__gen_e_acsl_div_2,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_2),
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_tapp_7));
-    __gmpz_init_set(__gen_e_acsl_if_4,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_div_2));
-    __gmpz_clear(__gen_e_acsl_n_5);
-    __gmpz_clear(__gen_e_acsl__12);
-    __gmpz_clear(__gen_e_acsl_sub_3);
-    __gmpz_clear(__gen_e_acsl_f2_tapp_2);
-    __gmpz_clear(__gen_e_acsl__19);
-    __gmpz_clear(__gen_e_acsl_sub_7);
-    __gmpz_clear(__gen_e_acsl_f2_tapp_6);
-    __gmpz_clear(__gen_e_acsl_mul_2);
-    __gmpz_clear(__gen_e_acsl__20);
-    __gmpz_clear(__gen_e_acsl_sub_8);
-    __gmpz_clear(__gen_e_acsl_f2_tapp_7);
-    __gmpz_clear(__gen_e_acsl__21);
-    __gmpz_clear(__gen_e_acsl_div_2);
-  }
-  __gmpz_init_set(__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_4));
-  __gmpz_clear(__gen_e_acsl_n_4);
-  __gmpz_clear(__gen_e_acsl__10);
-  __gmpz_clear(__gen_e_acsl_if_4);
-  return;
-}
-
-void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
-                       __e_acsl_mpz_struct * __gen_e_acsl_n_arg)
-{
-  __e_acsl_mpz_t __gen_e_acsl_n_3;
   __e_acsl_mpz_t __gen_e_acsl__4;
-  int __gen_e_acsl_le_2;
+  int __gen_e_acsl_lt_2;
   __e_acsl_mpz_t __gen_e_acsl_if;
-  __gmpz_init_set(__gen_e_acsl_n_3,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_arg));
   __gmpz_init_set_si(__gen_e_acsl__4,0L);
-  __gen_e_acsl_le_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3),
+  __gen_e_acsl_lt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n),
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
-  if (__gen_e_acsl_le_2 <= 0) {
+  if (__gen_e_acsl_lt_2 < 0) {
     __e_acsl_mpz_t __gen_e_acsl__5;
-    __gmpz_init_set_si(__gen_e_acsl__5,0L);
+    __gmpz_init_set_si(__gen_e_acsl__5,1L);
     __gmpz_init_set(__gen_e_acsl_if,
                     (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
     __gmpz_clear(__gen_e_acsl__5);
@@ -681,57 +106,96 @@ void __gen_e_acsl_f1_2(__e_acsl_mpz_struct * __retres_arg,
   else {
     __e_acsl_mpz_t __gen_e_acsl__6;
     __e_acsl_mpz_t __gen_e_acsl_sub_2;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_3;
-    __e_acsl_mpz_t __gen_e_acsl_add;
+    __e_acsl_mpz_t __gen_e_acsl_f2_4;
+    __e_acsl_mpz_t __gen_e_acsl__7;
+    __e_acsl_mpz_t __gen_e_acsl_sub_3;
+    __e_acsl_mpz_t __gen_e_acsl_f2_6;
+    __e_acsl_mpz_t __gen_e_acsl_mul;
+    __e_acsl_mpz_t __gen_e_acsl__8;
+    __e_acsl_mpz_t __gen_e_acsl_sub_4;
+    __e_acsl_mpz_t __gen_e_acsl_f2_8;
+    __e_acsl_mpz_t __gen_e_acsl__9;
+    int __gen_e_acsl_div_guard;
+    __e_acsl_mpz_t __gen_e_acsl_div;
     __gmpz_init_set_si(__gen_e_acsl__6,1L);
     __gmpz_init(__gen_e_acsl_sub_2);
-    __gmpz_sub(__gen_e_acsl_sub_2,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3),
+    __gmpz_sub(__gen_e_acsl_sub_2,(__e_acsl_mpz_struct const *)(n),
                (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
-    __gmpz_init(__gen_e_acsl_f1_tapp_3);
     /*@ assert
         Eva: initialization:
           \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
     */
+    __gen_e_acsl_f2_2(& __gen_e_acsl_f2_4,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
+    __gmpz_init_set_si(__gen_e_acsl__7,2L);
+    __gmpz_init(__gen_e_acsl_sub_3);
+    __gmpz_sub(__gen_e_acsl_sub_3,(__e_acsl_mpz_struct const *)(n),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
     /*@ assert
         Eva: initialization:
-          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3);
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_3);
     */
-    __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_3,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
-    __gmpz_init(__gen_e_acsl_add);
-    __gmpz_add(__gen_e_acsl_add,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_3),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3));
+    __gen_e_acsl_f2_2(& __gen_e_acsl_f2_6,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_3);
+    __gmpz_init(__gen_e_acsl_mul);
+    __gmpz_mul(__gen_e_acsl_mul,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_4),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_6));
+    __gmpz_init_set_si(__gen_e_acsl__8,3L);
+    __gmpz_init(__gen_e_acsl_sub_4);
+    __gmpz_sub(__gen_e_acsl_sub_4,(__e_acsl_mpz_struct const *)(n),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_4);
+    */
+    __gen_e_acsl_f2_2(& __gen_e_acsl_f2_8,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_4);
+    __gmpz_init_set_si(__gen_e_acsl__9,0L);
+    __gen_e_acsl_div_guard = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8),
+                                        (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
+    __gmpz_init(__gen_e_acsl_div);
+    /*@ assert E_ACSL: f2(n - 3) ≢ 0; */
+    __e_acsl_assert(! (__gen_e_acsl_div_guard == 0),(char *)"Assertion",
+                    (char *)"f2_2",(char *)"f2(n - 3) == 0",9);
+    __gmpz_tdiv_q(__gen_e_acsl_div,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul),
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8));
     __gmpz_init_set(__gen_e_acsl_if,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add));
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_div));
     __gmpz_clear(__gen_e_acsl__6);
     __gmpz_clear(__gen_e_acsl_sub_2);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_3);
-    __gmpz_clear(__gen_e_acsl_add);
+    __gmpz_clear(__gen_e_acsl_f2_4);
+    __gmpz_clear(__gen_e_acsl__7);
+    __gmpz_clear(__gen_e_acsl_sub_3);
+    __gmpz_clear(__gen_e_acsl_f2_6);
+    __gmpz_clear(__gen_e_acsl_mul);
+    __gmpz_clear(__gen_e_acsl__8);
+    __gmpz_clear(__gen_e_acsl_sub_4);
+    __gmpz_clear(__gen_e_acsl_f2_8);
+    __gmpz_clear(__gen_e_acsl__9);
+    __gmpz_clear(__gen_e_acsl_div);
   }
-  __gmpz_init_set(__retres_arg,
+  __gmpz_init_set(*__retres_arg,
                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_if));
-  __gmpz_clear(__gen_e_acsl_n_3);
   __gmpz_clear(__gen_e_acsl__4);
   __gmpz_clear(__gen_e_acsl_if);
   return;
 }
 
-void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
-                     int __gen_e_acsl_n_arg)
+void __gen_e_acsl_f2(__e_acsl_mpz_t *__retres_arg, int n)
 {
   __e_acsl_mpz_t __gen_e_acsl_n;
   __e_acsl_mpz_t __gen_e_acsl_;
-  int __gen_e_acsl_le;
+  int __gen_e_acsl_lt;
   __e_acsl_mpz_t __gen_e_acsl_if_2;
-  __gmpz_init_set_si(__gen_e_acsl_n,(long)__gen_e_acsl_n_arg);
+  __gmpz_init_set_si(__gen_e_acsl_n,(long)n);
   __gmpz_init_set_si(__gen_e_acsl_,0L);
-  __gen_e_acsl_le = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n),
+  __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n),
                                (__e_acsl_mpz_struct const *)(__gen_e_acsl_));
-  if (__gen_e_acsl_le <= 0) {
+  if (__gen_e_acsl_lt < 0) {
     __e_acsl_mpz_t __gen_e_acsl__2;
-    __gmpz_init_set_si(__gen_e_acsl__2,0L);
+    __gmpz_init_set_si(__gen_e_acsl__2,1L);
     __gmpz_init_set(__gen_e_acsl_if_2,
                     (__e_acsl_mpz_struct const *)(__gen_e_acsl__2));
     __gmpz_clear(__gen_e_acsl__2);
@@ -740,38 +204,82 @@ void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
     __e_acsl_mpz_t __gen_e_acsl_n_2;
     __e_acsl_mpz_t __gen_e_acsl__3;
     __e_acsl_mpz_t __gen_e_acsl_sub;
-    __e_acsl_mpz_t __gen_e_acsl_f1_tapp_2;
-    __e_acsl_mpz_t __gen_e_acsl_add_2;
-    __gmpz_init_set_si(__gen_e_acsl_n_2,(long)__gen_e_acsl_n_arg);
+    __e_acsl_mpz_t __gen_e_acsl_f2_9;
+    __e_acsl_mpz_t __gen_e_acsl__10;
+    __e_acsl_mpz_t __gen_e_acsl_sub_5;
+    __e_acsl_mpz_t __gen_e_acsl_f2_11;
+    __e_acsl_mpz_t __gen_e_acsl_mul_2;
+    __e_acsl_mpz_t __gen_e_acsl__11;
+    __e_acsl_mpz_t __gen_e_acsl_sub_6;
+    __e_acsl_mpz_t __gen_e_acsl_f2_13;
+    __e_acsl_mpz_t __gen_e_acsl__12;
+    int __gen_e_acsl_div_guard_2;
+    __e_acsl_mpz_t __gen_e_acsl_div_2;
+    __gmpz_init_set_si(__gen_e_acsl_n_2,(long)n);
     __gmpz_init_set_si(__gen_e_acsl__3,1L);
     __gmpz_init(__gen_e_acsl_sub);
     __gmpz_sub(__gen_e_acsl_sub,
                (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2),
                (__e_acsl_mpz_struct const *)(__gen_e_acsl__3));
-    __gmpz_init(__gen_e_acsl_f1_tapp_2);
     /*@ assert
         Eva: initialization:
           \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub);
     */
+    __gen_e_acsl_f2_2(& __gen_e_acsl_f2_9,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub);
+    __gmpz_init_set_si(__gen_e_acsl__10,2L);
+    __gmpz_init(__gen_e_acsl_sub_5);
+    __gmpz_sub(__gen_e_acsl_sub_5,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
     /*@ assert
         Eva: initialization:
-          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2);
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_5);
     */
-    __gen_e_acsl_f1_2((__e_acsl_mpz_struct *)__gen_e_acsl_f1_tapp_2,
-                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub);
-    __gmpz_init(__gen_e_acsl_add_2);
-    __gmpz_add(__gen_e_acsl_add_2,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_tapp_2),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2));
+    __gen_e_acsl_f2_2(& __gen_e_acsl_f2_11,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_5);
+    __gmpz_init(__gen_e_acsl_mul_2);
+    __gmpz_mul(__gen_e_acsl_mul_2,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_9),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_11));
+    __gmpz_init_set_si(__gen_e_acsl__11,3L);
+    __gmpz_init(__gen_e_acsl_sub_6);
+    __gmpz_sub(__gen_e_acsl_sub_6,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_6);
+    */
+    __gen_e_acsl_f2_2(& __gen_e_acsl_f2_13,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_6);
+    __gmpz_init_set_si(__gen_e_acsl__12,0L);
+    __gen_e_acsl_div_guard_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_13),
+                                          (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
+    __gmpz_init(__gen_e_acsl_div_2);
+    /*@ assert E_ACSL: f2(n - 3) ≢ 0; */
+    __e_acsl_assert(! (__gen_e_acsl_div_guard_2 == 0),(char *)"Assertion",
+                    (char *)"f2",(char *)"f2(n - 3) == 0",9);
+    __gmpz_tdiv_q(__gen_e_acsl_div_2,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_2),
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_13));
     __gmpz_init_set(__gen_e_acsl_if_2,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2));
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_div_2));
     __gmpz_clear(__gen_e_acsl_n_2);
     __gmpz_clear(__gen_e_acsl__3);
     __gmpz_clear(__gen_e_acsl_sub);
-    __gmpz_clear(__gen_e_acsl_f1_tapp_2);
-    __gmpz_clear(__gen_e_acsl_add_2);
+    __gmpz_clear(__gen_e_acsl_f2_9);
+    __gmpz_clear(__gen_e_acsl__10);
+    __gmpz_clear(__gen_e_acsl_sub_5);
+    __gmpz_clear(__gen_e_acsl_f2_11);
+    __gmpz_clear(__gen_e_acsl_mul_2);
+    __gmpz_clear(__gen_e_acsl__11);
+    __gmpz_clear(__gen_e_acsl_sub_6);
+    __gmpz_clear(__gen_e_acsl_f2_13);
+    __gmpz_clear(__gen_e_acsl__12);
+    __gmpz_clear(__gen_e_acsl_div_2);
   }
-  __gmpz_init_set(__retres_arg,
+  __gmpz_init_set(*__retres_arg,
                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_2));
   __gmpz_clear(__gen_e_acsl_n);
   __gmpz_clear(__gen_e_acsl_);
@@ -779,4 +287,307 @@ void __gen_e_acsl_f1(__e_acsl_mpz_struct * __retres_arg,
   return;
 }
 
+void __gen_e_acsl_g_5(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n)
+{
+  __gmpz_init_set_si(*__retres_arg,0L);
+  return;
+}
+
+void __gen_e_acsl_g(__e_acsl_mpz_t *__retres_arg, int n)
+{
+  __gmpz_init_set_si(*__retres_arg,0L);
+  return;
+}
+
+void __gen_e_acsl_f3_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n)
+{
+  __e_acsl_mpz_t __gen_e_acsl__16;
+  int __gen_e_acsl_gt_2;
+  __e_acsl_mpz_t __gen_e_acsl_if_3;
+  __gmpz_init_set_si(__gen_e_acsl__16,0L);
+  __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n),
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__16));
+  if (__gen_e_acsl_gt_2 > 0) {
+    long __gen_e_acsl__17;
+    __e_acsl_mpz_t __gen_e_acsl_g_4;
+    __e_acsl_mpz_t __gen_e_acsl__18;
+    __e_acsl_mpz_t __gen_e_acsl_sub_8;
+    __e_acsl_mpz_t __gen_e_acsl_f3_4;
+    __e_acsl_mpz_t __gen_e_acsl_mul_3;
+    __e_acsl_mpz_t __gen_e_acsl__19;
+    __e_acsl_mpz_t __gen_e_acsl_sub_9;
+    __gen_e_acsl__17 = __gmpz_get_si((__e_acsl_mpz_struct const *)(n));
+    __gen_e_acsl_g(& __gen_e_acsl_g_4,(int)__gen_e_acsl__17);
+    __gmpz_init_set_si(__gen_e_acsl__18,1L);
+    __gmpz_init(__gen_e_acsl_sub_8);
+    __gmpz_sub(__gen_e_acsl_sub_8,(__e_acsl_mpz_struct const *)(n),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__18));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_8);
+    */
+    __gen_e_acsl_f3_2(& __gen_e_acsl_f3_4,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_8);
+    __gmpz_init(__gen_e_acsl_mul_3);
+    __gmpz_mul(__gen_e_acsl_mul_3,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_4),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_4));
+    __gmpz_init_set_si(__gen_e_acsl__19,5L);
+    __gmpz_init(__gen_e_acsl_sub_9);
+    __gmpz_sub(__gen_e_acsl_sub_9,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_3),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__19));
+    __gmpz_init_set(__gen_e_acsl_if_3,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_9));
+    __gmpz_clear(__gen_e_acsl_g_4);
+    __gmpz_clear(__gen_e_acsl__18);
+    __gmpz_clear(__gen_e_acsl_sub_8);
+    __gmpz_clear(__gen_e_acsl_f3_4);
+    __gmpz_clear(__gen_e_acsl_mul_3);
+    __gmpz_clear(__gen_e_acsl__19);
+    __gmpz_clear(__gen_e_acsl_sub_9);
+  }
+  else {
+    __e_acsl_mpz_t __gen_e_acsl__20;
+    __e_acsl_mpz_t __gen_e_acsl_add;
+    __e_acsl_mpz_t __gen_e_acsl_g_6;
+    __gmpz_init_set_si(__gen_e_acsl__20,1L);
+    __gmpz_init(__gen_e_acsl_add);
+    __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(n),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__20));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add);
+    */
+    __gen_e_acsl_g_5(& __gen_e_acsl_g_6,
+                     (__e_acsl_mpz_struct *)__gen_e_acsl_add);
+    __gmpz_init_set(__gen_e_acsl_if_3,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_6));
+    __gmpz_clear(__gen_e_acsl__20);
+    __gmpz_clear(__gen_e_acsl_add);
+    __gmpz_clear(__gen_e_acsl_g_6);
+  }
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_3));
+  __gmpz_clear(__gen_e_acsl__16);
+  __gmpz_clear(__gen_e_acsl_if_3);
+  return;
+}
+
+void __gen_e_acsl_f3(__e_acsl_mpz_t *__retres_arg, int n)
+{
+  __e_acsl_mpz_t __gen_e_acsl_n_3;
+  __e_acsl_mpz_t __gen_e_acsl__14;
+  int __gen_e_acsl_gt;
+  __e_acsl_mpz_t __gen_e_acsl_if_4;
+  __gmpz_init_set_si(__gen_e_acsl_n_3,(long)n);
+  __gmpz_init_set_si(__gen_e_acsl__14,0L);
+  __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3),
+                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__14));
+  if (__gen_e_acsl_gt > 0) {
+    __e_acsl_mpz_t __gen_e_acsl_g_2;
+    __e_acsl_mpz_t __gen_e_acsl_n_4;
+    __e_acsl_mpz_t __gen_e_acsl__15;
+    __e_acsl_mpz_t __gen_e_acsl_sub_7;
+    __e_acsl_mpz_t __gen_e_acsl_f3_5;
+    __e_acsl_mpz_t __gen_e_acsl_mul_4;
+    __e_acsl_mpz_t __gen_e_acsl__21;
+    __e_acsl_mpz_t __gen_e_acsl_sub_10;
+    __gen_e_acsl_g(& __gen_e_acsl_g_2,n);
+    __gmpz_init_set_si(__gen_e_acsl_n_4,(long)n);
+    __gmpz_init_set_si(__gen_e_acsl__15,1L);
+    __gmpz_init(__gen_e_acsl_sub_7);
+    __gmpz_sub(__gen_e_acsl_sub_7,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__15));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_7);
+    */
+    __gen_e_acsl_f3_2(& __gen_e_acsl_f3_5,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_sub_7);
+    __gmpz_init(__gen_e_acsl_mul_4);
+    __gmpz_mul(__gen_e_acsl_mul_4,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_2),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_f3_5));
+    __gmpz_init_set_si(__gen_e_acsl__21,5L);
+    __gmpz_init(__gen_e_acsl_sub_10);
+    __gmpz_sub(__gen_e_acsl_sub_10,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_4),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__21));
+    __gmpz_init_set(__gen_e_acsl_if_4,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_10));
+    __gmpz_clear(__gen_e_acsl_g_2);
+    __gmpz_clear(__gen_e_acsl_n_4);
+    __gmpz_clear(__gen_e_acsl__15);
+    __gmpz_clear(__gen_e_acsl_sub_7);
+    __gmpz_clear(__gen_e_acsl_f3_5);
+    __gmpz_clear(__gen_e_acsl_mul_4);
+    __gmpz_clear(__gen_e_acsl__21);
+    __gmpz_clear(__gen_e_acsl_sub_10);
+  }
+  else {
+    __e_acsl_mpz_t __gen_e_acsl_n_5;
+    __e_acsl_mpz_t __gen_e_acsl__22;
+    __e_acsl_mpz_t __gen_e_acsl_add_2;
+    __e_acsl_mpz_t __gen_e_acsl_g_8;
+    __gmpz_init_set_si(__gen_e_acsl_n_5,(long)n);
+    __gmpz_init_set_si(__gen_e_acsl__22,1L);
+    __gmpz_init(__gen_e_acsl_add_2);
+    __gmpz_add(__gen_e_acsl_add_2,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_5),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__22));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_2);
+    */
+    __gen_e_acsl_g_5(& __gen_e_acsl_g_8,
+                     (__e_acsl_mpz_struct *)__gen_e_acsl_add_2);
+    __gmpz_init_set(__gen_e_acsl_if_4,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_g_8));
+    __gmpz_clear(__gen_e_acsl_n_5);
+    __gmpz_clear(__gen_e_acsl__22);
+    __gmpz_clear(__gen_e_acsl_add_2);
+    __gmpz_clear(__gen_e_acsl_g_8);
+  }
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_4));
+  __gmpz_clear(__gen_e_acsl_n_3);
+  __gmpz_clear(__gen_e_acsl__14);
+  __gmpz_clear(__gen_e_acsl_if_4);
+  return;
+}
+
+void __gen_e_acsl_f4_2(__e_acsl_mpz_t *__retres_arg, __e_acsl_mpz_struct * n)
+{
+  __e_acsl_mpz_t __gen_e_acsl__26;
+  int __gen_e_acsl_lt_4;
+  __e_acsl_mpz_t __gen_e_acsl_if_6;
+  __gmpz_init_set_si(__gen_e_acsl__26,100L);
+  __gen_e_acsl_lt_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n),
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__26));
+  if (__gen_e_acsl_lt_4 < 0) {
+    __e_acsl_mpz_t __gen_e_acsl__27;
+    __e_acsl_mpz_t __gen_e_acsl_add_4;
+    __e_acsl_mpz_t __gen_e_acsl_f4_4;
+    __gmpz_init_set_si(__gen_e_acsl__27,1L);
+    __gmpz_init(__gen_e_acsl_add_4);
+    __gmpz_add(__gen_e_acsl_add_4,(__e_acsl_mpz_struct const *)(n),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__27));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_4);
+    */
+    __gen_e_acsl_f4_2(& __gen_e_acsl_f4_4,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_add_4);
+    __gmpz_init_set(__gen_e_acsl_if_6,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_4));
+    __gmpz_clear(__gen_e_acsl__27);
+    __gmpz_clear(__gen_e_acsl_add_4);
+    __gmpz_clear(__gen_e_acsl_f4_4);
+  }
+  else {
+    __e_acsl_mpz_t __gen_e_acsl__28;
+    int __gen_e_acsl_lt_5;
+    __e_acsl_mpz_t __gen_e_acsl_if_5;
+    __gmpz_init_set_ui(__gen_e_acsl__28,9223372036854775807UL);
+    __gen_e_acsl_lt_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(n),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__28));
+    if (__gen_e_acsl_lt_5 < 0) {
+      __e_acsl_mpz_t __gen_e_acsl__29;
+      __gmpz_init_set_ui(__gen_e_acsl__29,9223372036854775807UL);
+      __gmpz_init_set(__gen_e_acsl_if_5,
+                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__29));
+      __gmpz_clear(__gen_e_acsl__29);
+    }
+    else {
+      __e_acsl_mpz_t __gen_e_acsl__30;
+      __gmpz_init_set_si(__gen_e_acsl__30,6L);
+      __gmpz_init_set(__gen_e_acsl_if_5,
+                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__30));
+      __gmpz_clear(__gen_e_acsl__30);
+    }
+    __gmpz_init_set(__gen_e_acsl_if_6,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_5));
+    __gmpz_clear(__gen_e_acsl__28);
+    __gmpz_clear(__gen_e_acsl_if_5);
+  }
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_6));
+  __gmpz_clear(__gen_e_acsl__26);
+  __gmpz_clear(__gen_e_acsl_if_6);
+  return;
+}
+
+void __gen_e_acsl_f4(__e_acsl_mpz_t *__retres_arg, int n)
+{
+  __e_acsl_mpz_t __gen_e_acsl_n_6;
+  __e_acsl_mpz_t __gen_e_acsl__24;
+  int __gen_e_acsl_lt_3;
+  __e_acsl_mpz_t __gen_e_acsl_if_8;
+  __gmpz_init_set_si(__gen_e_acsl_n_6,(long)n);
+  __gmpz_init_set_si(__gen_e_acsl__24,100L);
+  __gen_e_acsl_lt_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6),
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__24));
+  if (__gen_e_acsl_lt_3 < 0) {
+    __e_acsl_mpz_t __gen_e_acsl_n_7;
+    __e_acsl_mpz_t __gen_e_acsl__25;
+    __e_acsl_mpz_t __gen_e_acsl_add_3;
+    __e_acsl_mpz_t __gen_e_acsl_f4_5;
+    __gmpz_init_set_si(__gen_e_acsl_n_7,(long)n);
+    __gmpz_init_set_si(__gen_e_acsl__25,1L);
+    __gmpz_init(__gen_e_acsl_add_3);
+    __gmpz_add(__gen_e_acsl_add_3,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_7),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__25));
+    /*@ assert
+        Eva: initialization:
+          \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_3);
+    */
+    __gen_e_acsl_f4_2(& __gen_e_acsl_f4_5,
+                      (__e_acsl_mpz_struct *)__gen_e_acsl_add_3);
+    __gmpz_init_set(__gen_e_acsl_if_8,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_f4_5));
+    __gmpz_clear(__gen_e_acsl_n_7);
+    __gmpz_clear(__gen_e_acsl__25);
+    __gmpz_clear(__gen_e_acsl_add_3);
+    __gmpz_clear(__gen_e_acsl_f4_5);
+  }
+  else {
+    __e_acsl_mpz_t __gen_e_acsl_n_8;
+    __e_acsl_mpz_t __gen_e_acsl__31;
+    int __gen_e_acsl_lt_6;
+    __e_acsl_mpz_t __gen_e_acsl_if_7;
+    __gmpz_init_set_si(__gen_e_acsl_n_8,(long)n);
+    __gmpz_init_set_ui(__gen_e_acsl__31,9223372036854775807UL);
+    __gen_e_acsl_lt_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_n_8),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__31));
+    if (__gen_e_acsl_lt_6 < 0) {
+      __e_acsl_mpz_t __gen_e_acsl__32;
+      __gmpz_init_set_ui(__gen_e_acsl__32,9223372036854775807UL);
+      __gmpz_init_set(__gen_e_acsl_if_7,
+                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__32));
+      __gmpz_clear(__gen_e_acsl__32);
+    }
+    else {
+      __e_acsl_mpz_t __gen_e_acsl__33;
+      __gmpz_init_set_si(__gen_e_acsl__33,6L);
+      __gmpz_init_set(__gen_e_acsl_if_7,
+                      (__e_acsl_mpz_struct const *)(__gen_e_acsl__33));
+      __gmpz_clear(__gen_e_acsl__33);
+    }
+    __gmpz_init_set(__gen_e_acsl_if_8,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_7));
+    __gmpz_clear(__gen_e_acsl_n_8);
+    __gmpz_clear(__gen_e_acsl__31);
+    __gmpz_clear(__gen_e_acsl_if_7);
+  }
+  __gmpz_init_set(*__retres_arg,
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_8));
+  __gmpz_clear(__gen_e_acsl_n_6);
+  __gmpz_clear(__gen_e_acsl__24);
+  __gmpz_clear(__gen_e_acsl_if_8);
+  return;
+}
+
 
diff --git a/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle b/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle
index 90bbf0ce762..da6d987808f 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle
+++ b/src/plugins/e-acsl/tests/temporal/oracle/t_getenv.res.oracle
@@ -2,7 +2,7 @@
 [e-acsl] Warning: annotating undefined function `getenv':
   the generated program may miss memory instrumentation
   if there are memory-related annotations.
-[e-acsl] FRAMAC_SHARE/libc/stdlib.h:419: Warning: 
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:482: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/stdlib.h:482: Warning: 
diff --git a/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle b/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle
index 52253f07981..66c2b5ac9dd 100644
--- a/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle
+++ b/src/plugins/e-acsl/tests/temporal/oracle/t_memcpy.res.oracle
@@ -14,8 +14,7 @@
   E-ACSL construct `assigns clause in behavior' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:118: Warning: 
-  E-ACSL construct `logic functions performing read accesses'
-  is not yet supported.
+  E-ACSL construct `user-defined logic type' is not yet supported.
   Ignoring annotation.
 [e-acsl] FRAMAC_SHARE/libc/string.h:92: Warning: 
   E-ACSL construct `logic functions with labels' is not yet supported.
diff --git a/src/plugins/e-acsl/translate.ml b/src/plugins/e-acsl/translate.ml
index 8b3f53139d2..11a872659cb 100644
--- a/src/plugins/e-acsl/translate.ml
+++ b/src/plugins/e-acsl/translate.ml
@@ -450,40 +450,54 @@ and context_insensitive_term_to_exp kf env t =
     Cil.mkAddrOrStartOf ~loc lv, env, false, "startof"
   | Tapp(li, [], targs) ->
     let fname = li.l_var_info.lv_name in
-    let args, env =
-      try
-        List.fold_right
-          (fun targ (l, env) ->
-            let e, env = term_to_exp kf env targ in
-            e :: l, env)
-          targs
-          ([], env)
-      with Invalid_argument _ ->
-        Options.fatal "[Tapp] unexpected number of arguments when calling %s"
-          fname
-    in
     (* build the varinfo (as an expression) which stores the result of the
        function call. *)
     let _, e, env =
       if Builtins.mem li.l_var_info.lv_name then
         (* E-ACSL built-in function call *)
+        let args, env =
+          try
+            List.fold_right
+              (fun targ (l, env) ->
+                 let e, env = term_to_exp kf env targ in
+                 e :: l, env)
+              targs
+              ([], env)
+          with Invalid_argument _ ->
+            Options.fatal
+              "[Tapp] unexpected number of arguments when calling %s"
+              fname
+        in
         Env.new_var
           ~loc
           ~name:(fname ^ "_app")
           env
           (Some t)
           (Misc.cty (Extlib.the li.l_type))
-          (fun vi _ -> [ Misc.mk_call ~loc ~result:(Cil.var vi) fname args ])
+          (fun vi _ ->
+             [ Misc.mk_call ~loc ~result:(Cil.var vi) fname args ])
       else
-        let args_lty =
-          List.map
-            (fun targ ->
-               match Typing.get_integer_ty targ with
-               | Typing.Gmp -> Linteger
-               | Typing.C_type _ | Typing.Other -> Ctype (Typing.get_typ targ))
+        (* build the arguments and compute the integer_ty of the parameters *)
+        let params_ty, args, env =
+          List.fold_right
+            (fun targ (params_ty, args, env) ->
+               let e, env = term_to_exp kf env targ in
+               let param_ty = Typing.get_integer_ty targ in
+               let e, env =
+                 try
+                   let ty = Typing.typ_of_integer_ty param_ty in
+                   add_cast loc env (Some ty) false (Some targ) e
+                 with Typing.Not_an_integer ->
+                   e, env
+               in
+               param_ty :: params_ty, e :: args, env)
             targs
+            ([], [], env)
         in
-        Logic_functions.generate ~loc env t li args args_lty
+        let gen_fname =
+          Env.Varname.get ~scope:Env.Global (Functions.RTL.mk_gen_name fname)
+        in
+        Logic_functions.tapp_to_exp ~loc gen_fname env t li params_ty args
     in
     e, env, false, "app"
   | Tapp(_, _ :: _, _) ->
@@ -662,9 +676,7 @@ and named_predicate_content_to_exp ?name kf env p =
     (* Simply use the implementation of Tapp(li, labels, args).
       To achieve this, we create a clone of [li] for which the type is
       transformed from [None] (type of predicates) to
-      [Some int] (type as a term).
-      TODO: the approach seems dangerous. A better way would probably use a
-            version of [Lfunctions.generate] generalized to predicates. *)
+      [Some int] (type as a term). *)
     let prj = Project.current () in
     let o = object inherit Visitor.frama_c_copy prj end in
     let li = Visitor.visitFramacLogicInfo o li in
@@ -862,9 +874,6 @@ and translate_named_predicate kf env p =
 let named_predicate_to_exp ?name kf env p =
   named_predicate_to_exp ?name kf env p (* forget optional argument ?rte *)
 
-let add_cast_lfunctions loc env cty is_mpz e =
-  add_cast ~loc env cty is_mpz None e
-
 let () =
   Loops.term_to_exp_ref := term_to_exp;
   Loops.translate_named_predicate_ref := translate_named_predicate;
@@ -875,8 +884,7 @@ let () =
   Mmodel_translate.term_to_exp_ref := term_to_exp;
   Mmodel_translate.predicate_to_exp_ref := named_predicate_to_exp;
   Logic_functions.term_to_exp_ref := term_to_exp;
-  Logic_functions.predicate_to_exp_ref := named_predicate_to_exp;
-  Logic_functions.add_cast_ref := add_cast_lfunctions
+  Logic_functions.named_predicate_to_exp_ref := named_predicate_to_exp
 
 (* This function is used by Guillaume.
    However, it is correct to use it only in specific contexts. *)
diff --git a/src/plugins/e-acsl/typing.ml b/src/plugins/e-acsl/typing.ml
index c88dafb9106..5c0d16ac021 100644
--- a/src/plugins/e-acsl/typing.ml
+++ b/src/plugins/e-acsl/typing.ml
@@ -46,28 +46,34 @@ let c_int = C_type IInt
 let ikind ik = C_type ik
 let other = Other
 
-include Datatype.Make
-(struct
-  type t = integer_ty
-  let name = "E_ACSL.New_typing.t"
-  let reprs = [ Gmp; c_int ]
-  include Datatype.Undefined
-
-  let compare ty1 ty2 = match ty1, ty2 with
-    | C_type i1, C_type i2 ->
-      if i1 = i2 then 0
-      else if Cil.intTypeIncluded i1 i2 then -1 else 1
-    | (Other | C_type _), Gmp | Other, C_type _ -> -1
-    | Gmp, (C_type _ | Other) | C_type _, Other -> 1
-    | Gmp, Gmp | Other, Other -> 0
-
-  let equal = Datatype.from_compare
-
-  let pretty fmt = function
-    | Gmp -> Format.pp_print_string fmt "GMP"
-    | C_type k -> Printer.pp_ikind fmt k
-    | Other -> Format.pp_print_string fmt "OTHER"
- end)
+module D =
+  Datatype.Make_with_collections
+    (struct
+      type t = integer_ty
+      let name = "E_ACSL.New_typing.t"
+      let reprs = [ Gmp; c_int ]
+      include Datatype.Undefined
+
+      let compare ty1 ty2 = match ty1, ty2 with
+        | C_type i1, C_type i2 ->
+          if i1 = i2 then 0
+          else if Cil.intTypeIncluded i1 i2 then -1 else 1
+        | (Other | C_type _), Gmp | Other, C_type _ -> -1
+        | Gmp, (C_type _ | Other) | C_type _, Other -> 1
+        | Gmp, Gmp | Other, Other -> 0
+
+      let equal = Datatype.from_compare
+
+      let hash = function
+        | Gmp -> 787
+        | Other -> 1011
+        | C_type ik -> Hashtbl.hash ik
+
+      let pretty fmt = function
+        | Gmp -> Format.pp_print_string fmt "GMP"
+        | C_type k -> Printer.pp_ikind fmt k
+        | Other -> Format.pp_print_string fmt "OTHER"
+    end)
 
 (******************************************************************************)
 (** Basic operations *)
@@ -105,9 +111,9 @@ let typ_of_lty = function
 (******************************************************************************)
 
 type computed_info =
-    { ty: t;  (* type required for the term *)
-      op: t; (* type required for the operation *)
-      cast: t option; (* if not [None], type of the context which the term
+    { ty: D.t;  (* type required for the term *)
+      op: D.t; (* type required for the operation *)
+      cast: D.t option; (* if not [None], type of the context which the term
                          must be casted to. If [None], no cast needed. *)
     }
 
@@ -116,7 +122,6 @@ type computed_info =
 module Memo: sig
   val memo: (term -> computed_info) -> term -> computed_info
   val get: term -> computed_info
-  val remove_all: term -> unit
   val clear: unit -> unit
 end = struct
 
@@ -155,30 +160,10 @@ end = struct
       H.add tbl t x;
       x
 
-  let rec remove_all t =
-    try
-      ignore (H.find tbl t);
-      H.remove tbl t;
-      remove_all t
-    with Not_found ->
-      ()
-
   let clear () = H.clear tbl
 
 end
 
-let clear_all_pred_or_term pot =
-  let o = object inherit Visitor.frama_c_inplace
-    method !vterm t =
-      Memo.remove_all t;
-      Cil.DoChildren
-  end
-  in
-  begin match pot with
-    | Misc.PoT_term t -> ignore(Visitor.visitFramacTerm o t)
-    | Misc.PoT_pred p -> ignore(Visitor.visitFramacPredicate o p)
-  end
-
 (******************************************************************************)
 (** {2 Coercion rules} *)
 (******************************************************************************)
@@ -211,11 +196,11 @@ let ty_of_interv ?ctx i =
 (* compute a new {!computed_info} by coercing the given type [ty] to the given
    context [ctx]. [op] is the type for the operator. *)
 let coerce ~arith_operand ~ctx ~op ty =
-  if compare ty ctx = 1 then begin
+  if D.compare ty ctx = 1 then
     (* type larger than the expected context,
        so we must introduce an explicit cast *)
     { ty; op; cast = Some ctx }
-  end else
+  else
     (* only add an explicit cast if the context is [Gmp] and [ty] is not;
        or if the term corresponding to [ty] is an operand of an arithmetic
        operation which must be explicitly coerced in order to force the
@@ -369,7 +354,7 @@ let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t =
       dup ctx_res
 
     | TBinOp ((Lt | Gt | Le | Ge | Eq | Ne), t1, t2) ->
-      assert (match ctx with None -> true | Some c -> compare c c_int >= 0);
+      assert (match ctx with None -> true | Some c -> D.compare c c_int >= 0);
       let ctx =
         try
           let i1 = Interval.infer t1 in
@@ -491,9 +476,10 @@ let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t =
            type of the argument? For now, it is silently ignored (both
            statically and at runtime)... *)
         List.iter (fun arg -> ignore (type_term ~use_gmp_opt:true arg)) args;
+        (* TODO: recursive call in arguments of function call *)
         match li.l_body with
         | LBpred _ ->
-          (* We can have an [LBpred] here because we transformed
+          (* possible to have an [LBpred] here because we transformed
              [Papp] into [Tapp] *)
           dup c_int
         | LBterm _ ->
@@ -701,7 +687,7 @@ let rec type_predicate p =
 
 let type_term ~use_gmp_opt ?ctx t =
   Options.feedback ~dkey ~level:4 "typing term '%a' in ctx '%a'."
-    Printer.pp_term t (Pretty_utils.pp_opt pretty) ctx;
+    Printer.pp_term t (Pretty_utils.pp_opt D.pretty) ctx;
   ignore (type_term ~use_gmp_opt ?ctx t)
 
 let type_named_predicate ?(must_clear=true) p =
@@ -758,6 +744,8 @@ let get_cast_of_predicate p =
 
 let clear = Memo.clear
 
+module Datatype = D
+
 (*
 Local Variables:
 compile-command: "make"
diff --git a/src/plugins/e-acsl/typing.mli b/src/plugins/e-acsl/typing.mli
index 7f26c6e68d7..a6387e848d2 100644
--- a/src/plugins/e-acsl/typing.mli
+++ b/src/plugins/e-acsl/typing.mli
@@ -56,7 +56,7 @@ type integer_ty = private
   | C_type of ikind
   | Other (** Any non-integral type *)
 
-val pretty: Format.formatter -> integer_ty -> unit
+module Datatype: Datatype.S_with_collections with type t = integer_ty
 
 (** {3 Smart constructors} *)
 
@@ -91,8 +91,8 @@ val join: integer_ty -> integer_ty -> integer_ty
 
 val type_term: use_gmp_opt:bool -> ?ctx:integer_ty -> term -> unit
 (** Compute the type of each subterm of the given term in the given context. If
-    [use_gmp_opt] is false, then the conversion to the given context is done even if
-    -e-acsl-gmp-only is set. *)
+    [use_gmp_opt] is false, then the conversion to the given context is done
+    even if -e-acsl-gmp-only is set. *)
 
 val type_named_predicate: ?must_clear:bool -> predicate -> unit
 (** Compute the type of each term of the given predicate.
@@ -101,10 +101,6 @@ val type_named_predicate: ?must_clear:bool -> predicate -> unit
 val clear: unit -> unit
 (** Remove all the previously computed types. *)
 
-val clear_all_pred_or_term: Misc.pred_or_term -> unit
-(** Remove all the previously computed types for the given term or predicate
-    AND its subterms. *)
-
 (** {3 Getters}
 
     Below, the functions assume that either {!type_term} or
diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml
index 866070e5737..077f9360eb9 100644
--- a/src/plugins/e-acsl/visit.ml
+++ b/src/plugins/e-acsl/visit.ml
@@ -369,8 +369,6 @@ class e_acsl_visitor prj generate = object (self)
     if generate then Project.copy ~selection ~src:cur prj;
     Cil.DoChildrenPost
       (fun f ->
-        (* generate the C functions that correspond to the logic ones *)
-        Logic_functions.do_visit f;
         (* extend [main] with forward initialization and put it at end *)
         if generate then begin
           if not (Global_observer.is_empty () && Literal_strings.is_empty ())
@@ -455,7 +453,12 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]"
             in
             Extlib.may handle_main main_fct
           in
-          Project.on prj build_mmodel_initializer ();
+          Project.on
+            prj
+            (fun () ->
+               f.globals <- Logic_functions.add_generated_functions f.globals;
+               build_mmodel_initializer ())
+            ();
           (* reset copied states at the end to be observationally
               equivalent to a standard visitor. *)
           Project.clear ~selection ~project:prj ();
@@ -564,9 +567,10 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]"
     let locals, blocks =
       List.fold_left
         (fun (local_vars, block_vars as acc) (v, scope) -> match scope with
-        | Env.Global -> acc
-        | Env.Function -> v :: local_vars, v :: block_vars
-        | Env.Local_block -> v :: local_vars, block_vars)
+        (* TODO: [kf] assumed to be consistent. Should be asserted. *)
+        | Env.LFunction _kf -> v :: local_vars, v :: block_vars
+        | Env.LLocal_block _kf -> v :: local_vars, block_vars
+        | _ -> acc)
         (f.slocals, f.sbody.blocals)
         vars
     in
-- 
GitLab