Make the path solver's range_of_stmt() handle all statements.

The path solver's range_of_stmt() was handcuffed to only fold
GIMPLE_COND statements, since those were the only statements the
backward threader needed to resolve.  However, there is no need for this
restriction, as the folding code is perfectly capable of folding any
statement.

This can be the case when trying to fold other statements in the final
block of a path (for instance, in the forward threader as it tries to
fold candidate statements along a path).

Tested on x86-64 Linux.

gcc/ChangeLog:

	* gimple-range-path.cc (path_range_query::range_of_stmt): Remove
	GIMPLE_COND special casing.
	(path_range_query::range_defined_in_block): Use range_of_stmt
	instead of calling fold_range directly.
This commit is contained in:
Aldy Hernandez 2021-09-05 16:53:31 +02:00
parent 90ef153527
commit a827909537

View file

@ -155,7 +155,6 @@ path_range_query::unreachable_path_p ()
}
// Return the range of STMT at the end of the path being analyzed.
// Anything but the final conditional in a BB will return VARYING.
bool
path_range_query::range_of_stmt (irange &r, gimple *stmt, tree)
@ -165,10 +164,9 @@ path_range_query::range_of_stmt (irange &r, gimple *stmt, tree)
if (!irange::supports_type_p (type))
return false;
if (gimple_code (stmt) == GIMPLE_COND && fold_range (r, stmt, this))
return true;
if (!fold_range (r, stmt, this))
r.set_varying (type);
r.set_varying (type);
return true;
}
@ -237,7 +235,7 @@ path_range_query::range_defined_in_block (irange &r, tree name, basic_block bb)
if (gimple_code (def_stmt) == GIMPLE_PHI)
ssa_range_in_phi (r, as_a<gphi *> (def_stmt));
else if (!fold_range (r, def_stmt, this))
else if (!range_of_stmt (r, def_stmt, name))
r.set_varying (TREE_TYPE (name));
if (bb)