diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml
index 656f790c6b03964797ddc44cf27dd361cb7cb684..9e5d2e827ee7a37732d1cead861cbf63f544dd94 100644
--- a/src/plugins/e-acsl/src/code_generator/loops.ml
+++ b/src/plugins/e-acsl/src/code_generator/loops.ml
@@ -118,14 +118,23 @@ let handle_annotations env kf stmt =
             stmts, env
           | Some (t, e_old, None) ->
             let env = Env.push env in
-            Typing.type_term ~use_gmp_opt:true t;
-            let e, env = !term_to_exp_ref kf env t in
+            let t_old = Logic_utils.expr_to_term e_old in
+            let variant_pos =
+              Logic_const.prel ~loc (Rge, t_old, Logic_const.tinteger ~loc 0)
+            in
+            Typing.type_named_predicate ~must_clear:true variant_pos;
+            let variant_pos_e, env = !predicate_to_exp_ref kf env variant_pos in
             let msg1 =
               Format.asprintf
                 "(old %a) %a 0"
                 Printer.pp_term t
                 Printer.pp_relation Rge
             in
+            let variant_dec =
+              Logic_const.prel ~loc (Rgt, t_old, t)
+            in
+            Typing.type_named_predicate ~must_clear:true variant_dec;
+            let variant_dec_e, env = !predicate_to_exp_ref kf env variant_dec in
             let msg2 =
               Format.asprintf
                 "(old %a) > %a"
@@ -140,14 +149,14 @@ let handle_annotations env kf stmt =
                   ~pred_kind:Assert
                   Smart_stmt.Variant
                   kf
-                  (Cil.mkBinOp ~loc Ge e_old (Cil.zero ~loc));
+                  variant_pos_e;
                 Smart_stmt.runtime_check_with_msg
                   ~loc
                   msg2
                   ~pred_kind:Assert
                   Smart_stmt.Variant
                   kf
-                  (Cil.mkBinOp ~loc Gt e_old e)
+                  variant_dec_e
               ]
             in
             let blk, env =