44 auto p = util_make_unique<rd_range_domaint>(
bv_container);
46 return std::unique_ptr<statet>(p.release());
75 valuest::const_iterator v_entry=
values.find(identifier);
76 if(v_entry==
values.end() ||
77 v_entry->second.empty())
82 for(
const auto &
id : v_entry->second)
99 locationt from{trace_from->current_location()};
100 locationt to{trace_to->current_location()};
107 "ai has type reaching_definitions_analysist");
115 else if(from->is_start_thread())
118 else if(from->is_function_call())
121 else if(from->is_end_function())
124 else if(from->is_assign())
127 else if(from->is_decl())
132 if(to->is_function_call())
140 const bool is_must_alias=rw_set.
get_w_set().size()==1;
142 for(
const auto &written_object_entry : rw_set.
get_w_set())
144 const irep_idt &identifier = written_object_entry.first;
147 if(ns.
lookup(identifier, symbol_ptr))
149 assert(symbol_ptr!=0);
152 rw_set.
get_ranges(written_object_entry.second);
158 for(
const auto &range : ranges)
159 kill(identifier, range.first, range.second);
172 const irep_idt &identifier = from->dead_symbol().get_identifier();
174 valuest::iterator entry=
values.find(identifier);
187 for(valuest::iterator it=
values.begin();
191 const irep_idt &identifier=it->first;
193 if(!ns.
lookup(identifier).is_shared() &&
198 valuest::iterator next=it;
216 if(function_from != function_to)
218 for(valuest::iterator it=
values.begin();
222 const irep_idt &identifier=it->first;
226 if((ns.
lookup(identifier, sym) ||
232 valuest::iterator next=it;
245 for(
const auto ¶m : code_type.
parameters())
247 const irep_idt &identifier=param.get_identifier();
249 if(identifier.
empty())
253 if(param_bits.has_value())
256 gen(from, identifier, 0, -1);
262 if(from->call_lhs().is_not_nil())
282 for(
const auto &new_value : new_values)
284 const irep_idt &identifier=new_value.first;
287 (!ns.
lookup(identifier).is_shared() &&
290 for(
const auto &
id : new_value.second)
297 for(
const auto &
id : new_value.second)
306 for(
const auto ¶m : code_type.
parameters())
308 const irep_idt &identifier=param.get_identifier();
310 if(identifier.
empty())
313 valuest::iterator entry=
values.find(identifier);
323 if(call->call_lhs().is_not_nil())
343 goto_rw(function_to, to, rw_set);
344 const bool is_must_alias=rw_set.
get_w_set().size()==1;
346 for(
const auto &written_object_entry : rw_set.
get_w_set())
348 const irep_idt &identifier = written_object_entry.first;
351 if(ns.
lookup(identifier, symbol_ptr))
356 "Symbol is in symbol table");
359 rw_set.
get_ranges(written_object_entry.second);
365 for(
const auto &range : ranges)
366 kill(identifier, range.first, range.second);
368 for(
const auto &range : ranges)
369 gen(from, identifier, range.first, range.second);
378 assert(range_start>=0);
386 assert(range_end>range_start);
388 valuest::iterator entry=
values.find(identifier);
392 bool clear_export_cache=
false;
395 for(values_innert::iterator
396 it=entry->second.begin();
397 it!=entry->second.end();
411 clear_export_cache=
true;
413 entry->second.erase(it++);
417 clear_export_cache=
true;
423 entry->second.erase(it++);
428 clear_export_cache=
true;
439 entry->second.erase(it++);
443 clear_export_cache=
true;
449 entry->second.erase(it++);
453 if(clear_export_cache)
456 values_innert::iterator it=entry->second.begin();
457 for(
const auto &
id : new_values)
459 while(it!=entry->second.end() && *it<
id)
461 if(it==entry->second.end() ||
id<*it)
463 entry->second.insert(it,
id);
465 else if(it!=entry->second.end())
477 assert(range_start>=0);
480 valuest::iterator entry=
values.find(identifier);
484 XXX export_cache_available=
false;
489 for(rangest::iterator it=ranges.begin();
492 if(it->second.first!=-1 &&
493 it->second.first <= range_start)
495 else if(it->first >= range_start)
501 it->second.first=range_start;
518 if(range_start==0 && range_end==0)
521 assert(range_start>=0);
524 assert(range_end>range_start || range_end==-1);
540 std::pair<valuest::iterator, bool> entry=
542 rangest &ranges=entry.first->second;
546 for(rangest::iterator it=ranges.begin();
550 if(it->second.second!=from ||
551 (it->second.first!=-1 && it->second.first <= range_start) ||
552 (range_end!=-1 && it->first >= range_end))
554 else if(it->first > range_start)
557 merged_range_end=std::max(range_end, it->second.first);
560 else if(it->second.first==-1 ||
562 it->second.first >= range_end))
569 it->second.first=range_end;
575 ranges.insert(std::make_pair(
577 std::make_pair(merged_range_end, from)));
585 out <<
"Reaching definitions:\n";
593 for(
const auto &value :
values)
595 const irep_idt &identifier=value.first;
599 out <<
" " << identifier <<
"[";
601 for(ranges_at_loct::const_iterator itl=ranges.begin();
604 for(rangest::const_iterator itr=itl->second.begin();
605 itr!=itl->second.end();
608 if(itr!=itl->second.begin() ||
612 out << itr->first <<
":" << itr->second;
613 out <<
"@" << itl->first->location_number;
630 ranges_at_loct::iterator itr=it->second.begin();
631 for(
const auto &o : ito->second)
633 while(itr!=it->second.end() && itr->first<o.first)
635 if(itr==it->second.end() || o.first<itr->first)
637 it->second.insert(o);
640 else if(itr!=it->second.end())
642 assert(itr->first==o.first);
644 for(
const auto &o_range : o.second)
645 more=
gen(itr->second, o_range.first, o_range.second) ||
652 values_innert::iterator itr=dest.begin();
653 for(
const auto &
id : other)
655 while(itr!=dest.end() && *itr<
id)
657 if(itr==dest.end() ||
id<*itr)
659 dest.insert(itr,
id);
662 else if(itr!=dest.end())
681 valuest::iterator it=
values.begin();
682 for(
const auto &value : other.
values)
684 while(it!=
values.end() && it->first<value.first)
686 if(it==
values.end() || value.first<it->first)
693 assert(it->first==value.first);
725 valuest::iterator it=
values.begin();
726 for(
const auto &value : other.
values)
728 const irep_idt &identifier=value.first;
730 if(!ns.
lookup(identifier).is_shared()
734 while(it!=
values.end() && it->first<value.first)
736 if(it==
values.end() || value.first<it->first)
743 assert(it->first==value.first);
765 export_cachet::const_iterator entry=
export_cache.find(identifier);
770 return entry->second;
776 auto value_sets_=util_make_unique<value_set_analysis_fit>(
ns);
777 (*value_sets_)(goto_functions);
780 is_threaded=util_make_unique<is_threadedt>(goto_functions);
782 is_dirty=util_make_unique<dirtyt>(goto_functions);