On Mon, 2015-12-07 at 19:17 +0100, Richard Biener wrote: > On December 7, 2015 6:21:36 PM GMT+01:00, Bill Schmidt > <wschm...@linux.vnet.ibm.com> wrote: > >Hi Richi, > > > >I was afraid this would break X86. Unfortunately, your proposed patch > >didn't change any output for me. Still seeing 6 and 8 instances of > >"pattern recognized", unfortunately. > > > Hmm, can you open a PR and attach vectorizer dumps?
PR68776. Thanks! Bill > > Thanks, > Richard. > >Bill > > > >On Mon, 2015-12-07 at 11:50 +0100, Richard Biener wrote: > >> On Fri, Dec 4, 2015 at 8:51 PM, Bill Schmidt > >> <wschm...@linux.vnet.ibm.com> wrote: > >> > Since r226675, we have been seeing these failures: > >> > > >> > FAIL: gcc.dg/vect/vect-widen-mult-const-s16.c -flto > >-ffat-lto-objects > >> > scan-tree-dump-times vect "pattern recognized" 2 > >> > FAIL: gcc.dg/vect/vect-widen-mult-const-s16.c scan-tree-dump-times > >vect > >> > "pattern recognized" 2 > >> > FAIL: gcc.dg/vect/vect-widen-mult-const-u16.c -flto > >-ffat-lto-objects > >> > scan-tree-dump-times vect "pattern recognized" 2 > >> > FAIL: gcc.dg/vect/vect-widen-mult-const-u16.c scan-tree-dump-times > >vect > >> > "pattern recognized" 2 > >> > > >> > Comparing the vect-details dumps from r226674 to r226675, I see > >these as > >> > the reason: > >> > > >> > 63a64,66 > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:16:3: > >note: vect_recog_mult_pattern: detected: > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:16:3: > >note: patt_47 = _6 << 2; > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:16:3: > >note: pattern recognized: patt_47 = _6 << 2; > >> > 70a74,76 > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:16:3: > >note: vect_recog_mult_pattern: detected: > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:16:3: > >note: patt_40 = _6 << 1; > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:16:3: > >note: pattern recognized: patt_40 = _6 << 1; > >> > > >> > 747a754,756 > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:31:3: > >note: vect_recog_mult_pattern: detected: > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:31:3: > >note: patt_47 = _6 << 2; > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:31:3: > >note: pattern recognized: patt_47 = _6 << 2; > >> > 754a764,766 > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:31:3: > >note: vect_recog_mult_pattern: detected: > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:31:3: > >note: patt_40 = _6 << 1; > >> >> > >/home/wschmidt/gcc/gcc-mainline-base/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c:31:3: > >note: pattern recognized: patt_40 = _6 << 1; > >> > > >> > These seems precisely what's expected, given the nature of the > >patch, > >> > which is looking for these opportunities. So it's likely that we > >should > >> > just change > >> > > >> > /* { dg-final { scan-tree-dump-times "pattern recognized" 2 > >> > "vect" { target vect_widen_mult_hi_to_si_pattern } } } */ > >> > > >> > to > >> > > >> > /* { dg-final { scan-tree-dump-times "pattern recognized" 6 > >> > "vect" { target vect_widen_mult_hi_to_si_pattern } } } */ > >> > > >> > and similarly for the unsigned case. The following patch does > >this. > >> > However, I wanted to run this by Venkat since this was apparently > >not > >> > detected when his patch went in. This doesn't appear to be a > >> > target-specific issue, and most targets support > >> > vect_widen_mult_hi_to_si_pattern, so I'm not sure why this wasn't > >fixed > >> > with the original patch. Will this change break on any other > >targets > >> > for some reason? > >> > > >> > Tested on powerpc64le-unknown-linux-gnu. Ok for trunk? > >> > >> Hmm. That will FAIL on x86_64 though because it can handle > >multiplication > >> natively. I think the pattern recognition is simply bogus as it > >fails to detect > >> the stmt is already part of the widen-mult pattern? In fact, pattern > >> recognition > >> looping over all pattern functions even if one already matched on the > >very > >> same stmt looks bogus to me. > >> > >> Does the (untested) > >> > >> Index: gcc/tree-vect-patterns.c > >> =================================================================== > >> --- gcc/tree-vect-patterns.c (revision 231357) > >> +++ gcc/tree-vect-patterns.c (working copy) > >> @@ -3791,7 +3791,7 @@ vect_mark_pattern_stmts (gimple *orig_st > >> This function also does some bookkeeping, as explained in the > >documentation > >> for vect_recog_pattern. */ > >> > >> -static void > >> +static bool > >> vect_pattern_recog_1 (vect_recog_func_ptr vect_recog_func, > >> gimple_stmt_iterator si, > >> vec<gimple *> *stmts_to_replace) > >> @@ -3809,7 +3809,7 @@ vect_pattern_recog_1 (vect_recog_func_pt > >> stmts_to_replace->quick_push (stmt); > >> pattern_stmt = (* vect_recog_func) (stmts_to_replace, &type_in, > >&type_out); > >> if (!pattern_stmt) > >> - return; > >> + return false; > >> > >> stmt = stmts_to_replace->last (); > >> stmt_info = vinfo_for_stmt (stmt); > >> @@ -3831,13 +3831,13 @@ vect_pattern_recog_1 (vect_recog_func_pt > >> /* Check target support */ > >> type_in = get_vectype_for_scalar_type (type_in); > >> if (!type_in) > >> - return; > >> + return false; > >> if (type_out) > >> type_out = get_vectype_for_scalar_type (type_out); > >> else > >> type_out = type_in; > >> if (!type_out) > >> - return; > >> + return false; > >> pattern_vectype = type_out; > >> > >> if (is_gimple_assign (pattern_stmt)) > >> @@ -3853,7 +3853,7 @@ vect_pattern_recog_1 (vect_recog_func_pt > >> if (!optab > >> || (icode = optab_handler (optab, vec_mode)) == > >CODE_FOR_nothing > >> || (insn_data[icode].operand[0].mode != TYPE_MODE > >(type_out))) > >> - return; > >> + return false; > >> } > >> > >> /* Found a vectorizable pattern. */ > >> @@ -3892,6 +3892,8 @@ vect_pattern_recog_1 (vect_recog_func_pt > >> > >> vect_mark_pattern_stmts (stmt, pattern_stmt, NULL_TREE); > >> } > >> + > >> + return true; > >> } > >> > >> > >> @@ -4005,8 +4007,9 @@ vect_pattern_recog (vec_info *vinfo) > >> for (j = 0; j < NUM_PATTERNS; j++) > >> { > >> vect_recog_func = vect_vect_recog_func_ptrs[j]; > >> - vect_pattern_recog_1 (vect_recog_func, si, > >> - &stmts_to_replace); > >> + if (vect_pattern_recog_1 (vect_recog_func, si, > >> + &stmts_to_replace)) > >> + break; > >> } > >> } > >> } > >> @@ -4026,8 +4029,9 @@ vect_pattern_recog (vec_info *vinfo) > >> for (j = 0; j < NUM_PATTERNS; j++) > >> { > >> vect_recog_func = vect_vect_recog_func_ptrs[j]; > >> - vect_pattern_recog_1 (vect_recog_func, si, > >> - &stmts_to_replace); > >> + if (vect_pattern_recog_1 (vect_recog_func, si, > >> + &stmts_to_replace)) > >> + break; > >> } > >> } > >> } > >> > >> help? > >> > >> Richard. > >> > >> > Thanks, > >> > Bill > >> > > >> > > >> > [gcc/testsuite] > >> > > >> > 2015-12-04 Bill Schmidt <wschm...@linux.vnet.ibm.com> > >> > > >> > * gcc.dg/vect/vect-widen-mult-const-s16.c: Change number of > >> > occurrences of "pattern recognized" to 6. > >> > * gcc.dg/vect/vect-widen-mult-const-u16.c: Likewise. > >> > > >> > > >> > Index: gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c > >> > =================================================================== > >> > --- gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c > >(revision 231278) > >> > +++ gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c > >(working copy) > >> > @@ -56,5 +56,5 @@ int main (void) > >> > > >> > /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" > >{ target vect_widen_mult_hi_to_si } } } */ > >> > /* { dg-final { scan-tree-dump-times > >"vect_recog_widen_mult_pattern: detected" 2 "vect" { target > >vect_widen_mult_hi_to_si_pattern } } } */ > >> > -/* { dg-final { scan-tree-dump-times "pattern recognized" 2 "vect" > >{ target vect_widen_mult_hi_to_si_pattern } } } */ > >> > +/* { dg-final { scan-tree-dump-times "pattern recognized" 6 "vect" > >{ target vect_widen_mult_hi_to_si_pattern } } } */ > >> > > >> > Index: gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c > >> > =================================================================== > >> > --- gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c > >(revision 231278) > >> > +++ gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c > >(working copy) > >> > @@ -73,4 +73,4 @@ int main (void) > >> > > >> > /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" > >{ target vect_widen_mult_hi_to_si } } } */ > >> > /* { dg-final { scan-tree-dump-times > >"vect_recog_widen_mult_pattern: detected" 2 "vect" { target > >vect_widen_mult_hi_to_si_pattern } } } */ > >> > -/* { dg-final { scan-tree-dump-times "pattern recognized" 2 "vect" > >{ target vect_widen_mult_hi_to_si_pattern } } } */ > >> > +/* { dg-final { scan-tree-dump-times "pattern recognized" 8 "vect" > >{ target vect_widen_mult_hi_to_si_pattern } } } */ > >> > > >> > > >> > > >> > > >> > >