This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, rtl] Fix PR84878: Segmentation fault in add_cross_iteration_register_deps
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Peter Bergner <bergner at vnet dot ibm dot com>
- Cc: Alexander Monakov <amonakov at ispras dot ru>, Richard Biener <rguenther at suse dot de>, GCC Patches <gcc-patches at gcc dot gnu dot org>, Jakub Jelinek <jakub at redhat dot com>, Jeff Law <law at redhat dot com>, Zhuykov Roman <zhroma at ispras dot ru>
- Date: Tue, 3 Apr 2018 11:40:18 -0700
- Subject: Re: [PATCH, rtl] Fix PR84878: Segmentation fault in add_cross_iteration_register_deps
- References: <3fed01b9-845b-3de0-7603-1dcd4080af70@vnet.ibm.com> <alpine.LSU.2.20.1803271006280.18265@zhemvz.fhfr.qr> <eb0da7c9-dc2e-91fa-570b-93014faaacf5@vnet.ibm.com> <alpine.LSU.2.20.1803271519240.18265@zhemvz.fhfr.qr> <alpine.LNX.2.20.13.1804021654590.23034@monopod.intra.ispras.ru> <65f52d29-d694-6dd8-bc27-29f2f6f25da2@vnet.ibm.com>
On Tue, Apr 3, 2018 at 11:36 AM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> On 4/2/18 9:21 AM, Alexander Monakov wrote:
>> On Tue, 27 Mar 2018, Richard Biener wrote:
>>> If they only appear in the exit/entry block ignoring them should be safe.
>>>
>>> But who knows...
>>
>> Roman and I discussed a related problem a few weeks ago, so here's my 2c.
>> As I don't have any special DF knowledge, this is merely my understanding.
>>
>> (apropos i: SMS uses sched-deps for intra-loop deps, and then separately uses
>> DF for cross-iteration deps, which means that it should be ready for surprises
>> when the two scanners are not 100% in sync)
>>
>> (apropos ii: given the flexibility of RTL, it would have been really nice
>> if there were no implicit cc0-like uses that need to be special-cased in DF,
>> sched-deps and other scanners)
>>
>> In this case I believe it's fine to skip processing of r_use when the associated
>> BB is not the loop BB (i.e. 'if (DF_REF_BB (r_use->ref) != g->bb)' as Richard
>> suggested), but I'm concerned that skipping it when the artificial's use BB
>> corresponds to loop BB goes from ICE to wrong-code. It should be detected
>> earlier, in sms_schedule (see the comment starting with "Don't handle BBs with
>> calls or barriers").
>
> Ok, getting back to this, I see the r_use->ref for the global reg that
> is exposed all the way to the exit block is marked as artificial, so
> DF_REF_IS_ARTIFICIAL (r_use->ref) is true. So using richi and Alexander's
> suggestion of DF_REF_BB(), I cobbled the change below. I added an assert
> to catch any cases where the artificial use is the same as g->bb or where
> we still might have no insn info. I never hit the assert in either my
> bootstrap or in my testsuite runs. Is something like the following what
> we want?
>
> This did pass bootstrap and regtesting with no regressions on powerpc64-linux
> running the testsuite in both 32-bit and 64-bit modes.
>
> Peter
>
>
> gcc/
> PR rtl-optimization/84878
> * ddg.c (add_cross_iteration_register_deps): Use DF_REF_BB to determine
> the basic block. Assert the use reference is not artificial and that
> it has an associated insn.
>
> gcc/testsuite/
> PR rtl-optimization/84878
> * gcc.dg/pr84878.c: New test.
Wrong test filename.
>
> Index: gcc/ddg.c
> ===================================================================
> --- gcc/ddg.c (revision 258802)
> +++ gcc/ddg.c (working copy)
> @@ -295,11 +295,14 @@ add_cross_iteration_register_deps (ddg_p
> /* Create inter-loop true dependences and anti dependences. */
> for (r_use = DF_REF_CHAIN (last_def); r_use != NULL; r_use = r_use->next)
> {
> - rtx_insn *use_insn = DF_REF_INSN (r_use->ref);
> -
> - if (BLOCK_FOR_INSN (use_insn) != g->bb)
> + if (DF_REF_BB (r_use->ref) != g->bb)
> continue;
>
> + gcc_assert (!DF_REF_IS_ARTIFICIAL (r_use->ref)
> + && DF_REF_INSN_INFO (r_use->ref) != NULL);
> +
> + rtx_insn *use_insn = DF_REF_INSN (r_use->ref);
> +
> /* ??? Do not handle uses with DF_REF_IN_NOTE notes. */
> use_node = get_node_of_insn (g, use_insn);
> gcc_assert (use_node);
> Index: gcc/testsuite/gcc.target/powerpc/pr84878.c
> ===================================================================
> --- gcc/testsuite/gcc.target/powerpc/pr84878.c (revision 0)
> +++ gcc/testsuite/gcc.target/powerpc/pr84878.c (working copy)
> @@ -0,0 +1,18 @@
> +/* PR target/84878 */
> +/* { dg-do compile } */
> +/* { dg-require-effective-target powerpc_altivec_ok } */
> +/* { dg-options "-O2 -maltivec -mno-vsx -fmodulo-sched -ftree-vectorize -funroll-loops -fassociative-math -fno-signed-zeros -fno-trapping-math" } */
> +
> +int ek;
> +float zu;
> +
> +int
> +k5 (int ks)
> +{
> + while (ek < 1)
> + {
> + ks += (int)(0x1000000 + zu + !ek);
> + ++ek;
> + }
> + return ks;
> +}
>
--
H.J.