When we simplify a BIT_FIELD_REF of a CTOR like { _1, _2, _3, _4 }
and attempt to produce (view converted) { _1, _2 } for a selected
subset we fail to realize this cannot be done from match.pd since
we have no way to write the resulting CTOR "operation" and the
built CTOR { _1, _2 } isn't a GIMPLE value.

This kind of simplifications have to be done in forwprop (or would
need a match.pd syntax extension) where we can split out the CTOR
to a separate stmt.

The following disables this particular simplification when we are
simplifying GIMPLE.  With enhanced IL checking this otherwise
causes ICEs in the testsuite from vectorized code.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        * match.pd (BIT_FIELD_REF CONSTRUCTOR@0 @1 @2): Do not
        create a CTOR operand in the result when simplifying GIMPLE.
---
 gcc/match.pd | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index 34e1a5c1b46..c4320781f5b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -7456,10 +7456,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
                             ? type
                             : build_vector_type (TREE_TYPE (TREE_TYPE (ctor)),
                                                  count * k));
+             /* We used to build a CTOR in the non-constant case here
+                but that's not a GIMPLE value.  We'd have to expose this
+                operation somehow so the code generation can properly
+                split it out to a separate stmt.  */
              res = (constant_p ? build_vector_from_ctor (evtype, vals)
-                    : build_constructor (evtype, vals));
+                    : (GIMPLE ? NULL_TREE : build_constructor (evtype, vals)));
            }
-           (view_convert { res; }))))))
+           (if (res)
+            (view_convert { res; })))))))
       /* The bitfield references a single constructor element.  */
       (if (k.is_constant (&const_k)
           && idx + n <= (idx / const_k + 1) * const_k)
-- 
2.35.3

Reply via email to