On Fri, Mar 11, 2016 at 3:01 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Fri, Mar 11, 2016 at 5:50 AM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Fri, Mar 11, 2016 at 5:19 AM, Richard Biener >> <richard.guent...@gmail.com> wrote: >>> On Fri, Mar 11, 2016 at 2:02 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Fri, Mar 11, 2016 at 4:58 AM, Richard Biener >>>> <richard.guent...@gmail.com> wrote: >>>>> On Fri, Mar 11, 2016 at 1:47 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>> On Fri, Mar 11, 2016 at 2:06 AM, Richard Biener >>>>>> <richard.guent...@gmail.com> wrote: >>>>>>> On Fri, Mar 11, 2016 at 4:10 AM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>>>> On Thu, Mar 10, 2016 at 7:03 PM, Jeff Law <l...@redhat.com> wrote: >>>>>>>>> On 03/10/2016 08:00 PM, H.J. Lu wrote: >>>>>>>>>> >>>>>>>>>> On Thu, Mar 10, 2016 at 1:30 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>> On Thu, Mar 10, 2016 at 1:24 PM, Jeff Law <l...@redhat.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>> On 03/10/2016 01:18 PM, Richard Biener wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On March 10, 2016 6:02:58 PM GMT+01:00, "H.J. Lu" >>>>>>>>>>>>> <hjl.to...@gmail.com> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Thu, Mar 10, 2016 at 6:57 AM, H.J. Lu <hjl.to...@gmail.com> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Thu, Mar 10, 2016 at 5:49 AM, Jakub Jelinek >>>>>>>>>>>>>>> <ja...@redhat.com> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Thu, Mar 10, 2016 at 05:43:27AM -0800, H.J. Lu wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> free_dominance_info (CDI_DOMINATORS); >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Since convert_scalars_to_vector may add instructions, >>>>>>>>>>>>>>>>> dominance >>>>>>>>>>>>>>>>> info is no longer up to date. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Adding instructions doesn't change anything on the dominance >>>>>>>>>>>>>>>> info, >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> just >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> cfg manipulations that don't keep the dominators updated. >>>>>>>>>>>>>>>> You can try to verify the dominance info at the end of the stv >>>>>>>>>>>>>>>> pass, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I added >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> verify_dominators (CDI_DOMINATORS); >>>>>>>>>>>>>>> ' >>>>>>>>>>>>>>> It did trigger assert in my 64-bit STV pass in 64-bit libgcc >>>>>>>>>>>>>>> build: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> /export/gnu/import/git/sources/gcc/libgcc/config/libbid/bid128_fma.c: >>>>>>>>>>>>>>> In function \u2018add_and_round.constprop\u2019: >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> /export/gnu/import/git/sources/gcc/libgcc/config/libbid/bid128_fma.c:629:1: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> error: dominator of 158 should be 107, not 101 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I will investigate. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Here is the problem: >>>>>>>>>>>>>> >>>>>>>>>>>>>> 1. I extended the STV pass to 64-bit to convert TI load/store to >>>>>>>>>>>>>> V1TI load/store to use SSE load/store for 128-bit load/store. >>>>>>>>>>>>>> 2. The 64-bit STV pass generates settings of CONST0_RTX and >>>>>>>>>>>>>> CONSTM1_RTX to store 128-bit 0 and -1. >>>>>>>>>>>>>> 3. I placed the 64-bit STV pass before the CSE pass so that >>>>>>>>>>>>>> CONST0_RTX and CONSTM1_RTX generated by the STV pass >>>>>>>>>>>>>> can be CSEed. >>>>>>>>>>>>>> 4. After settings of CONST0_RTX and CONSTM1_RTX are CSEed, >>>>>>>>>>>>>> dominance info will be wrong. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Can't see how cse can ever invalidate dominators. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> cse can simplify jumps which can invalidate dominance information. >>>>>>>>>>>> >>>>>>>>>>>> But cse-ing CONST0_RTX and CONSTM1_RTX shouldn't invalidate >>>>>>>>>>>> dominators, >>>>>>>>>>>> that's just utter nonsense -- ultimately it has to come down to >>>>>>>>>>>> changing >>>>>>>>>>>> jumps. ISTM HJ has more digging to do here. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Not just CONST0_RTX and CONSTM1_RTX. The new STV >>>>>>>>>>> pass changes mode of SET from TImode to V1TImode which >>>>>>>>>>> exposes more opportunities to CSE. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> What I did is equivalent to >>>>>>>>>> >>>>>>>>>> diff --git a/gcc/cse.c b/gcc/cse.c >>>>>>>>>> index 2665d9a..43202a1 100644 >>>>>>>>>> --- a/gcc/cse.c >>>>>>>>>> +++ b/gcc/cse.c >>>>>>>>>> @@ -7644,7 +7644,11 @@ public: >>>>>>>>>> return optimize > 0 && flag_rerun_cse_after_loop; >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> - virtual unsigned int execute (function *) { return >>>>>>>>>> rest_of_handle_cse2 >>>>>>>>>> (); } >>>>>>>>>> + virtual unsigned int execute (function *) >>>>>>>>>> + { >>>>>>>>>> + calculate_dominance_info (CDI_DOMINATORS); >>>>>>>>>> + return rest_of_handle_cse2 (); >>>>>>>>>> + } >>>>>>>>>> >>>>>>>>>> }; // class pass_cse2 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> which leads to the same ICE: >>>>>>>>> >>>>>>>>> But you haven't done the proper analysis to understand why the >>>>>>>>> dominance >>>>>>>>> relationships have changed. Nothing of the changes you've outlined >>>>>>>>> in your >>>>>>>>> messages should invalidate the dominance information. >>>>>>>> >>>>>>>> Nothing is changed. Just calling >>>>>>>> >>>>>>>> calculate_dominance_info (CDI_DOMINATORS); >>>>>>>> >>>>>>>> before rest_of_handle_cse2 will lead to ICE. >>>>>>> >>>>>>> Well, so CSE2 invalidates dominators but fails to free them when >>>>>>> necessary. >>>>>>> Please figure out the CSE transform that invalidates them and free >>>>>>> dominators >>>>>>> there. >>>>>> >>>>>> I can give it a try. But I'd like to first ask since CSE2 never calls >>>>>> calculate_dominance_info (CDI_DOMINATORS), does it need to >>>>>> keep dominators valid? >>>>> >>>>> If it doesn't free them then yes. >>>>> >>>>>> free_dominance_info (CDI_DOMINATORS); >>>>>> >>>>>> at beginning will do the job. >>>>> >>>>> Of course. But that may be not always necessary and thus cause extra >>>>> dominance compute for the next user. >>>> >>>> Do we need to both CDI_DOMINATORS and CDI_POST_DOMINATORS >>>> valid? >>> >>> CDI_POST_DOMINATORS is required to be freed by passes. >>> >> >> This works for me. Should I submit a patch? >> >> H.J. >> --- >> diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c >> index 62b0596..1307e22 100644 >> --- a/gcc/cfgrtl.c >> +++ b/gcc/cfgrtl.c >> @@ -228,7 +228,11 @@ delete_insn_and_edges (rtx_insn *insn) >> purge = true; >> delete_insn (insn); >> if (purge) >> - purge_dead_edges (BLOCK_FOR_INSN (insn)); >> + { >> + purge_dead_edges (BLOCK_FOR_INSN (insn)); >> + if (dom_info_available_p (CDI_DOMINATORS)) >> + free_dominance_info (CDI_DOMINATORS); >> + } >> } >> >> /* Unlink a chain of insns between START and FINISH, leaving notes > > Or should do it in purge_dead_edges?
If it does purge any edge, yes, and you can free unconditonally w/o checking if it is available. Richard. > -- > H.J.