Diagnostic 15520: loop with multiple exits cannot be vectorized unless it meets search loop idiom criteria

ID 662792
Updated 5/2/2018
Version Latest
Public

author-image

By

This diagnostic message is emitted from Intel(R) C++ Compiler 15.0 and above

remark #15520: loop was not vectorized: loop with multiple exits cannot be vectorized unless it meets search loop idiom criteria

Cause:

More than one exit point in the loop. In most cases, a loop must have a single entry and a single exit point in order to be auto-vectorized. 

Example:

  int no_vec(float a[], float b[], float c[])
  {
        int i = 0.; 
        while (i < 100) { 
          a[i] = b[i] * c[i]; 
   //  this is a data-dependent exit condition: 
          if (a[i] < 0.0) 
             break; 
          ++i; 
        } 
        return i;
   } 

$   icc -c -qopt-report-file=stderr -qopt-report-phase=vec d15520.c
...
LOOP BEGIN at d15520.c(4,9)
   remark #15520: loop was not vectorized: loop with multiple exits cannot be vectorized unless it meets search loop idiom criteria   [ d15520.c(7,11) ]
LOOP END
===========================================================================

Workarounds:

Simple search loops are recognized by the compiler and can be vectorized if they are written as a "for" loop, e.g.:

int foo(float *a, int n){
  int i;
  for (i=0;i<n;i++){
    if (a[i] == 0){
      break;
    }
  }
  return i;
}

$   icc -c -qopt-report-file=stderr -qopt-report-phase=vec d15524.c
...
LOOP BEGIN at d15524.c(3,3)
   remark #15300: LOOP WAS VECTORIZED
LOOP END  

More complicated loops such as the original example can be vectorized using a "for" loop preceded by an OpenMP SIMD directive along with an early_exit clause:

int no_vec(float a[], float b[], float c[])
   {
        int i;
#pragma omp simd early_exit
        for(i=0; i<100; i++) {
          a[i] = b[i] * c[i];
   //  this is a data-dependent exit condition:
          if (a[i] < 0.0)
             break;
        }
        return i;
   }

$   icc -c -qopt-report-file=stderr -qopt-report-phase=vec d15520_b.c
...
LOOP BEGIN at d15520_b.c(5,13)
   remark #15301: OpenMP SIMD LOOP WAS VECTORIZED
LOOP END