<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Loop with "# pragma clang loop interleave (enable)" is not interleaved"
   href="https://bugs.llvm.org/show_bug.cgi?id=47667">47667</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Loop with "# pragma clang loop interleave (enable)" is not interleaved
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Loop Optimizer
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>fj8765ah@aa.jp.fujitsu.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>If you write "# pragma loop interleave (enable)" and "# pragma loop vectorize
(enable)" on the loop, the behavior is the same.
The reason is that they both create metadata like this:.

!8 = !{!"llvm.loop.vectorize.enable", i1 true}

Users will write these pragmas if they want to vectorize or interleave.
However, if "# pragma clang loop interleave (enable)" is specified, it is not
interleaved.
I think it should be interleaved. What do you think?

I think we should do one of the following two things.
* When the metadata described above exists, apply both vectorization and
interleaving.
* Create and control separate metadata for each.

It seems that interleaving is not controlled by the pragma but controlled by
the -funroll-loops option.

By the way, "# pragma clang loop interleave (disable)" is controlled by the
following metadata, so there is no problem.

!25 = !{!"llvm.loop.interleave.count", i32 1}


- interleave.c :
void foo(double * restrict a,
         double * restrict b,
         double * restrict c,
         int n) {

#pragma clang loop interleave(enable)
  for (int i=0;i<n;i++)
    c[i] = a[i] + b[i];

  return;
}

$ clang -O1 interleave.c -Rpass=loop-vector -S -Rpass-analysis=loop-vector
interleave.c:7:3: remark: the cost-model indicates that interleaving is
beneficial but is explicitly disabled or interleave count is set to 1
      [-Rpass-analysis=loop-vectorize]
  for (int i=0;i<n;i++)
  ^
interleave.c:7:3: remark: vectorized loop (vectorization width: 2, interleaved
count: 1) [-Rpass=loop-vectorize] 
$ clang -O1 interleave.c -Rpass=loop-vector -S -funroll-loops
interleave.c:7:3: remark: vectorized loop (vectorization width: 2, interleaved
count: 2) [-Rpass=loop-vectorize]
  for (int i=0;i<n;i++)
  ^

- vectorize.c :
void foo(double * restrict a,
         double * restrict b,
         double * restrict c,
         int n) {

#pragma clang loop vectorize(enable)
  for (int i=0;i<n;i++)
    c[i] = a[i] + b[i];

  return;
}

$ clang -O1 vectorize.c -Rpass=loop-vector -S -Rpass-analysis=loop-vector
vectorize.c:7:3: remark: the cost-model indicates that interleaving is
beneficial but is explicitly disabled or interleave count is set to 1
      [-Rpass-analysis=loop-vectorize]
  for (int i=0;i<n;i++)
  ^
vectorize.c:7:3: remark: vectorized loop (vectorization width: 2, interleaved
count: 1) [-Rpass=loop-vectorize] 
$ clang -O1 vectorize.c -Rpass=loop-vector -S -funroll-loops
vectorize.c:7:3: remark: vectorized loop (vectorization width: 2, interleaved
count: 2) [-Rpass=loop-vectorize]
  for (int i=0;i<n;i++)
  ^</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>