112 std::set<event_idt> covered;
124 std::map<event_idt, event_idt> orig2copy;
127 for(std::set<event_idt>::const_iterator it=covered.begin();
133 orig2copy[*it]=new_node;
141 for(std::set<event_idt>::const_iterator it_i=covered.begin();
145 for(std::set<event_idt>::const_iterator it_j=covered.begin();
163 for(std::set<event_idt>::const_iterator it_i=covered.begin();
184 return orig2copy[end];
284 bool unsafe_met=
false;
291 unsigned thread=egraph[*begin()].thread;
294 th_it!=end() && thread==egraph[*th_it].thread; ++th_it)
295 thread=egraph[*th_it].thread;
303 for(; it!=end() && next!=end(); ++next, ++it)
351 if(check_AC(s_it, first, second))
354 if(check_BC(it, first, second))
364 && (first.
thread!=second.
thread || egraph.are_po_ordered(*it, *s_it)))
378 after_second=begin();
384 && egraph[*before_first].thread!=first.
thread
385 && egraph[*after_second].thread!=second.
thread)
396 unsafe_pairs.insert(delay);
406 && (first.
thread!=second.
thread || egraph.are_po_ordered(*it, *s_it)))
420 after_second=begin();
426 && egraph[*before_first].thread!=first.
thread
427 && egraph[*after_second].thread!=second.
thread)
438 unsafe_pairs.insert(delay);
483 if(check_AC(s_it, first, second))
486 if(check_BC(begin(), first, second))
494 && (first.
thread!=second.
thread || egraph.are_po_ordered(back(), *s_it)))
496 std::list<event_idt>::const_iterator before_first;
497 std::list<event_idt>::const_iterator after_second;
508 && egraph[*before_first].thread!=first.
thread
509 && egraph[*after_second].thread!=second.
thread)
518 unsafe_pairs.insert(delay);
528 && (first.
thread!=second.
thread || egraph.are_po_ordered(back(), *s_it)))
530 std::list<event_idt>::const_iterator before_first;
531 std::list<event_idt>::const_iterator after_second;
542 && egraph[*before_first].thread!=first.
thread
543 && egraph[*after_second].thread!=second.
thread)
552 unsafe_pairs.insert(delay);
568 bool unsafe_met=
false;
569 unsigned char fences_met=0;
576 unsigned thread=egraph[*begin()].thread;
579 th_it!=end() && thread==egraph[*th_it].thread; ++th_it)
580 thread=egraph[*th_it].thread;
610 fences_met |= egraph[*s_it].fence_value();
641 AC_it!=end() && egraph[*AC_it].thread==second.
thread;
644 && egraph[*AC_it].is_cumul()
645 && egraph[*AC_it].is_corresponding_fence(egraph[*it], egraph[*s_it]))
654 if(AC_it==end() && egraph[front()].thread==second.
thread)
657 !(egraph[*AC_it]==first) && egraph[*AC_it].thread==second.
thread;
660 egraph[*AC_it].is_cumul() &&
661 egraph[*AC_it].is_corresponding_fence(egraph[*it], egraph[*s_it]))
684 BC_it!=begin() && egraph[*BC_it].thread==first.
thread;
688 egraph[*BC_it].is_cumul() &&
689 egraph[*BC_it].is_corresponding_fence(egraph[*it], egraph[*s_it]))
699 if(BC_it==begin() && egraph[back()].thread==first.
thread)
702 !(egraph[*BC_it]==second) && egraph[*BC_it].thread==first.
thread;
705 egraph[*BC_it].is_cumul() &&
706 egraph[*BC_it].is_corresponding_fence(egraph[*it], egraph[*s_it]))
723 && (first.
thread!=second.
thread || egraph.are_po_ordered(*it, *s_it)))
730 unsafe_pairs.insert(delay);
741 && (first.
thread!=second.
thread || egraph.are_po_ordered(*it, *s_it)))
748 unsafe_pairs.insert(delay);
768 fences_met |= egraph[*s_it].fence_value();
796 AC_it!=end() && egraph[*AC_it].thread==second.
thread;
799 && egraph[*AC_it].is_cumul()
800 && egraph[*AC_it].is_corresponding_fence(first, second))
809 if(AC_it==end() && egraph[front()].thread==second.
thread)
812 !(egraph[*AC_it]==first) && egraph[*AC_it].thread==second.
thread;
815 egraph[*AC_it].is_cumul() &&
816 egraph[*AC_it].is_corresponding_fence(first, second))
831 BC_it!=begin() && egraph[*BC_it].thread==first.
thread;
834 && egraph[*BC_it].is_cumul()
835 && egraph[*BC_it].is_corresponding_fence(first, second))
844 if(BC_it==begin() && egraph[back()].thread==first.
thread)
849 !(egraph[*BC_it]==second) && egraph[*BC_it].thread==first.
thread;
852 && egraph[*BC_it].is_cumul()
853 && egraph[*BC_it].is_corresponding_fence(first, second))
868 && (first.
thread!=second.
thread || egraph.are_po_ordered(back(), *s_it)))
873 unsafe_pairs.insert(delay);
882 && (first.
thread!=second.
thread || egraph.are_po_ordered(back(), *s_it)))
887 unsafe_pairs.insert(delay);
1160 std::set<event_idt> reduced_evts;
1164 for(first_it=begin(); first_it!=end(); ++first_it)
1167 if(prev_it!=end() && egraph[*prev_it].thread!=first.
thread
1174 reduced_evts.insert(*first_it);
1188 if(cur.
thread!=egraph[*next_it].thread)
1190 if(reduced_evts.find(*cur_it)==reduced_evts.end())
1193 reduced_evts.insert(*cur_it);
1195 for(; next_it!=end() && egraph[*next_it].is_fence(); ++next_it) {}
1197 if(reduced_evts.find(*next_it)==reduced_evts.end())
1200 reduced_evts.insert(*next_it);
1215 if(cur.
thread!=egraph[*next_it].thread)
1217 if(reduced_evts.find(*cur_it)==reduced_evts.end())
1220 reduced_evts.insert(*cur_it);
1222 for(; next_it!=end() && egraph[*next_it].is_fence(); ++next_it) {}
1224 if(reduced_evts.find(*next_it)==reduced_evts.end())
1227 reduced_evts.insert(*next_it);