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 <ja...@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 > >