52 std::set<critical_cyclet> &set_of_cycles,
56 for(std::size_t i=0; i<egraph.size(); i++)
59 std::list<event_idt>* order=
nullptr;
66 order=&egraph.po_order;
69 order=&egraph.poUrfe_order;
80 order=order_filtering(order);
85 for(std::list<event_idt>::const_iterator
91 egraph.message.debug() <<
"explore " << egraph[source].id <<
messaget::eom;
104 while(!marked_stack.empty())
113 if(egraph.filter_thin_air)
160 std::set<critical_cyclet> &set_of_cycles,
172 egraph.message.debug() << std::string(80,
'-');
174 egraph.message.debug() <<
"marked size:" << marked_stack.size()
176 std::stack<event_idt>
tmp;
177 while(!point_stack.empty())
179 egraph.message.debug() << point_stack.top() <<
" | ";
180 tmp.push(point_stack.top());
186 point_stack.push(
tmp.top());
189 while(!marked_stack.empty())
191 egraph.message.debug() << marked_stack.top() <<
" | ";
192 tmp.push(marked_stack.top());
198 marked_stack.push(
tmp.top());
207 egraph.message.debug() <<
"bcktck "<<egraph[
vertex].id<<
"#"<<
vertex<<
", "
208 <<egraph[source].id<<
"#"<<source<<
" lw:"<<
lwfence_met<<
" unsafe:"
241 if(egraph.ignore_arrays ||
262 const event_idt previous=point_stack.top();
265 point_stack.push(previous);
288 if(!point_stack.empty() &&
289 egraph.are_po_ordered(point_stack.top(),
vertex) &&
293 this_vertex.variable==egraph[point_stack.top()].variable)
297 egraph[point_stack.top()].operation==
312 if(!point_stack.empty() &&
313 egraph.are_po_ordered(point_stack.top(),
vertex) &&
317 this_vertex.variable!=egraph[point_stack.top()].variable)
357 if(!point_stack.empty())
366 egraph.are_po_ordered(point_stack.top(),
vertex))
372 marked_stack.push(
vertex);
377 for(wmm_grapht::edgest::const_iterator
382 if(
w==source && point_stack.size()>=4
384 ||
this_vertex.unsafe_pair(egraph[source], model)) )
393 thin_air_events.insert(*
e_it);
395 if((!egraph.filter_uniproc ||
new_cycle.is_not_uniproc(model)) &&
399 egraph.message.debug() <<
new_cycle.print_name(model,
false)
404 set_of_cycles.insert(*
reduced);
430 for(wmm_grapht::edgest::const_iterator
437 else if(
w==source && point_stack.size()>=4 &&
448 thin_air_events.insert(*
e_it);
450 if((!egraph.filter_uniproc ||
new_cycle.is_not_uniproc(model)) &&
454 egraph.message.debug() <<
new_cycle.print_name(model,
false)
459 set_of_cycles.insert(*
reduced);
480 egraph.remove_com_edge(
vertex, e);
485 while(!marked_stack.empty() && marked_stack.top()!=
vertex)
492 if(!marked_stack.empty())
518 if(skip_tracked.find(
vertex)==skip_tracked.end())
521 !point_stack.empty() &&
522 egraph.are_po_ordered(point_stack.top(),
vertex) &&
525 egraph[point_stack.top()].operation==
529 egraph[point_stack.top()].operation==
532 skip_tracked.insert(
vertex);
534 std::stack<event_idt>
tmp;
536 while(!marked_stack.empty() && marked_stack.top()!=
vertex)
538 tmp.push(marked_stack.top());
539 mark[marked_stack.top()]=
false;
543 if(!marked_stack.empty())
552 marked_stack.push(
tmp.top());
553 mark[
tmp.top()]=
true;
557 marked_stack.push(
vertex);
560 if(!egraph[point_stack.top()].unsafe_pair(
this_vertex, model))
563 if(egraph.ignore_arrays ||
572 egraph[point_stack.top()].operation==
576 egraph[point_stack.top()].operation==
579 for(wmm_grapht::edgest::const_iterator
w_it=
580 egraph.po_out(
vertex).begin();
600 while(!marked_stack.empty() && marked_stack.top()!=
vertex)
607 if(!marked_stack.empty())
612 skip_tracked.erase(
vertex);
bool backtrack(std::set< critical_cyclet > &set_of_cycles, event_idt source, event_idt vertex, bool unsafe_met, event_idt po_trans, bool same_var_pair, bool lwsync_met, bool has_to_be_unsafe, irep_idt var_to_avoid, memory_modelt model)
see event_grapht::collect_cycles
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...