return m_sedge->get_any_cfg_edge ();
}
+/* If this event is for a conditional, write the sense of the
+ conditional to *OUT and return true.
+ Otherwise return false. */
+
+bool
+cfg_edge_event::maybe_get_edge_sense (bool *out) const
+{
+ if (::edge e = get_cfg_edge ())
+ {
+ if (e->flags & EDGE_TRUE_VALUE)
+ {
+ *out = true;
+ return true;
+ }
+ else if (e->flags & EDGE_FALSE_VALUE)
+ {
+ *out = false;
+ return true;
+ }
+ }
+ return false;
+}
+
/* class start_cfg_edge_event : public cfg_edge_event. */
/* Implementation of diagnostics::paths::event::print_desc vfunc for
::edge get_cfg_edge () const;
+ bool maybe_get_edge_sense (bool *out) const;
+
protected:
cfg_edge_event (enum event_kind kind,
const exploded_edge &eedge,
const start_cfg_edge_event *old_start_cfg_ev
= (const start_cfg_edge_event *)old_start_ev;
bool edge_sense;
- if (::edge e = old_start_cfg_ev->get_cfg_edge ())
- {
- if (e->flags & EDGE_TRUE_VALUE)
- edge_sense = true;
- else if (e->flags & EDGE_FALSE_VALUE)
- edge_sense = false;
- else
- continue;
- }
+ if (!old_start_cfg_ev->maybe_get_edge_sense (&edge_sense))
+ continue;
/* Find a run of CFG start/end event pairs from
[start_idx, next_idx)
gcc_assert (iter_ev->get_kind () == event_kind::start_cfg_edge);
const start_cfg_edge_event *iter_cfg_ev
= (const start_cfg_edge_event *)iter_ev;
- ::edge e = iter_cfg_ev->get_cfg_edge ();
- if (!e)
+ bool iter_edge_sense;
+ if (!iter_cfg_ev->maybe_get_edge_sense (&iter_edge_sense))
+ break;
+ if (iter_edge_sense != edge_sense)
break;
- if (edge_sense)
- {
- if (!(e->flags & EDGE_TRUE_VALUE))
- break;
- }
- else
- {
- if (!(e->flags & EDGE_FALSE_VALUE))
- break;
- }
next_idx += 2;
}