[prev in list] [next in list] [prev in thread] [next in thread] 

List:       llvm-bugs
Subject:    [llvm-bugs] [Bug 63602] Miscompilation in LoopVectorizer
From:       LLVM Bugs via llvm-bugs <llvm-bugs () lists ! llvm ! org>
Date:       2023-06-29 14:25:16
Message-ID: 20230629142516.30bc28a2ebb25cfe () email ! llvm ! org
[Download RAW message or body]

[Attachment #2 (text/html)]

<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/63602>63602</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Miscompilation in LoopVectorizer
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            vectorization
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          d-makogon
      </td>
    </tr>
</table>

<pre>
    Repro: https://godbolt.org/z/6MxeMx97G

The source IR is for the following code:
```java
int i = 1;
while ((i += 3) &lt; 383) {
  arr[i] = 1;
  arr[i - 1] &amp;= 1;
  arr[i] += 1;
}
```
The `arr` is filled with zeroes initially.
The program just stores `2` in each third element of the array starting from the \
index `4`. After the vectorizer pass however the part of the loop that is processed \
in the vector loop is filled with just ones.

The issue in the vector loop is the following:
First we load the elements for which we need to do the addition of `1` (corresponding \
to the line `arr[i] += 1`) into `%strided.vec3`. Then we store the ones into each \
third index: `store i32 1, ptr %21, align 4`;   `store i32 1, ptr %22, align 4`;   \
`...`. And then we do the addition of `1` to the **previously loaded** vector of \
values: `%54 = add &lt;8 x i32&gt; %strided.vec3, &lt;i32 1, i32 1, i32 1, i32 1, i32 \
1, i32 1, i32 1, i32 1&gt;`, and after that we perform the stores:  ```
%55 = extractelement &lt;8 x i32&gt; %54, i32 0
store i32 %55, ptr %21, align 4
```
```
%56 = extractelement &lt;8 x i32&gt; %54, i32 1
store i32 %56, ptr %22, align 4
```
...
So the issue is that the `+1` is done for the values that are loaded from the memory \
before the stores of `1`. So we end up storing `0+1=1` in each third index starting \
from 4. </pre>
<img width="1px" height="1px" alt="" \
src="http://email.email.llvm.org/o/eJykVVFv4jgQ_jXmZdQosUmAhzxAWU4n3b7sru7diSfEe04msg2 \
0_fUn2ylsabvS6SQExjMef_N9M2PpnD6OiDUrd6zcL-TJ92Rr9TDIf-hI46Ih9Vx_w8kSE1vovZ8cE1vGD4wfj \
qQaMj4je2T88ML4ofr6hF-fNqs_WL5n-TZ9_-gRHJ1si_DnN9AOOrLge4SOjKGLHo_QksIQNp2q8vT5Kc8yben \
RgwYm9lAwsUt7l14bBMbXjK81ML4LZsH4Bph4BLFOy9XsDSCtZeVOs3J_F-hqggcooplXn3gk6-6tla32d8Bve \
bMqD0erPOatjUEFF-17eEFL6ECP2mtpzHN2OzNZOlo5wM-T8-A8WXQhDo9RRkDZ9uB7bRWgwQFHD9RFPqW18hm \
cl9YHUjtLQ9zXo8KnEGLJqny-aNt5TCqcsfVk9QtamKRz0NMFz7NtkvYa3RBN4HvpQyqTpRadQxUQ3aIkp7tUY \
x40osvuq0I7d8JPIrwpkGttHLR1Hi4BjVTRZ-YgVdWl120fzCOiAk-gKDGjlPaaxpALq_IiUMn4uiVr0U00qsC \
XT75Gj1fd7iWv8lBUevQEcV06b7VClZ2xFTdyf_Q4BhRRvBg0pJ_O_SJf1CW0Favy5KoFh4LxR5i8BcZLHv9Io \
48jBPGY2AH8xp1_4p5l2S_Sj5G5iPA3_Mx0ML5lfDtZPGs6OfMcmUeVtl9Fow7O0pzQzdkwXpbL2GZSqdCPa3g \
KaJn4Aves8cfgcE3l_yzEl3j3I8hRgZwrXMZ6mdB2ZFM_pJ6KUD_q2wC-jODxyVvZ-tc2e5dHuXy9ez56kyUG- \
VTJD699j6L6jyiKj1BUnxbIR9eGSomL70n-uUVdItKnkcb4rphnmqIRrwM91UBylRbnUrkNogEHss_QYPfaF_N \
4u5VdBt8p6IWjgtMU7aE3WZWnW8W-eD8H04B7O_iW2ULVQm3ERi6wLqr1Ol-uV0W16OvVSqDabDayLKWSZbcsu \
kYpwbHBbi1Us9A1z7nIK74plrwsqkzkTcvXkmPT8LLtkC1zHKQ2mTHnIbx_i8hTXYkq5wsjGzQuPqmcD9q1NEz \
ayNBgLCrAOH-dutfdcr-wdQj30JyOji1zo513twu89gbrr2-iBRr-Ipr-vo7wxcma-u6V1r4_NVlLA-OHEG7-eZgs_cTWM36I4F14vwP-fwMAAP__06Jnbg">



[Attachment #3 (text/plain)]

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic