Re: missed: not vectorized: relevant phi not supported: found_14 = PHI <found_5(7), -1(15)>

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marc,

On Thu, Oct 19, 2023 at 9:17 AM Marc Glisse <marc.glisse@xxxxxxxx> wrote:
>
> On Thu, 19 Oct 2023, Mathieu Malaterre via Gcc-help wrote:
>
> > After reading this SO post (*), I became curious as to what my gcc
> > would do with the following code. It turns out that I cannot make any
> > sense of the output:
> >
> > % gcc -fopt-info-missed -std=c11  -O3 -c generic.c
> > generic.c:4:21: missed: couldn't vectorize loop
> > generic.c:2:5: missed: not vectorized: relevant phi not supported:
> > found_14 = PHI <found_5(7), 0(15)>
>
> If you try again with a snapshot of gcc-14, it does vectorize, although
> the result doesn't seem as nice as what clang produces.
> (in general I would also suggest adding -march=native or some recent arch)
>
> > Doing a quick search did not reveal anything meaningful. If my
> > understanding is correct this is a basic information level (not meant
> > for GCC developers):
> >
> > * https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html#index-fopt-info
> >
> > So my question is: what should the following sentence indicates
> >
> > ...
> > missed: not vectorized: relevant phi not supported: found_14 = PHI
> > <found_5(7), -1(15)>
> > ...
>
> Some information is hard to translate to a user-understandable language
> that refers to source code, this deep in the optimization, although in
> this case the message is not very informative even for a gcc dev.
> -fdump-tree-vect-details generates a file with more information, but that
> can be hard to understand if you are not used to it.
>
> In this loop, some variables are 16 bits (haystack, needle), while the
> reduction variable is 32 bits, and gcc has a hard time vectorizing mixed
> sizes (and it doesn't realize that 'found' could be narrowed). If you
> declare 'found' as 'short' instead, something different happens.

Thanks very much for your answer, very helpful ! I was able to
vectorize a different piece of C code, just using your trick. The type
being reduced must be of the same type as the vector elements.

I still do not understand what `PHI`, `found_14` or `<found_5(7),
-1(15)>` refer to exactly, but I'll continue studying the *.vect
output.


> > % cat generic.c
> > #include <stdint.h>
> > int hasmatch(uint16_t needle, const uint16_t haystack[4]) {
> >  int found = 0;
> >  for (int i = 0; i < 4; ++i) {
> >    if (needle == haystack[i]) {
> >      found = 1;
> >    }
> >  }
> >  return found;
> > }
> >
> > (*) https://stackoverflow.com/questions/74803190/fastest-way-to-find-16bit-match-in-a-4-element-short-array
> >
> > Thanks !
>
> --
> Marc Glisse



--
Mathieu




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux