re PR target/53976 ([SH] Unnecessary clrt/sett after bt/bf)
gcc/ 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. From-SVN: r217987
This commit is contained in:
parent
bc1b9ef151
commit
8be6500b53
|
@ -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>
|
2014-11-22 John David Anglin <danglin@gcc.gnu.org>
|
||||||
|
|
||||||
PR other/63694
|
PR other/63694
|
||||||
|
|
|
@ -126,7 +126,7 @@ private:
|
||||||
// Given a start insn and its basic block, recursively determine all
|
// Given a start insn and its basic block, recursively determine all
|
||||||
// possible ccreg values in all basic block paths that can lead to the
|
// possible ccreg values in all basic block paths that can lead to the
|
||||||
// start insn.
|
// 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<ccreg_value>& values_out,
|
||||||
std::vector<basic_block>& prev_visited_bb) const;
|
std::vector<basic_block>& prev_visited_bb) const;
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ sh_optimize_sett_clrt::execute (function* fun)
|
||||||
|
|
||||||
ccreg_values.clear ();
|
ccreg_values.clear ();
|
||||||
visited_bbs.clear ();
|
visited_bbs.clear ();
|
||||||
find_last_ccreg_values (PREV_INSN (i), bb, ccreg_values,
|
bool ok = find_last_ccreg_values (PREV_INSN (i), bb, ccreg_values,
|
||||||
visited_bbs);
|
visited_bbs);
|
||||||
|
|
||||||
log_msg ("number of ccreg values collected: %u\n",
|
log_msg ("number of ccreg values collected: %u\n",
|
||||||
|
@ -248,7 +248,7 @@ sh_optimize_sett_clrt::execute (function* fun)
|
||||||
// If all the collected values are equal and are equal to the
|
// If all the collected values are equal and are equal to the
|
||||||
// constant value of the setcc insn, the setcc insn can be
|
// constant value of the setcc insn, the setcc insn can be
|
||||||
// removed.
|
// 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))
|
&& rtx_equal_p (ccreg_values.front ().value, setcc_val))
|
||||||
{
|
{
|
||||||
log_msg ("all values are ");
|
log_msg ("all values are ");
|
||||||
|
@ -322,7 +322,7 @@ sh_optimize_sett_clrt
|
||||||
gcc_unreachable ();
|
gcc_unreachable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
sh_optimize_sett_clrt
|
sh_optimize_sett_clrt
|
||||||
::find_last_ccreg_values (rtx_insn *start_insn, basic_block bb,
|
::find_last_ccreg_values (rtx_insn *start_insn, basic_block bb,
|
||||||
std::vector<ccreg_value>& values_out,
|
std::vector<ccreg_value>& values_out,
|
||||||
|
@ -361,7 +361,7 @@ sh_optimize_sett_clrt
|
||||||
log_msg ("\n");
|
log_msg ("\n");
|
||||||
|
|
||||||
values_out.push_back (v);
|
values_out.push_back (v);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (any_condjump_p (i) && onlyjump_p (i) && !prev_visited_bb.empty ())
|
if (any_condjump_p (i) && onlyjump_p (i) && !prev_visited_bb.empty ())
|
||||||
|
@ -385,7 +385,7 @@ sh_optimize_sett_clrt
|
||||||
log_msg ("\n");
|
log_msg ("\n");
|
||||||
|
|
||||||
values_out.push_back (v);
|
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);
|
for (edge_iterator ei = ei_start (bb->preds); !ei_end_p (ei);
|
||||||
ei_next (&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;
|
basic_block pred_bb = ei_edge (ei)->src;
|
||||||
pred_bb_count += 1;
|
pred_bb_count += 1;
|
||||||
find_last_ccreg_values (BB_END (pred_bb), pred_bb, values_out,
|
if (!find_last_ccreg_values (BB_END (pred_bb), pred_bb, values_out,
|
||||||
prev_visited_bb);
|
prev_visited_bb))
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_visited_bb.pop_back ();
|
prev_visited_bb.pop_back ();
|
||||||
|
@ -432,6 +436,8 @@ sh_optimize_sett_clrt
|
||||||
|
|
||||||
values_out.push_back (v);
|
values_out.push_back (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
Loading…
Reference in New Issue