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;
218 if(function_from != function_to)
220 for(valuest::iterator it=
values.begin();
224 const irep_idt &identifier=it->first;
228 if((ns.
lookup(identifier, sym) ||
234 valuest::iterator next=it;
247 for(
const auto ¶m : code_type.
parameters())
249 const irep_idt &identifier=param.get_identifier();
251 if(identifier.
empty())
255 if(param_bits.has_value())
258 gen(from, identifier, 0, -1);
264 if(from->get_function_call().lhs().is_not_nil())
285 for(
const auto &new_value : new_values)
287 const irep_idt &identifier=new_value.first;
290 (!ns.
lookup(identifier).is_shared() &&
293 for(
const auto &
id : new_value.second)
300 for(
const auto &
id : new_value.second)
309 for(
const auto ¶m : code_type.
parameters())
311 const irep_idt &identifier=param.get_identifier();
313 if(identifier.
empty())
316 valuest::iterator entry=
values.find(identifier);
346 goto_rw(function_to, to, rw_set);
347 const bool is_must_alias=rw_set.
get_w_set().size()==1;
349 for(
const auto &written_object_entry : rw_set.
get_w_set())
351 const irep_idt &identifier = written_object_entry.first;
354 if(ns.
lookup(identifier, symbol_ptr))
359 "Symbol is in symbol table");
362 rw_set.
get_ranges(written_object_entry.second);
368 for(
const auto &range : ranges)
369 kill(identifier, range.first, range.second);
371 for(
const auto &range : ranges)
372 gen(from, identifier, range.first, range.second);
381 assert(range_start>=0);
389 assert(range_end>range_start);
391 valuest::iterator entry=
values.find(identifier);
395 bool clear_export_cache=
false;
398 for(values_innert::iterator
399 it=entry->second.begin();
400 it!=entry->second.end();
414 clear_export_cache=
true;
416 entry->second.erase(it++);
420 clear_export_cache=
true;
426 entry->second.erase(it++);
431 clear_export_cache=
true;
442 entry->second.erase(it++);
446 clear_export_cache=
true;
452 entry->second.erase(it++);
456 if(clear_export_cache)
459 values_innert::iterator it=entry->second.begin();
460 for(
const auto &
id : new_values)
462 while(it!=entry->second.end() && *it<
id)
464 if(it==entry->second.end() ||
id<*it)
466 entry->second.insert(it,
id);
468 else if(it!=entry->second.end())
480 assert(range_start>=0);
483 valuest::iterator entry=
values.find(identifier);
487 XXX export_cache_available=
false;
492 for(rangest::iterator it=ranges.begin();
495 if(it->second.first!=-1 &&
496 it->second.first <= range_start)
498 else if(it->first >= range_start)
504 it->second.first=range_start;
521 if(range_start==0 && range_end==0)
524 assert(range_start>=0);
527 assert(range_end>range_start || range_end==-1);
543 std::pair<valuest::iterator, bool> entry=
545 rangest &ranges=entry.first->second;
549 for(rangest::iterator it=ranges.begin();
553 if(it->second.second!=from ||
554 (it->second.first!=-1 && it->second.first <= range_start) ||
555 (range_end!=-1 && it->first >= range_end))
557 else if(it->first > range_start)
560 merged_range_end=std::max(range_end, it->second.first);
563 else if(it->second.first==-1 ||
565 it->second.first >= range_end))
572 it->second.first=range_end;
578 ranges.insert(std::make_pair(
580 std::make_pair(merged_range_end, from)));
588 out <<
"Reaching definitions:\n";
596 for(
const auto &value :
values)
598 const irep_idt &identifier=value.first;
602 out <<
" " << identifier <<
"[";
604 for(ranges_at_loct::const_iterator itl=ranges.begin();
607 for(rangest::const_iterator itr=itl->second.begin();
608 itr!=itl->second.end();
611 if(itr!=itl->second.begin() ||
615 out << itr->first <<
":" << itr->second;
616 out <<
"@" << itl->first->location_number;
633 ranges_at_loct::iterator itr=it->second.begin();
634 for(
const auto &o : ito->second)
636 while(itr!=it->second.end() && itr->first<o.first)
638 if(itr==it->second.end() || o.first<itr->first)
640 it->second.insert(o);
643 else if(itr!=it->second.end())
645 assert(itr->first==o.first);
647 for(
const auto &o_range : o.second)
648 more=
gen(itr->second, o_range.first, o_range.second) ||
655 values_innert::iterator itr=dest.begin();
656 for(
const auto &
id : other)
658 while(itr!=dest.end() && *itr<
id)
660 if(itr==dest.end() ||
id<*itr)
662 dest.insert(itr,
id);
665 else if(itr!=dest.end())
684 valuest::iterator it=
values.begin();
685 for(
const auto &value : other.
values)
687 while(it!=
values.end() && it->first<value.first)
689 if(it==
values.end() || value.first<it->first)
696 assert(it->first==value.first);
728 valuest::iterator it=
values.begin();
729 for(
const auto &value : other.
values)
731 const irep_idt &identifier=value.first;
733 if(!ns.
lookup(identifier).is_shared()
737 while(it!=
values.end() && it->first<value.first)
739 if(it==
values.end() || value.first<it->first)
746 assert(it->first==value.first);
768 export_cachet::const_iterator entry=
export_cache.find(identifier);
773 return entry->second;
779 auto value_sets_=util_make_unique<value_set_analysis_fit>(
ns);
780 (*value_sets_)(goto_functions);
783 is_threaded=util_make_unique<is_threadedt>(goto_functions);
785 is_dirty=util_make_unique<dirtyt>(goto_functions);