This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Remove unnecessary VLA restriction in copy_forbidden (PR middle-end/42874)


On Wed, 27 Jan 2010, Jakub Jelinek wrote:

> Hi!
> 
> As mentioned in the PR, this check has been added many years ago when
> tree-inline.c didn't handle VL type remapping properly.
> GCC until 4.4 has been ignoring this restriction for always_inline
> functions, and inlining them successfully, and OpenMP code remaps such types
> for years as well.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2010-01-27  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR middle-end/42874
> 	* tree-inline.c (cannot_copy_type_1): Removed.
> 	(copy_forbidden): Don't forbid copying of functions containing
> 	records/unions with variable length fields.
> 
> 	* gcc.dg/vla-22.c: New test.
> 
> --- gcc/tree-inline.c.jj	2010-01-20 13:58:18.000000000 +0100
> +++ gcc/tree-inline.c	2010-01-27 09:52:55.000000000 +0100
> @@ -2730,39 +2730,6 @@ has_label_address_in_static_1 (tree *nod
>    return NULL_TREE;
>  }
>  
> -/* Callback through walk_tree.  Determine if we've got an aggregate
> -   type that we can't support; return non-null if so.  */
> -
> -static tree
> -cannot_copy_type_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
> -                    void *data ATTRIBUTE_UNUSED)
> -{
> -  tree t, node = *nodep;
> -
> -  if (TREE_CODE (node) == RECORD_TYPE || TREE_CODE (node) == UNION_TYPE)
> -    {
> -      /* We cannot inline a function of the form
> -
> -	   void F (int i) { struct S { int ar[i]; } s; }
> -
> -	 Attempting to do so produces a catch-22.
> -	 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
> -	 UNION_TYPE nodes, then it goes into infinite recursion on a
> -	 structure containing a pointer to its own type.  If it doesn't,
> -	 then the type node for S doesn't get adjusted properly when
> -	 F is inlined.
> -
> -	 ??? This is likely no longer true, but it's too late in the 4.0
> -	 cycle to try to find out.  This should be checked for 4.1.  */
> -      for (t = TYPE_FIELDS (node); t; t = TREE_CHAIN (t))
> -	if (variably_modified_type_p (TREE_TYPE (t), NULL))
> -	  return node;
> -    }
> -
> -  return NULL_TREE;
> -}
> -
> -
>  /* Determine if the function can be copied.  If so return NULL.  If
>     not return a string describng the reason for failure.  */
>  
> @@ -2805,16 +2772,6 @@ copy_forbidden (struct function *fun, tr
>  		      "address of local label in a static variable");
>  	  goto fail;
>  	}
> -
> -      if (!TREE_STATIC (decl) && !DECL_EXTERNAL (decl)
> -	  && variably_modified_type_p (TREE_TYPE (decl), NULL)
> -	  && walk_tree_without_duplicates (&TREE_TYPE (decl),
> -					   cannot_copy_type_1, NULL))
> -	{
> -	  reason = G_("function %q+F can never be copied "
> -		      "because it uses variable sized variables");
> -	  goto fail;
> -	}
>      }
>  
>   fail:
> --- gcc/testsuite/gcc.dg/vla-22.c.jj	2010-01-27 10:00:54.000000000 +0100
> +++ gcc/testsuite/gcc.dg/vla-22.c	2010-01-27 10:03:46.000000000 +0100
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +extern void bar (int *);
> +
> +static inline __attribute__((always_inline))
> +int
> +foo (int i)
> +{
> +  struct S {
> +    int ar[1][i];
> +  } s;
> +
> +  s.ar[0][0] = 0;
> +  bar (&s.ar[0][0]);
> +}
> +
> +void
> +baz (int i)
> +{
> +  foo (i + 2);
> +}
> 
> 	Jakub
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]