tree-optimization/116057 - wrong code with CCP and vector CTORs

The following fixes an issue with CCPs likely_value when faced with
a vector CTOR containing undef SSA names and constants.  This should
be classified as CONSTANT and not UNDEFINED.

	PR tree-optimization/116057
	* tree-ssa-ccp.cc (likely_value): Also walk CTORs in stmt
	operands to look for constants.

	* gcc.dg/torture/pr116057.c: New testcase.
This commit is contained in:
Richard Biener 2024-07-24 13:16:35 +02:00 committed by Richard Biener
parent 39562dd1e7
commit 1ea551514b
2 changed files with 31 additions and 0 deletions

View File

@ -0,0 +1,20 @@
/* { dg-do run } */
/* { dg-additional-options "-Wno-psabi" } */
#define vect8 __attribute__((vector_size(8)))
vect8 int __attribute__((noipa))
f(int a)
{
int b;
vect8 int t={1,1};
if(a) return t;
return (vect8 int){0, b};
}
int main ()
{
if (f(0)[0] != 0)
__builtin_abort ();
return 0;
}

View File

@ -762,6 +762,17 @@ likely_value (gimple *stmt)
continue;
if (is_gimple_min_invariant (op))
has_constant_operand = true;
else if (TREE_CODE (op) == CONSTRUCTOR)
{
unsigned j;
tree val;
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (op), j, val)
if (CONSTANT_CLASS_P (val))
{
has_constant_operand = true;
break;
}
}
}
if (has_constant_operand)