This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RE: [Patch V2] Fix SLP PR58135.
- From: "Kumar, Venkataramanan" <Venkataramanan dot Kumar at amd dot com>
- To: Christophe Lyon <christophe dot lyon at linaro dot org>
- Cc: Richard Biener <richard dot guenther at gmail dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 25 May 2016 03:29:57 +0000
- Subject: RE: [Patch V2] Fix SLP PR58135.
- Authentication-results: sourceware.org; auth=none
- Authentication-results: linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=none action=none header.from=amd.com;
- References: <CY1PR1201MB10988F2DF32D1E853BCBC0EA8F480 at CY1PR1201MB1098 dot namprd12 dot prod dot outlook dot com> <CAFiYyc2yzmfD2ok-XdGD5d2_gmhJ9066fH4eSs7kSLHtM8pe8Q at mail dot gmail dot com> <CY1PR1201MB1098A879C8612260029E00CC8F490 at CY1PR1201MB1098 dot namprd12 dot prod dot outlook dot com> <CAFiYyc0f_fmeswU=4FEPPq8o5sv8BD5Bj46OOLtnmnWwGTBkJA at mail dot gmail dot com> <DM3PR1201MB110404C70435F21C6348B73C8F4E0 at DM3PR1201MB1104 dot namprd12 dot prod dot outlook dot com> <CAKdteOZEKLwYzQrVK2fM2zkNe7ctdDntuONdraxwASP86-+WyQ at mail dot gmail dot com>
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:23
Hi Christophe,
> -----Original Message-----
> From: Christophe Lyon [mailto:christophe.lyon@linaro.org]
> Sent: Tuesday, May 24, 2016 8:45 PM
> To: Kumar, Venkataramanan <Venkataramanan.Kumar@amd.com>
> Cc: Richard Biener <richard.guenther@gmail.com>; gcc-patches@gcc.gnu.org
> Subject: Re: [Patch V2] Fix SLP PR58135.
>
> Hi Venkat,
>
>
> On 23 May 2016 at 11:54, Kumar, Venkataramanan
> <Venkataramanan.Kumar@amd.com> wrote:
> > Hi Richard,
> >
> >> -----Original Message-----
> >> From: Richard Biener [mailto:richard.guenther@gmail.com]
> >> Sent: Thursday, May 19, 2016 4:08 PM
> >> To: Kumar, Venkataramanan <Venkataramanan.Kumar@amd.com>
> >> Cc: gcc-patches@gcc.gnu.org
> >> Subject: Re: [Patch V2] Fix SLP PR58135.
> >>
> >> On Wed, May 18, 2016 at 5:29 PM, Kumar, Venkataramanan
> >> <Venkataramanan.Kumar@amd.com> wrote:
> >> > Hi Richard,
> >> >
> >> >> -----Original Message-----
> >> >> From: Richard Biener [mailto:richard.guenther@gmail.com]
> >> >> Sent: Tuesday, May 17, 2016 5:40 PM
> >> >> To: Kumar, Venkataramanan <Venkataramanan.Kumar@amd.com>
> >> >> Cc: gcc-patches@gcc.gnu.org
> >> >> Subject: Re: [Patch V2] Fix SLP PR58135.
> >> >>
> >> >> On Tue, May 17, 2016 at 1:56 PM, Kumar, Venkataramanan
> >> >> <Venkataramanan.Kumar@amd.com> wrote:
> >> >> > Hi Richard,
> >> >> >
> >> >> > I created the patch by passing -b option to git. Now the patch
> >> >> > is more
> >> >> readable.
> >> >> >
> >> >> > As per your suggestion I tried to fix the PR by splitting the
> >> >> > SLP store group at
> >> >> vector boundary after the SLP tree is built.
> >> >> >
> >> >> > Boot strap PASSED on x86_64.
> >> >> > Checked the patch with check_GNU_style.sh.
> >> >> >
> >> >> > The gfortran.dg/pr46519-1.f test now does SLP vectorization.
> >> >> > Hence it
> >> >> generated 2 more vzeroupper.
> >> >> > As recommended I adjusted the test case by adding
> >> >> > -fno-tree-slp-vectorize
> >> >> to make it as expected after loop vectorization.
> >> >> >
> >> >> > The following tests are now passing.
> >> >> >
> >> >> > ------ Snip-----
> >> >> > Tests that now work, but didn't before:
> >> >> >
> >> >> > gcc.dg/vect/bb-slp-19.c -flto -ffat-lto-objects
> >> >> > scan-tree-dump-times
> >> >> > slp2 "basic block vectorized" 1
> >> >> >
> >> >> > gcc.dg/vect/bb-slp-19.c scan-tree-dump-times slp2 "basic block
> >> >> > vectorized" 1
> >> >> >
> >> >> > New tests that PASS:
> >> >> >
> >> >> > gcc.dg/vect/pr58135.c (test for excess errors)
> >> >> > gcc.dg/vect/pr58135.c -flto -ffat-lto-objects (test for excess
> >> >> > errors)
> >> >> >
> >> >> > ------ Snip-----
> >> >> >
> >> >> > ChangeLog
> >> >> >
> >> >> > 2016-05-14 Venkataramanan Kumar
> >> >> <Venkataramanan.kumar@amd.com>
> >> >> > PR tree-optimization/58135
> >> >> > * tree-vect-slp.c: When group size is not multiple of vector size,
> >> >> > allow splitting of store group at vector boundary.
> >> >> >
> >> >> > Test suite ChangeLog
> >> >> > 2016-05-14 Venkataramanan Kumar
> >> >> <Venkataramanan.kumar@amd.com>
> >> >> > * gcc.dg/vect/bb-slp-19.c: Remove XFAIL.
> >> >> > * gcc.dg/vect/pr58135.c: Add new.
> >> >> > * gfortran.dg/pr46519-1.f: Adjust test case.
> >> >> >
> >> >> > The attached patch Ok for trunk?
> >> >>
> >> >>
> >> >> Please avoid the excessive vertical space around the
> >> >> vect_build_slp_tree
> >> call.
> >> > Yes fixed in the attached patch.
> >> >>
> >> >> + /* Calculate the unrolling factor. */
> >> >> + unrolling_factor = least_common_multiple
> >> >> + (nunits, group_size) / group_size;
> >> >> ...
> >> >> + else
> >> >> {
> >> >> /* Calculate the unrolling factor based on the smallest type. */
> >> >> if (max_nunits > nunits)
> >> >> - unrolling_factor = least_common_multiple (max_nunits,
> group_size)
> >> >> - / group_size;
> >> >> + unrolling_factor
> >> >> + = least_common_multiple (max_nunits,
> >> >> + group_size)/group_size;
> >> >>
> >> >> please compute the "correct" unroll factor immediately and move
> >> >> the "unrolling of BB required" error into the if() case by
> >> >> post-poning the nunits < group_size check (and use max_nunits here).
> >> >>
> >> > Yes fixed in the attached patch.
> >> >
> >> >> + if (is_a <bb_vec_info> (vinfo)
> >> >> + && nunits < group_size
> >> >> + && unrolling_factor != 1
> >> >> + && is_a <bb_vec_info> (vinfo))
> >> >> + {
> >> >> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> >> >> + "Build SLP failed: store group "
> >> >> + "size not a multiple of the vector size "
> >> >> + "in basic block SLP\n");
> >> >> + /* Fatal mismatch. */
> >> >> + matches[nunits] = false;
> >> >>
> >> >> this is too pessimistic - you want to add the extra 'false' at
> >> >> group_size / max_nunits * max_nunits.
> >> > Yes fixed in attached patch.
> >> >
> >> >>
> >> >> It looks like you leak 'node' in the if () path as well. You need
> >> >>
> >> >> vect_free_slp_tree (node);
> >> >> loads.release ();
> >> >>
> >> >> thus treat it as a failure case.
> >> >
> >> > Yes fixed. I added an else part before scalar_stmts.release call
> >> > for the case
> >> when SLP tree is not built. This avoids double freeing.
> >> > Bootstrapped and reg tested on X86_64.
> >> >
>
> This patch is causing regressions on armeb:
> http://people.linaro.org/~christophe.lyon/cross-
> validation/gcc/trunk/236591/report-build-info.html
> The following fortran tests now fail at runtime:
>
> gfortran.dg/c_f_pointer_logical.f03 -O3 -fomit-frame-pointer
> -funroll-loops -fpeel-loops -ftracer -finline-functions execution test
> gfortran.dg/c_f_pointer_logical.f03 -O3 -g execution test
> gfortran.dg/intrinsic_pack_1.f90 -O3 -fomit-frame-pointer
> -funroll-loops -fpeel-loops -ftracer -finline-functions execution test
> gfortran.dg/intrinsic_pack_1.f90 -O3 -g execution test
>
> Can you have a look?
>
Sure. I will take a look.
> Thanks,
>
> Christophe.
>
>
>
> >> > Ok for trunk ?
> >>
> >> + /*Calculate the unrolling factor based on the smallest type. */
> >> + unrolling_factor
> >>
> >> Space after /* missing.
> >>
> >> + unrolling_factor
> >> + = least_common_multiple (max_nunits, group_size)/group_size;
> >>
> >> spaces before/after the '/'
> >>
> >> + if (max_nunits > nunits
> >> + && unrolling_factor != 1
> >> + && is_a <bb_vec_info> (vinfo))
> >> {
> >> if (dump_enabled_p ())
> >> - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> >> - "Build SLP failed: unrolling required in basic"
> >> - " block SLP\n");
> >> + dump_printf_loc (MSG_MISSED_OPTIMIZATION,
> >> + vect_location,
> >> + "Build SLP failed: unrolling "
> >> + "required in basic block SLP\n");
> >> vect_free_slp_tree (node);
> >> loads.release ();
> >> return false;
> >> }
> >>
> >> + if (is_a <bb_vec_info> (vinfo)
> >> + && max_nunits < group_size
> >> + && unrolling_factor != 1)
> >>
> >> please merge these. I think you have a not covered case of
> >> max_nunits == nunits, max_nunits > group_size.
> >> So do
> >>
> >> if (unrolling_factor != 1
> >> && is_a <...>)
> >> {
> >> if (max_nunits >= group_size)
> >> {
> >> first error
> >> }
> >> ... signal fatal mismatch instead...
> >> }
> >> else
> >> {
> >>
> >> Ok with that change.
> >
> > Thank you for the review. I updated and patch and up streamed it to trunk.
> > Ref: https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=236582
> >
> > Regards,
> > Venkat.
Regards,
Venkat.