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? free_dominance_info (CDI_DOMINATORS); at beginning will do the job. -- H.J.