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:
parent
4bbf650e4b
commit
83e291014f
2 changed files with 26 additions and 1 deletions
25
gcc/testsuite/c-c++-common/pr118205.c
Normal file
25
gcc/testsuite/c-c++-common/pr118205.c
Normal 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;
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue