]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcc/
authorolegendo <olegendo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 Nov 2014 21:16:26 +0000 (21:16 +0000)
committerolegendo <olegendo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 Nov 2014 21:16:26 +0000 (21:16 +0000)
PR target/53976
* config/sh/sh_optimize_sett_clrt.cc
(sh_optimize_sett_clrt::find_last_ccreg_values): Return bool instead
of void.  Abort at complex edges.
(sh_optimize_sett_clrt::execute): Do nothing if find_last_ccreg_values
returned false.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217987 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh_optimize_sett_clrt.cc

index 929b2377ca8397944e3dbc4d6a3505174a817cd2..7e1f741cc0002d6547dd1e532928256aa63eaec2 100644 (file)
@@ -1,3 +1,12 @@
+2014-11-23  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/53976
+       * config/sh/sh_optimize_sett_clrt.cc
+       (sh_optimize_sett_clrt::find_last_ccreg_values): Return bool instead
+       of void.  Abort at complex edges.
+       (sh_optimize_sett_clrt::execute): Do nothing if find_last_ccreg_values
+       returned false.
+
 2014-11-22  John David Anglin  <danglin@gcc.gnu.org>
 
        PR other/63694
index bc1f82fd79223068d018917ed0845861a11f7750..f19c2ebf383a2e677efec3f223a7f78478c8935b 100644 (file)
@@ -126,7 +126,7 @@ private:
   // Given a start insn and its basic block, recursively determine all
   // possible ccreg values in all basic block paths that can lead to the
   // start insn.
-  void find_last_ccreg_values (rtx_insn *start_insn, basic_block bb,
+  bool find_last_ccreg_values (rtx_insn *start_insn, basic_block bb,
                               std::vector<ccreg_value>& values_out,
                               std::vector<basic_block>& prev_visited_bb) const;
 
@@ -239,8 +239,8 @@ sh_optimize_sett_clrt::execute (function* fun)
 
            ccreg_values.clear ();
            visited_bbs.clear ();
-           find_last_ccreg_values (PREV_INSN (i), bb, ccreg_values,
-                                   visited_bbs);
+           bool ok = find_last_ccreg_values (PREV_INSN (i), bb, ccreg_values,
+                                             visited_bbs);
 
            log_msg ("number of ccreg values collected: %u\n",
                     (unsigned int)ccreg_values.size ());
@@ -248,7 +248,7 @@ sh_optimize_sett_clrt::execute (function* fun)
            // If all the collected values are equal and are equal to the
            // constant value of the setcc insn, the setcc insn can be
            // removed.
-           if (all_ccreg_values_equal (ccreg_values)
+           if (ok && all_ccreg_values_equal (ccreg_values)
                && rtx_equal_p (ccreg_values.front ().value, setcc_val))
              {
                log_msg ("all values are ");
@@ -322,7 +322,7 @@ sh_optimize_sett_clrt
     gcc_unreachable ();
 }
 
-void
+bool
 sh_optimize_sett_clrt
 ::find_last_ccreg_values (rtx_insn *start_insn, basic_block bb,
                          std::vector<ccreg_value>& values_out,
@@ -361,7 +361,7 @@ sh_optimize_sett_clrt
          log_msg ("\n");
 
          values_out.push_back (v);
-         return;
+         return true;
        }
 
       if (any_condjump_p (i) && onlyjump_p (i) && !prev_visited_bb.empty ())
@@ -385,7 +385,7 @@ sh_optimize_sett_clrt
          log_msg ("\n");
 
          values_out.push_back (v);
-         return;
+         return true;
        }
     }
 
@@ -406,10 +406,14 @@ sh_optimize_sett_clrt
       for (edge_iterator ei = ei_start (bb->preds); !ei_end_p (ei);
           ei_next (&ei))
        {
+         if (ei_edge (ei)->flags & EDGE_COMPLEX)
+           log_return (false, "aborting due to complex edge\n");
+
          basic_block pred_bb = ei_edge (ei)->src;
          pred_bb_count += 1;
-         find_last_ccreg_values (BB_END (pred_bb), pred_bb, values_out,
-                                 prev_visited_bb);
+         if (!find_last_ccreg_values (BB_END (pred_bb), pred_bb, values_out,
+                                      prev_visited_bb))
+           return false;
        }
 
       prev_visited_bb.pop_back ();
@@ -432,6 +436,8 @@ sh_optimize_sett_clrt
 
     values_out.push_back (v);
   }
+
+  return true;
 }
 
 bool