<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 - [LoopVectorize] LV miscompiles loop by incorrect reordering of stores"
   href="https://bugs.llvm.org/show_bug.cgi?id=40291">40291</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[LoopVectorize] LV miscompiles loop by incorrect reordering of stores
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </td>
        </tr>

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

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

        <tr>
          <th>OS</th>
          <td>Windows NT
          </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>new bugs
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>max.kazantsev@azul.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=21315" name="attach_21315" title="simple.ll">attachment 21315</a> <a href="attachment.cgi?id=21315&action=edit" title="simple.ll">[details]</a></span>
simple.ll

Loop Vectorizer manages to emit vector stores and scatters in wrong sequence,
that leads to miscompile. To reproduce, download the attached IR and run

opt -loop-vectorize -S simple.ll

The initial loop makes the following operation 3 times:
1. Load x from memory;
2. Store (x + 1) to this memory;
3. if (x < 1), store 0 to this memory.

Initially the memory is filled with zeros, so the condition in 3. is always
true. Therefore, after these steps the memory should also be filled with zeros.

After vectorization, we see the following pattern (I omit the instructions that
are irrelevant):

vector.body:                                      ; preds = %vector.body,
%vector.ph
...
  call void @llvm.masked.scatter.v16i32.v16p0i32(<16 x i32> zeroinitializer,
<16 x i32*> %25, i32 4, <16 x i1> %30), !alias.scope !0, !noalias !3
...
  call void @llvm.masked.scatter.v16i32.v16p0i32(<16 x i32> zeroinitializer,
<16 x i32*> %35, i32 4, <16 x i1> %44), !alias.scope !0, !noalias !3
...
  store <48 x i32> %interleaved.vec, <48 x i32>* %50, align 4
...
  call void @llvm.masked.scatter.v16i32.v16p0i32(<16 x i32> zeroinitializer,
<16 x i32*> %46, i32 4, <16 x i1> %66), !alias.scope !0, !noalias !3

The store corresponds to vector store of (x + 1) for all array elements, and
scatters correspond to masked store of zeroes to some elements where it is
required (effectively, in all elements). So the right sequence would be to
store non-zero vector first and then do scatter of zeros (3 times). The
vectorizer does 2 scatters before the store, therefore 2/3 of the memory cells
are not zeroed properly.</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>