Message ID | 20111219135927.GD1957@tyan-ft48-01.lab.bos.redhat.com |
---|---|
State | New |
Headers | show |
On Mon, 19 Dec 2011, Jakub Jelinek wrote: > Hi! > > When I've switched STMT_VINFO_PATTERN_DEF_STMT into > a gimple_seq STMT_VINFO_PATTERN_DEF_SEQ, I've been using > gimplify_seq_add_stmt and/or gimple_seq_alloc_with_stmt > to populate the sequences. While the former is right > for this case and doesn't mark the stmt being added for updating, > the latter calls gimple_seq_add_stmt which does what > gimplify_seq_add_stmt does, but additionally marks the stmt > for updating. As I'm using the gimple_seq sequences for > the pattern defs just as containers for multiple statements, > it is undesirable to update those. > > The following patch fixes it, bootstrapped/regtested on x86_64-linux > and i686-linux. Richard had on IRC issues with the > gimplify_seq_add_stmt name, I'll send a patch for that as a follow-up. > Ok for trunk? Ok. Thanks, Richard. > 2011-12-19 Jakub Jelinek <jakub@redhat.com> > > PR middle-end/51590 > PR tree-optimization/51606 > * tree-vect-patterns.c (append_pattern_def_seq, new_pattern_def_seq): > New inline functions. > (vect_recog_over_widening_pattern, > vect_recog_vector_vector_shift_pattern, > vect_recog_sdivmod_pow2_pattern, vect_recog_mixed_size_cond_pattern, > adjust_bool_pattern_cast, vect_recog_bool_pattern): Use them. > > * gcc.dg/vect/pr51590.c: New test. > > --- gcc/tree-vect-patterns.c.jj 2011-12-16 08:37:45.000000000 +0100 > +++ gcc/tree-vect-patterns.c 2011-12-19 10:18:34.443847675 +0100 > @@ -70,6 +70,19 @@ static vect_recog_func_ptr vect_vect_rec > vect_recog_mixed_size_cond_pattern, > vect_recog_bool_pattern}; > > +static inline void > +append_pattern_def_seq (stmt_vec_info stmt_info, gimple stmt) > +{ > + gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_info), stmt); > +} > + > +static inline void > +new_pattern_def_seq (stmt_vec_info stmt_info, gimple stmt) > +{ > + STMT_VINFO_PATTERN_DEF_SEQ (stmt_info) = NULL; > + append_pattern_def_seq (stmt_info, stmt); > +} > + > /* Function widened_name_p > > Check whether NAME, an ssa-name used in USE_STMT, > @@ -1146,8 +1159,7 @@ vect_recog_over_widening_pattern (VEC (g > = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), var, > op0, op1); > STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt)) = pattern_stmt; > - STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (stmt)) > - = gimple_seq_alloc_with_stmt (new_def_stmt); > + new_pattern_def_seq (vinfo_for_stmt (stmt), new_def_stmt); > > if (vect_print_dump_info (REPORT_DETAILS)) > { > @@ -1559,8 +1571,7 @@ vect_recog_vector_vector_shift_pattern ( > def = vect_recog_temp_ssa_var (TREE_TYPE (oprnd0), NULL); > def_stmt = gimple_build_assign_with_ops (NOP_EXPR, def, oprnd1, > NULL_TREE); > - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) > - = gimple_seq_alloc_with_stmt (def_stmt); > + new_pattern_def_seq (stmt_vinfo, def_stmt); > } > > /* Pattern detected. */ > @@ -1688,14 +1699,12 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi > build_int_cst (itype, > 1)), > build_int_cst (itype, 0)); > - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) > - = gimple_seq_alloc_with_stmt (def_stmt); > + new_pattern_def_seq (stmt_vinfo, def_stmt); > var = vect_recog_temp_ssa_var (itype, NULL); > def_stmt > = gimple_build_assign_with_ops (PLUS_EXPR, var, oprnd0, > gimple_assign_lhs (def_stmt)); > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > > pattern_stmt > = gimple_build_assign_with_ops (RSHIFT_EXPR, > @@ -1715,8 +1724,7 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi > = gimple_build_assign_with_ops3 (COND_EXPR, signmask, cond, > build_int_cst (itype, 1), > build_int_cst (itype, 0)); > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > } > else > { > @@ -1736,8 +1744,7 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi > def_stmt_vinfo = new_stmt_vec_info (def_stmt, loop_vinfo, NULL); > set_vinfo_for_stmt (def_stmt, def_stmt_vinfo); > STMT_VINFO_VECTYPE (def_stmt_vinfo) = vecutype; > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > var = vect_recog_temp_ssa_var (utype, NULL); > def_stmt > = gimple_build_assign_with_ops (RSHIFT_EXPR, var, > @@ -1746,21 +1753,18 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi > def_stmt_vinfo = new_stmt_vec_info (def_stmt, loop_vinfo, NULL); > set_vinfo_for_stmt (def_stmt, def_stmt_vinfo); > STMT_VINFO_VECTYPE (def_stmt_vinfo) = vecutype; > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > signmask = vect_recog_temp_ssa_var (itype, NULL); > def_stmt > = gimple_build_assign_with_ops (NOP_EXPR, signmask, var, > NULL_TREE); > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > } > def_stmt > = gimple_build_assign_with_ops (PLUS_EXPR, > vect_recog_temp_ssa_var (itype, NULL), > oprnd0, signmask); > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > def_stmt > = gimple_build_assign_with_ops (BIT_AND_EXPR, > vect_recog_temp_ssa_var (itype, NULL), > @@ -1769,8 +1773,7 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi > oprnd1, > build_int_cst (itype, > 1))); > - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), > - def_stmt); > + append_pattern_def_seq (stmt_vinfo, def_stmt); > > pattern_stmt > = gimple_build_assign_with_ops (MINUS_EXPR, > @@ -1896,8 +1899,7 @@ vect_recog_mixed_size_cond_pattern (VEC > vect_recog_temp_ssa_var (type, NULL), > gimple_assign_lhs (def_stmt), NULL_TREE); > > - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) > - = gimple_seq_alloc_with_stmt (def_stmt); > + new_pattern_def_seq (stmt_vinfo, def_stmt); > def_stmt_info = new_stmt_vec_info (def_stmt, loop_vinfo, NULL); > set_vinfo_for_stmt (def_stmt, def_stmt_info); > STMT_VINFO_VECTYPE (def_stmt_info) = vecitype; > @@ -1994,8 +1996,7 @@ adjust_bool_pattern_cast (tree type, tre > > gcc_assert (!STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo)); > pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo); > - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) > - = gimple_seq_alloc_with_stmt (pattern_stmt); > + new_pattern_def_seq (stmt_vinfo, pattern_stmt); > cast_stmt > = gimple_build_assign_with_ops (NOP_EXPR, > vect_recog_temp_ssa_var (type, NULL), > @@ -2304,8 +2305,7 @@ vect_recog_bool_pattern (VEC (gimple, he > tree rhs2 = vect_recog_temp_ssa_var (TREE_TYPE (lhs), NULL); > gimple cast_stmt > = gimple_build_assign_with_ops (NOP_EXPR, rhs2, rhs, NULL_TREE); > - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) > - = gimple_seq_alloc_with_stmt (cast_stmt); > + new_pattern_def_seq (stmt_vinfo, cast_stmt); > rhs = rhs2; > } > pattern_stmt > --- gcc/testsuite/gcc.dg/vect/pr51590.c.jj 2011-12-19 10:16:49.615452251 +0100 > +++ gcc/testsuite/gcc.dg/vect/pr51590.c 2011-12-19 10:16:42.000000000 +0100 > @@ -0,0 +1,35 @@ > +/* PR middle-end/51590 */ > +/* { dg-do compile } */ > + > +struct S { long a, b; }; > + > +extern void baz (char *); > + > +static void > +bar (struct S *x) > +{ > + char c[8]; > + int i; > + > + for (i = 0; i < 8; i++) > + c[i] = x->a >> ((7 - i) * 8); > + > + baz (c); > +} > + > +void > +foo (const char *x, struct S *y) > +{ > + struct S d = *y; > + int i; > + > + for (i = 0; *x; x++) > + i++; > + > + if (i != 1) > + return; > + > + bar (&d); > +} > + > +/* { dg-final { cleanup-tree-dump "vect" } } */ > > Jakub > >
> 2011-12-19 Jakub Jelinek <jakub@redhat.com> > > PR middle-end/51590 > PR tree-optimization/51606 > * tree-vect-patterns.c (append_pattern_def_seq, new_pattern_def_seq): > New inline functions. > (vect_recog_over_widening_pattern, > vect_recog_vector_vector_shift_pattern, > vect_recog_sdivmod_pow2_pattern, vect_recog_mixed_size_cond_pattern, > adjust_bool_pattern_cast, vect_recog_bool_pattern): Use them. This has very likely fixed PR tree-optimization/51580 as well. Thanks. I've added the Ada testcase to the testsuite. 2011-12-19 Eric Botcazou <ebotcazou@adacore.com> PR tree-optimization/51580 * gnat.dg/specs/loop_optimization1.ads: New test. * gnat.dg/specs/loop_optimization1_pkg.ad[sb]: New helper.
--- gcc/tree-vect-patterns.c.jj 2011-12-16 08:37:45.000000000 +0100 +++ gcc/tree-vect-patterns.c 2011-12-19 10:18:34.443847675 +0100 @@ -70,6 +70,19 @@ static vect_recog_func_ptr vect_vect_rec vect_recog_mixed_size_cond_pattern, vect_recog_bool_pattern}; +static inline void +append_pattern_def_seq (stmt_vec_info stmt_info, gimple stmt) +{ + gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_info), stmt); +} + +static inline void +new_pattern_def_seq (stmt_vec_info stmt_info, gimple stmt) +{ + STMT_VINFO_PATTERN_DEF_SEQ (stmt_info) = NULL; + append_pattern_def_seq (stmt_info, stmt); +} + /* Function widened_name_p Check whether NAME, an ssa-name used in USE_STMT, @@ -1146,8 +1159,7 @@ vect_recog_over_widening_pattern (VEC (g = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), var, op0, op1); STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt)) = pattern_stmt; - STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (stmt)) - = gimple_seq_alloc_with_stmt (new_def_stmt); + new_pattern_def_seq (vinfo_for_stmt (stmt), new_def_stmt); if (vect_print_dump_info (REPORT_DETAILS)) { @@ -1559,8 +1571,7 @@ vect_recog_vector_vector_shift_pattern ( def = vect_recog_temp_ssa_var (TREE_TYPE (oprnd0), NULL); def_stmt = gimple_build_assign_with_ops (NOP_EXPR, def, oprnd1, NULL_TREE); - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) - = gimple_seq_alloc_with_stmt (def_stmt); + new_pattern_def_seq (stmt_vinfo, def_stmt); } /* Pattern detected. */ @@ -1688,14 +1699,12 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi build_int_cst (itype, 1)), build_int_cst (itype, 0)); - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) - = gimple_seq_alloc_with_stmt (def_stmt); + new_pattern_def_seq (stmt_vinfo, def_stmt); var = vect_recog_temp_ssa_var (itype, NULL); def_stmt = gimple_build_assign_with_ops (PLUS_EXPR, var, oprnd0, gimple_assign_lhs (def_stmt)); - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); pattern_stmt = gimple_build_assign_with_ops (RSHIFT_EXPR, @@ -1715,8 +1724,7 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi = gimple_build_assign_with_ops3 (COND_EXPR, signmask, cond, build_int_cst (itype, 1), build_int_cst (itype, 0)); - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); } else { @@ -1736,8 +1744,7 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi def_stmt_vinfo = new_stmt_vec_info (def_stmt, loop_vinfo, NULL); set_vinfo_for_stmt (def_stmt, def_stmt_vinfo); STMT_VINFO_VECTYPE (def_stmt_vinfo) = vecutype; - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); var = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign_with_ops (RSHIFT_EXPR, var, @@ -1746,21 +1753,18 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi def_stmt_vinfo = new_stmt_vec_info (def_stmt, loop_vinfo, NULL); set_vinfo_for_stmt (def_stmt, def_stmt_vinfo); STMT_VINFO_VECTYPE (def_stmt_vinfo) = vecutype; - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); signmask = vect_recog_temp_ssa_var (itype, NULL); def_stmt = gimple_build_assign_with_ops (NOP_EXPR, signmask, var, NULL_TREE); - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); } def_stmt = gimple_build_assign_with_ops (PLUS_EXPR, vect_recog_temp_ssa_var (itype, NULL), oprnd0, signmask); - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); def_stmt = gimple_build_assign_with_ops (BIT_AND_EXPR, vect_recog_temp_ssa_var (itype, NULL), @@ -1769,8 +1773,7 @@ vect_recog_sdivmod_pow2_pattern (VEC (gi oprnd1, build_int_cst (itype, 1))); - gimplify_seq_add_stmt (&STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo), - def_stmt); + append_pattern_def_seq (stmt_vinfo, def_stmt); pattern_stmt = gimple_build_assign_with_ops (MINUS_EXPR, @@ -1896,8 +1899,7 @@ vect_recog_mixed_size_cond_pattern (VEC vect_recog_temp_ssa_var (type, NULL), gimple_assign_lhs (def_stmt), NULL_TREE); - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) - = gimple_seq_alloc_with_stmt (def_stmt); + new_pattern_def_seq (stmt_vinfo, def_stmt); def_stmt_info = new_stmt_vec_info (def_stmt, loop_vinfo, NULL); set_vinfo_for_stmt (def_stmt, def_stmt_info); STMT_VINFO_VECTYPE (def_stmt_info) = vecitype; @@ -1994,8 +1996,7 @@ adjust_bool_pattern_cast (tree type, tre gcc_assert (!STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo)); pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo); - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) - = gimple_seq_alloc_with_stmt (pattern_stmt); + new_pattern_def_seq (stmt_vinfo, pattern_stmt); cast_stmt = gimple_build_assign_with_ops (NOP_EXPR, vect_recog_temp_ssa_var (type, NULL), @@ -2304,8 +2305,7 @@ vect_recog_bool_pattern (VEC (gimple, he tree rhs2 = vect_recog_temp_ssa_var (TREE_TYPE (lhs), NULL); gimple cast_stmt = gimple_build_assign_with_ops (NOP_EXPR, rhs2, rhs, NULL_TREE); - STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) - = gimple_seq_alloc_with_stmt (cast_stmt); + new_pattern_def_seq (stmt_vinfo, cast_stmt); rhs = rhs2; } pattern_stmt --- gcc/testsuite/gcc.dg/vect/pr51590.c.jj 2011-12-19 10:16:49.615452251 +0100 +++ gcc/testsuite/gcc.dg/vect/pr51590.c 2011-12-19 10:16:42.000000000 +0100 @@ -0,0 +1,35 @@ +/* PR middle-end/51590 */ +/* { dg-do compile } */ + +struct S { long a, b; }; + +extern void baz (char *); + +static void +bar (struct S *x) +{ + char c[8]; + int i; + + for (i = 0; i < 8; i++) + c[i] = x->a >> ((7 - i) * 8); + + baz (c); +} + +void +foo (const char *x, struct S *y) +{ + struct S d = *y; + int i; + + for (i = 0; *x; x++) + i++; + + if (i != 1) + return; + + bar (&d); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */