tree-optimization/105618 - restore load sinking

The PR97330 fix caused some missed sinking of loads out of loops
the following patch re-instantiates.

2022-05-17  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/105618
	* tree-ssa-sink.cc (statement_sink_location): For virtual
	PHI uses ignore those defining the used virtual operand.

	* gcc.dg/tree-ssa/ssa-sink-19.c: New testcase.

(cherry picked from commit ebce0e9bd8)
This commit is contained in:
Richard Biener 2022-05-17 09:45:02 +02:00
parent 25d7a73810
commit 374cee99d0
2 changed files with 24 additions and 0 deletions

View File

@ -0,0 +1,21 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-sink1-details -fdump-tree-cddce2-details" } */
static int b=4;
int c;
int
main()
{
int e[5] = {1,1,1,1,1};
for (; b >= 0; b--) {
c = e[b];
}
return 0;
}
/* We should sink e[b] out of the loop which is possible after
applying store motion to c and b. */
/* { dg-final { scan-tree-dump "Sinking # VUSE" "sink1" } } */
/* And remove the loop after final value replacement. */
/* { dg-final { scan-tree-dump "fix_loop_structure: removing loop" "cddce2" } } */

View File

@ -390,6 +390,9 @@ statement_sink_location (gimple *stmt, basic_block frombb,
with the use. */ with the use. */
if (gimple_code (use_stmt) == GIMPLE_PHI) if (gimple_code (use_stmt) == GIMPLE_PHI)
{ {
/* If the PHI defines the virtual operand, ignore it. */
if (gimple_phi_result (use_stmt) == gimple_vuse (stmt))
continue;
/* In case the PHI node post-dominates the current insert /* In case the PHI node post-dominates the current insert
location we can disregard it. But make sure it is not location we can disregard it. But make sure it is not
dominating it as well as can happen in a CFG cycle. */ dominating it as well as can happen in a CFG cycle. */