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