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] Don't handle CAST_RESTRICT (PR tree-optimization/49279)


On Thu, 6 Oct 2011, Jakub Jelinek wrote:

> Hi!
> 
> CAST_RESTRICT based disambiguation unfortunately isn't reliable,
> e.g. to store a non-restrict pointer into a restricted field,
> we add a non-useless cast to restricted pointer in the gimplifier,
> and while we don't consider that field to have a special restrict tag
> because it is unsafe to do so, we unfortunately create it for the
> CAST_RESTRICT before that and end up with different restrict tags
> for the same thing.  See the PR for more details.
> 
> This patch turns off CAST_RESTRICT handling for now, in the future
> we might try to replace it by explicit CAST_RESTRICT stmts in some form,
> but need to solve problems with multiple inlined copies of the same function
> with restrict arguments or restrict variables in it and intermixed code from
> them (or similarly code from different non-overlapping source blocks).
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 4.6 too?

Ok for trunk.  Ok for 4.6 with the tree-ssa.c change omitted -
and the stmt folding patch applied.

Thanks,
Richard.

> 2011-10-06  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/49279
> 	* tree-ssa-structalias.c (find_func_aliases): Don't handle
> 	CAST_RESTRICT.
> 	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Allow
> 	restrict propagation.
> 	* tree-ssa.c (useless_type_conversion_p): Don't return false
> 	if TYPE_RESTRICT differs.
> 
> 	* gcc.dg/tree-ssa/restrict-4.c: XFAIL.
> 	* gcc.c-torture/execute/pr49279.c: New test.
> 
> --- gcc/tree-ssa-structalias.c.jj	2011-10-04 10:18:29.000000000 +0200
> +++ gcc/tree-ssa-structalias.c	2011-10-05 12:43:42.000000000 +0200
> @@ -4494,15 +4494,6 @@ find_func_aliases (gimple origt)
>  	  && (!in_ipa_mode
>  	      || DECL_EXTERNAL (lhsop) || TREE_PUBLIC (lhsop)))
>  	make_escape_constraint (rhsop);
> -      /* If this is a conversion of a non-restrict pointer to a
> -	 restrict pointer track it with a new heapvar.  */
> -      else if (gimple_assign_cast_p (t)
> -	       && POINTER_TYPE_P (TREE_TYPE (rhsop))
> -	       && POINTER_TYPE_P (TREE_TYPE (lhsop))
> -	       && !TYPE_RESTRICT (TREE_TYPE (rhsop))
> -	       && TYPE_RESTRICT (TREE_TYPE (lhsop)))
> -	make_constraint_from_restrict (get_vi_for_tree (lhsop),
> -				       "CAST_RESTRICT");
>      }
>    /* Handle escapes through return.  */
>    else if (gimple_code (t) == GIMPLE_RETURN
> --- gcc/tree-ssa-forwprop.c.jj	2011-10-04 14:36:00.000000000 +0200
> +++ gcc/tree-ssa-forwprop.c	2011-10-05 12:46:32.000000000 +0200
> @@ -804,11 +804,6 @@ forward_propagate_addr_expr_1 (tree name
>        && ((rhs_code == SSA_NAME && rhs == name)
>  	  || CONVERT_EXPR_CODE_P (rhs_code)))
>      {
> -      /* Don't propagate restrict pointer's RHS.  */
> -      if (TYPE_RESTRICT (TREE_TYPE (lhs))
> -	  && !TYPE_RESTRICT (TREE_TYPE (name))
> -	  && !is_gimple_min_invariant (def_rhs))
> -	return false;
>        /* Only recurse if we don't deal with a single use or we cannot
>  	 do the propagation to the current statement.  In particular
>  	 we can end up with a conversion needed for a non-invariant
> --- gcc/tree-ssa.c.jj	2011-09-15 12:18:54.000000000 +0200
> +++ gcc/tree-ssa.c	2011-10-05 12:44:52.000000000 +0200
> @@ -1270,12 +1270,6 @@ useless_type_conversion_p (tree outer_ty
>  	  != TYPE_ADDR_SPACE (TREE_TYPE (inner_type)))
>  	return false;
>  
> -      /* Do not lose casts to restrict qualified pointers.  */
> -      if ((TYPE_RESTRICT (outer_type)
> -	   != TYPE_RESTRICT (inner_type))
> -	  && TYPE_RESTRICT (outer_type))
> -	return false;
> -
>        /* If the outer type is (void *), the conversion is not necessary.  */
>        if (VOID_TYPE_P (TREE_TYPE (outer_type)))
>  	return true;
> --- gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c.jj	2011-10-04 14:33:08.000000000 +0200
> +++ gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c	2011-10-05 16:22:33.232433231 +0200
> @@ -22,5 +22,5 @@ bar (int *x, int y)
>    return p1[y];
>  }
>  
> -/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */
> +/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" { xfail *-*-* } } } */
>  /* { dg-final { cleanup-tree-dump "optimized" } } */
> --- gcc/testsuite/gcc.c-torture/execute/pr49279.c.jj	2011-10-05 13:32:43.087670846 +0200
> +++ gcc/testsuite/gcc.c-torture/execute/pr49279.c	2011-10-05 13:32:43.087670846 +0200
> @@ -0,0 +1,35 @@
> +/* PR tree-optimization/49279 */
> +extern void abort (void);
> +
> +struct S { int a; int *__restrict p; };
> +
> +__attribute__((noinline, noclone))
> +struct S *bar (struct S *p)
> +{
> +  struct S *r;
> +  asm volatile ("" : "=r" (r) : "0" (p) : "memory");
> +  return r;
> +}
> +
> +__attribute__((noinline, noclone))
> +int
> +foo (int *p, int *q)
> +{
> +  struct S s, *t;
> +  s.a = 1;
> +  s.p = p;
> +  t = bar (&s);
> +  t->p = q;
> +  s.p[0] = 0;
> +  t->p[0] = 1;
> +  return s.p[0];
> +}
> +
> +int
> +main ()
> +{
> +  int a, b;
> +  if (foo (&a, &b) != 1)
> +    abort ();
> +  return 0;
> +}
> 
> 	Jakub
> 
> 


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