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.
(cherry picked from commit
d976daa931642d940b7b27032ca6139210c07eed)
--- /dev/null
+/* { 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);
+}
else if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
&& gimple_assign_load_p (stmt)
&& !gimple_has_volatile_ops (stmt)
- && (TREE_CODE (gimple_assign_rhs1 (stmt))
- != TARGET_MEM_REF)
- && !stmt_can_throw_internal (cfun, stmt))
+ && TREE_CODE (rhs) != TARGET_MEM_REF
+ && TREE_CODE (rhs) != BIT_FIELD_REF
+ && !stmt_can_throw_internal (fun, stmt))
{
/* Rewrite loads used only in real/imagpart extractions to
component-wise loads. */