Message ID | 20160216103830.GP3017@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
On Tue, 16 Feb 2016, Jakub Jelinek wrote: > On Tue, Feb 16, 2016 at 11:06:53AM +0100, Richard Biener wrote: > > Hmm, I think it works in general, but I suspect that the pattern has > > to use the original def but for out analysis we have to look at the > > pattern. > > > > So another fix would be to simply fail if there was a pattern detected. > > That seems to work, sure. So is that ok if it passes bootstrap/regtest? Ok. Thanks, Richard. > 2016-02-15 Jakub Jelinek <jakub@redhat.com> > Richard Biener <rguenther@suse.de> > > PR tree-optimization/69820 > * tree-vect-patterns.c (type_conversion_p): Return false if > *orig_type is unsigned single precision or boolean. > (vect_recog_dot_prod_pattern, vect_recog_widen_mult_pattern): > Formatting fix. > > * gcc.dg/vect/pr69820.c: New test. > > --- gcc/tree-vect-patterns.c.jj 2016-02-15 22:22:45.958677390 +0100 > +++ gcc/tree-vect-patterns.c 2016-02-16 11:12:20.982147520 +0100 > @@ -171,6 +171,13 @@ type_conversion_p (tree name, gimple *us > if (!*def_stmt) > return false; > > + if (dt == vect_internal_def) > + { > + stmt_vec_info def_vinfo = vinfo_for_stmt (*def_stmt); > + if (STMT_VINFO_IN_PATTERN_P (def_vinfo)) > + return false; > + } > + > if (!is_gimple_assign (*def_stmt)) > return false; > > @@ -334,8 +341,8 @@ vect_recog_dot_prod_pattern (vec<gimple > stmt = last_stmt; > > if (type_conversion_p (oprnd0, stmt, true, &half_type, &def_stmt, > - &promotion) > - && promotion) > + &promotion) > + && promotion) > { > stmt = def_stmt; > oprnd0 = gimple_assign_rhs1 (stmt); > @@ -395,13 +402,13 @@ vect_recog_dot_prod_pattern (vec<gimple > || !types_compatible_p (TREE_TYPE (oprnd1), prod_type)) > return NULL; > if (!type_conversion_p (oprnd0, stmt, true, &half_type0, &def_stmt, > - &promotion) > - || !promotion) > + &promotion) > + || !promotion) > return NULL; > oprnd00 = gimple_assign_rhs1 (def_stmt); > if (!type_conversion_p (oprnd1, stmt, true, &half_type1, &def_stmt, > - &promotion) > - || !promotion) > + &promotion) > + || !promotion) > return NULL; > oprnd01 = gimple_assign_rhs1 (def_stmt); > if (!types_compatible_p (half_type0, half_type1)) > @@ -891,10 +898,10 @@ vect_recog_widen_mult_pattern (vec<gimpl > oprnd = &oprnd1; > } > > - tree old_oprnd = gimple_assign_rhs1 (def_stmt); > - tree new_oprnd = make_ssa_name (half_type0); > - new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd); > - *oprnd = new_oprnd; > + tree old_oprnd = gimple_assign_rhs1 (def_stmt); > + tree new_oprnd = make_ssa_name (half_type0); > + new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd); > + *oprnd = new_oprnd; > } > > /* Handle unsigned case. Look for > --- gcc/testsuite/gcc.dg/vect/pr69820.c.jj 2016-02-16 10:21:40.155236476 +0100 > +++ gcc/testsuite/gcc.dg/vect/pr69820.c 2016-02-16 10:21:40.155236476 +0100 > @@ -0,0 +1,35 @@ > +/* PR tree-optimization/69820 */ > + > +#include "tree-vect.h" > + > +unsigned int a[100]; > +long long int b[100]; > +unsigned short c[100]; > + > +__attribute__((noinline, noclone)) void > +foo (void) > +{ > + int i; > + for (i = 0; i < 100; ++i) > + b[i] = a[i] * (c[i] * (_Bool) c[i]); > +} > + > +int > +main () > +{ > + int i; > + if (__SIZEOF_INT__ * __CHAR_BIT__ != 32) > + return 0; > + check_vect (); > + for (i = 0; i < 100; ++i) > + { > + a[i] = 3489456818U; > + b[i] = 0x1eadbeefbeefdeadLL; > + c[i] = 38364; > + } > + foo (); > + for (i = 0; i < 100; ++i) > + if (b[i] != 0xed446af8U) > + __builtin_abort (); > + return 0; > +} > > Jakub > >
--- gcc/tree-vect-patterns.c.jj 2016-02-15 22:22:45.958677390 +0100 +++ gcc/tree-vect-patterns.c 2016-02-16 11:12:20.982147520 +0100 @@ -171,6 +171,13 @@ type_conversion_p (tree name, gimple *us if (!*def_stmt) return false; + if (dt == vect_internal_def) + { + stmt_vec_info def_vinfo = vinfo_for_stmt (*def_stmt); + if (STMT_VINFO_IN_PATTERN_P (def_vinfo)) + return false; + } + if (!is_gimple_assign (*def_stmt)) return false; @@ -334,8 +341,8 @@ vect_recog_dot_prod_pattern (vec<gimple stmt = last_stmt; if (type_conversion_p (oprnd0, stmt, true, &half_type, &def_stmt, - &promotion) - && promotion) + &promotion) + && promotion) { stmt = def_stmt; oprnd0 = gimple_assign_rhs1 (stmt); @@ -395,13 +402,13 @@ vect_recog_dot_prod_pattern (vec<gimple || !types_compatible_p (TREE_TYPE (oprnd1), prod_type)) return NULL; if (!type_conversion_p (oprnd0, stmt, true, &half_type0, &def_stmt, - &promotion) - || !promotion) + &promotion) + || !promotion) return NULL; oprnd00 = gimple_assign_rhs1 (def_stmt); if (!type_conversion_p (oprnd1, stmt, true, &half_type1, &def_stmt, - &promotion) - || !promotion) + &promotion) + || !promotion) return NULL; oprnd01 = gimple_assign_rhs1 (def_stmt); if (!types_compatible_p (half_type0, half_type1)) @@ -891,10 +898,10 @@ vect_recog_widen_mult_pattern (vec<gimpl oprnd = &oprnd1; } - tree old_oprnd = gimple_assign_rhs1 (def_stmt); - tree new_oprnd = make_ssa_name (half_type0); - new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd); - *oprnd = new_oprnd; + tree old_oprnd = gimple_assign_rhs1 (def_stmt); + tree new_oprnd = make_ssa_name (half_type0); + new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd); + *oprnd = new_oprnd; } /* Handle unsigned case. Look for --- gcc/testsuite/gcc.dg/vect/pr69820.c.jj 2016-02-16 10:21:40.155236476 +0100 +++ gcc/testsuite/gcc.dg/vect/pr69820.c 2016-02-16 10:21:40.155236476 +0100 @@ -0,0 +1,35 @@ +/* PR tree-optimization/69820 */ + +#include "tree-vect.h" + +unsigned int a[100]; +long long int b[100]; +unsigned short c[100]; + +__attribute__((noinline, noclone)) void +foo (void) +{ + int i; + for (i = 0; i < 100; ++i) + b[i] = a[i] * (c[i] * (_Bool) c[i]); +} + +int +main () +{ + int i; + if (__SIZEOF_INT__ * __CHAR_BIT__ != 32) + return 0; + check_vect (); + for (i = 0; i < 100; ++i) + { + a[i] = 3489456818U; + b[i] = 0x1eadbeefbeefdeadLL; + c[i] = 38364; + } + foo (); + for (i = 0; i < 100; ++i) + if (b[i] != 0xed446af8U) + __builtin_abort (); + return 0; +}