https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86173

--- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> There's also the following weak heuristic that might kick in if
> CONSTRUCTOR_NO_CLEARING would be set:
> 
>         else if (num_ctor_elements - num_nonzero_elements
>                  > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
>                  && num_nonzero_elements < num_ctor_elements / 4)
>           /* If there are "lots" of zeros, it's more efficient to clear
>              the memory and then set the nonzero elements.  */
>           cleared = true;
> 
> with CONSTRUCTOR_NO_CLEARING this heuristic is off by not honoring
> the constructor elements being not present (but for the testcase it
> doesn't matter).  CCing Eric for this specific issue (not the C++ one).

Ugh.  I didn't write this but, yes, there is an oversight, the check on the
flag should probably be on entry instead:

  if (CONSTRUCTOR_NO_CLEARING (ctor))
    cleared = false;
  else if (int_size_in_bytes (TREE_TYPE (ctor)) < 0)
   ...
  else if

Reply via email to