https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118817

--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> ---
Thanks - I can reproduce even on trunk, will test & push the following
incremental fix.

diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
index 06f6b0ccd72..f6074111043 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -2604,13 +2604,18 @@ vn_nary_build_or_lookup (gimple_match_op *res_op)
 tree
 vn_nary_simplify (vn_nary_op_t nary)
 {
-  if (nary->length > gimple_match_op::MAX_NUM_OPS)
+  if (nary->length > gimple_match_op::MAX_NUM_OPS
+      /* For CONSTRUCTOR the vn_nary_op_t and gimple_match_op representation
+        does not match.  */
+      || nary->code == CONSTRUCTOR)
     return NULL_TREE;
   gimple_match_op op (gimple_match_cond::UNCOND, nary->opcode,
                      nary->type, nary->length);
   memcpy (op.ops, nary->op, sizeof (tree) * nary->length);
   tree res = vn_nary_build_or_lookup_1 (&op, false, true);
-  if (op.code.is_tree_code () && op.num_ops <= nary->length)
+  if (op.code.is_tree_code ()
+      && op.num_ops <= nary->length
+      && (tree_code) op.code != CONSTRUCTOR)
     {
       nary->opcode = (tree_code) op.code;
       nary->length = op.num_ops;

Reply via email to