]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/gimple-range-edge.cc
Correct a function pre/postcondition [PR102403].
[thirdparty/gcc.git] / gcc / gimple-range-edge.cc
index b42dcd6d31868d576b5038b68bdd37bcf2b76546..d11153e677e74d088667e52a1830f62fbfd7daa3 100644 (file)
@@ -1,5 +1,5 @@
 /* Gimple range edge functionaluity.
-   Copyright (C) 2020 Free Software Foundation, Inc.
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
    Contributed by Andrew MacLeod <amacleod@redhat.com>
    and Aldy Hernandez <aldyh@redhat.com>.
 
@@ -52,12 +52,26 @@ gimple_outgoing_range_stmt_p (basic_block bb)
 }
 
 
-outgoing_range::outgoing_range ()
+// Return a TRUE or FALSE range representing the edge value of a GCOND.
+
+void
+gcond_edge_range (irange &r, edge e)
+{
+  gcc_checking_assert (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE));
+  if (e->flags & EDGE_TRUE_VALUE)
+    r = int_range<2> (boolean_true_node, boolean_true_node);
+  else
+    r = int_range<2> (boolean_false_node, boolean_false_node);
+}
+
+
+gimple_outgoing_range::gimple_outgoing_range ()
 {
   m_edge_table = NULL;
 }
 
-outgoing_range::~outgoing_range ()
+
+gimple_outgoing_range::~gimple_outgoing_range ()
 {
   if (m_edge_table)
     delete m_edge_table;
@@ -68,7 +82,7 @@ outgoing_range::~outgoing_range ()
 // Use a cached value if it exists, or calculate it if not.
 
 bool
-outgoing_range::get_edge_range (irange &r, gimple *s, edge e)
+gimple_outgoing_range::get_edge_range (irange &r, gimple *s, edge e)
 {
   gcc_checking_assert (is_a<gswitch *> (s));
   gswitch *sw = as_a<gswitch *> (s);
@@ -100,7 +114,7 @@ outgoing_range::get_edge_range (irange &r, gimple *s, edge e)
 // Calculate all switch edges from SW and cache them in the hash table.
 
 void
-outgoing_range::calc_switch_ranges (gswitch *sw)
+gimple_outgoing_range::calc_switch_ranges (gswitch *sw)
 {
   bool existed;
   unsigned x, lim;
@@ -112,8 +126,7 @@ outgoing_range::calc_switch_ranges (gswitch *sw)
   //
   // Allocate an int_range_max for the default range case, start with
   // varying and intersect each other case from it.
-  irange *default_range = m_range_allocator.allocate (255);
-  default_range->set_varying (type);
+  int_range_max default_range (type);
 
   for (x = 1; x < lim; x++)
     {
@@ -132,7 +145,7 @@ outgoing_range::calc_switch_ranges (gswitch *sw)
       int_range_max def_range (low, high);
       range_cast (def_range, type);
       def_range.invert ();
-      default_range->intersect (def_range);
+      default_range.intersect (def_range);
 
       // Create/union this case with anything on else on the edge.
       int_range_max case_range (low, high);
@@ -156,7 +169,8 @@ outgoing_range::calc_switch_ranges (gswitch *sw)
   irange *&slot = m_edge_table->get_or_insert (default_edge, &existed);
   // This should be the first call into this switch.
   gcc_checking_assert (!existed);
-  slot = default_range;
+  irange *dr = m_range_allocator.allocate (default_range);
+  slot = dr;
 }
 
 
@@ -165,7 +179,7 @@ outgoing_range::calc_switch_ranges (gswitch *sw)
 // return NULL
 
 gimple *
-outgoing_range::edge_range_p (irange &r, edge e)
+gimple_outgoing_range::edge_range_p (irange &r, edge e)
 {
   // Determine if there is an outgoing edge.
   gimple *s = gimple_outgoing_range_stmt_p (e->src);
@@ -174,12 +188,7 @@ outgoing_range::edge_range_p (irange &r, edge e)
 
   if (is_a<gcond *> (s))
     {
-      if (e->flags & EDGE_TRUE_VALUE)
-       r = int_range<2> (boolean_true_node, boolean_true_node);
-      else if (e->flags & EDGE_FALSE_VALUE)
-       r = int_range<2> (boolean_false_node, boolean_false_node);
-      else
-       gcc_unreachable ();
+      gcond_edge_range (r, e);
       return s;
     }