Hi!

We shouldn't copy the inbranch artificial argument.  Also,
if clone_info->inbranch, then inbranch_specified is necessarily true,
thus (i & 1) will be always 0 and in that case we still need room for the
extra argument.

Committed to trunk.

2014-02-04  Jakub Jelinek  <ja...@redhat.com>

        PR other/58712
        * omp-low.c (simd_clone_struct_copy): If from->inbranch
        is set, copy one less argument.
        (expand_simd_clones): Don't subtract clone_info->inbranch
        from simd_clone_struct_alloc argument.

--- gcc/omp-low.c.jj    2014-01-29 12:43:24.000000000 +0100
+++ gcc/omp-low.c       2014-02-03 17:46:40.667922617 +0100
@@ -10660,7 +10660,8 @@ simd_clone_struct_copy (struct cgraph_si
                        struct cgraph_simd_clone *from)
 {
   memcpy (to, from, (sizeof (struct cgraph_simd_clone)
-                    + from->nargs * sizeof (struct cgraph_simd_clone_arg)));
+                    + ((from->nargs - from->inbranch)
+                       * sizeof (struct cgraph_simd_clone_arg))));
 }
 
 /* Return vector of parameter types of function FNDECL.  This uses
@@ -11694,7 +11695,6 @@ expand_simd_clones (struct cgraph_node *
          if (i != 0)
            {
              clone = simd_clone_struct_alloc (clone_info->nargs
-                                              - clone_info->inbranch
                                               + ((i & 1) != 0));
              simd_clone_struct_copy (clone, clone_info);
              /* Undo changes targetm.simd_clone.compute_vecsize_and_simdlen

        Jakub

Reply via email to