let combinePredecessors (_s: stmt) ~old new_ =
    if State_set.is_empty (new_.value)
    then None
    else begin
        if old.counter_unroll >= slevel
        then
          let sum =
            Cvalue.Model.join
              (State_set.join new_.value)
              (State_set.join old.value)
          in
          Some {counter_unroll = old.counter_unroll ;
                value = State_set.singleton sum;}
        else begin try
          let merged = State_set.merge_into new_.value old.value in
          let length_new = State_set.length new_.value in
          let new_counter_unroll = old.counter_unroll + length_new in
          if new_counter_unroll >= !counter_unroll_target
          then begin
            Value_parameters.result ~once:true
              "Semantic level unrolling superposing up to %d states"
              !counter_unroll_target;
            counter_unroll_target := !counter_unroll_target + 100;
          end;
          let result =
            Some
              { value =  merged ;
                counter_unroll = new_counter_unroll }
          in
          result
        with State_set.Unchanged -> None
        end
    end