tree-optimization: Fix ICE in tree-parloops.cc reduction_phi() [PR118205]

Prior to r15-6001, reduction_phi() could be called with the PHI parameter
not actually being a gphi*. The search through reduction_list would fail and
return NULL. r15-6001 added a requirement that PHI actually be a gphi*, but
did not add a check for this. The PR shows an example where the check is
needed; fix by explicitly returning NULL in this case.

gcc/ChangeLog:

	PR tree-optimization/118205
	* tree-parloops.cc (reduction_phi): Return NULL if PHI parameter is
	not a phi node.

gcc/testsuite/ChangeLog:

	PR tree-optimization/118205
	* c-c++-common/pr118205.c: New test.
This commit is contained in:
Lewis Hyatt 2024-12-26 10:58:57 -05:00 committed by Lewis Hyatt
parent 4bbf650e4b
commit 83e291014f
No known key found for this signature in database
2 changed files with 26 additions and 1 deletions

View file

@ -0,0 +1,25 @@
/* PR tree-optimization/118205 */
/* { dg-do compile } */
/* { dg-require-effective-target fgraphite } */
/* { dg-require-effective-target pthread } */
/* { dg-options "-O -floop-parallelize-all -ftree-parallelize-loops=2" } */
int x;
void g(int);
int f() {
unsigned res = 0;
int arr[] = {};
int y = 0;
for (unsigned int i = 1; i; i++)
{
for (int n = 0; n < 2; n++)
{
g(arr[i]);
res = y > x ? y : x;
y = res;
}
g(arr[i]);
}
return res;
}

View file

@ -948,7 +948,7 @@ reduction_phi (reduction_info_table_type *reduction_list, gimple *phi)
{
struct reduction_info tmpred, *red;
if (reduction_list->is_empty () || phi == NULL)
if (reduction_list->is_empty () || phi == NULL || !is_a <gphi *> (phi))
return NULL;
if (gimple_uid (phi) == (unsigned int)-1