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

            Bug ID: 120164
           Summary: GCC fails vectorization when using conditional
                    __builtin_prefetch
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
                CC: rguenth at gcc dot gnu.org, tnfchris at gcc dot gnu.org,
                    victorldn at gcc dot gnu.org
        Depends on: 114061
            Blocks: 53947, 120162
  Target Milestone: ---

+++ This bug was initially created as a clone of Bug #114061 +++

The following example:

void foo(double * restrict a, double * restrict b, int n){
  int i;
  for(i=0; i<n; ++i){
    if (i % 1024 == 0)
      __builtin_prefetch(&(b[i+1024]));
    a[i] = a[i] + b[i];
  }
}

fails to vectorize because of the __builtin_prefetch block.

/app/example.cpp:3:13: note:   using as main loop exit: 6 -> 11 [AUX: (nil)]
/app/example.cpp:3:13: missed:   not vectorized: unsupported control flow in
loop.
/app/example.cpp:3:13: missed:  bad loop form.
/app/example.cpp:3:13: missed: couldn't vectorize loop
/app/example.cpp:3:13: missed: not vectorized: unsupported control flow in
loop.
/app/example.cpp:1:6: note: vectorized 0 loops in function.

However:
prefetching are usually hints anyway and not a correctness thing.  It should be
safe to elide the call and vectorizer as normal.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53947
[Bug 53947] [meta-bug] vectorizer missed-optimizations
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114061
[Bug 114061] GCC fails vectorization when using __builtin_prefetch
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120162
[Bug 120162] Prefetch causes vectorization to fail

Reply via email to