tree-optimization/117417 - ICE with complex load optimization

When we decompose a complex load only used as real and imaginary
parts we fail to honor IL constraints which are that a BIT_FIELD_REF
of register type should be outermost in a ref.  The following
simply avoids the transform when the complex load has such a
BIT_FIELD_REF.

	PR tree-optimization/117417
	* tree-ssa-forwprop.cc (pass_forwprop::execute): Avoid
	decomposing BIT_FIELD_REF complex load.

	* gcc.dg/torture/pr117417.c: New testcase.
This commit is contained in:
Richard Biener 2024-11-12 11:15:15 +01:00 committed by Richard Biener
parent a552a808f0
commit d976daa931
2 changed files with 18 additions and 2 deletions

View File

@ -0,0 +1,16 @@
/* { dg-do compile } */
typedef __attribute__((__vector_size__ (8))) double V;
int bar (int a, V *p)
{
V v;
v = *p;
a += *(_Complex short *) &v;
return a;
}
V x;
int
foo ()
{
return bar (0, &x);
}

View File

@ -3687,8 +3687,8 @@ pass_forwprop::execute (function *fun)
else if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE else if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
&& gimple_assign_load_p (stmt) && gimple_assign_load_p (stmt)
&& !gimple_has_volatile_ops (stmt) && !gimple_has_volatile_ops (stmt)
&& (TREE_CODE (gimple_assign_rhs1 (stmt)) && TREE_CODE (rhs) != TARGET_MEM_REF
!= TARGET_MEM_REF) && TREE_CODE (rhs) != BIT_FIELD_REF
&& !stmt_can_throw_internal (fun, stmt)) && !stmt_can_throw_internal (fun, stmt))
{ {
/* Rewrite loads used only in real/imagpart extractions to /* Rewrite loads used only in real/imagpart extractions to