On Fri, Mar 4, 2016 at 11:06 AM, Jakub Jelinek <ja...@redhat.com> wrote: > On Fri, Mar 04, 2016 at 10:59:48AM +0100, Uros Bizjak wrote: >> I don't like the fact that *dynamic_check is set to max (which is 0 >> with your testcase) when recursion avoidance code already set it to >> "something reasonable", together with loop_1_byte alg. What do you >> think about attached (lightly tested) patch? > > But that can still set *dynamic_check to 0 if the recursive call has > not set *dynamic_check. > So, perhaps we want *dynamic_check = max ? max : 128; > ?
I believe that recursive call set *dynamic_check to zero for a reason. The sent patch deals with recursion breaking issues only, leaving all other functionality as it was before. So, your issue is IMO orthogonal to the PR70062 and should be fixed (if at all) in a separate patch. Uros. > >> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c >> index 8a026ae..ded9951 100644 >> --- a/gcc/config/i386/i386.c >> +++ b/gcc/config/i386/i386.c >> @@ -26170,11 +26170,22 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT >> expected_size, >> } >> alg = decide_alg (count, new_expected_size, min_size, max_size, >> memset, >> zero_memset, have_as, dynamic_check, noalign); >> - gcc_assert (*dynamic_check == -1); >> + >> if (TARGET_INLINE_STRINGOPS_DYNAMICALLY) >> - *dynamic_check = max; >> + { >> + /* *dynamic_check could be set to 128 above because we avoided >> + infinite recursion. */ >> + if (*dynamic_check == 128) >> + gcc_assert (alg == loop_1_byte); >> + else >> + { >> + gcc_assert (*dynamic_check == -1); >> + *dynamic_check = max; >> + } >> + } >> else >> - gcc_assert (alg != libcall); >> + gcc_assert (alg != libcall && *dynamic_check == -1); >> + >> return alg; >> } >> return (alg_usable_p (algs->unknown_size, memset, have_as) > > > Jakub