let from_ival_int ival int =
    let max_elt_int = Parameters.Dynamic.Int.get "-plevel" in
    let max_elt = Int.of_int max_elt_int in
    let add_offset x acc =
       join (inject_one ~value:x  ~size:int) acc
    in
    match ival with
    | Ival.Top(None, _, _, _)
    | Ival.Top(_, None, _, _) | Ival.Float _ -> top
    | Ival.Top(Some mn, Some mx, _r, m) ->
        if Int.le m int
        then inject_one ~value:mn ~size:(Int.add (Int.sub mx mn) int)
        else
          let elts = Int.native_div (Int.sub mx mn) m in
          if Int.gt elts max_elt then
            (* too many elements to enumerate *)
            (ignore (CilE.warn_once "more than %d(%a) elements to enumerate. Approximating."
                       max_elt_int
                       Int.pretty elts);
           top)
        else Int.fold add_offset ~inf:mn ~sup:mx ~step:m bottom
    | Ival.Set(s) ->
        Ival.O.fold
          add_offset
          s
          bottom