Do not register edges for statements not understood.

Previously, all gimple_cond types were undserstoof, with float values,
this is no longer true.  We should gracefully do nothing if the
gcond type is not supported.

	PR tree-optimization/106510
	gcc/
	* gimple-range-fold.cc (fur_source::register_outgoing_edges):
	  Check for unsupported statements early.

	gcc/testsuite
	* gcc.dg/pr106510.c: New.
This commit is contained in:
Andrew MacLeod 2022-08-02 17:31:37 -04:00
parent 502605a277
commit 70daecc032
2 changed files with 14 additions and 2 deletions

View File

@ -1496,6 +1496,10 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge
tree name;
basic_block bb = gimple_bb (s);
range_op_handler handler (s);
if (!handler)
return;
if (e0)
{
// If this edge is never taken, ignore it.
@ -1524,8 +1528,6 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge
tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (s));
if (ssa1 && ssa2)
{
range_op_handler handler (s);
gcc_checking_assert (handler);
if (e0)
{
relation_kind relation = handler.op1_op2_relation (e0_range);

View File

@ -0,0 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
void foo ();
void ine_ok() {
float y, x;
if (x < y || x > y || y)
foo ();
}