<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/78960>78960</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[sve] A redundant csel instruction for overflow check
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vfdff
</td>
</tr>
</table>
<pre>
* test: https://gcc.godbolt.org/z/jde11xv53
```
void mset (int *a, long long num) {
for (long long i=0; i< num; i++)
a[i] = 2;
}
```
* gcc: before the loop body
```
mset:
cmp x1, 0
ble .L1
mov x2, 0
cntw x3
whilelo p7.s, xzr, x1
mov z31.s, #2
```
* llvm: before the loop body
```
mset: // @mset
cmp x1, #1
b.lt .LBB0_3
cntw x8
mov z0.s, #2 // =0x2
mov x10, xzr
subs x9, x1, x8
csel x9, xzr, x9, lo ---> this is redundant compare to gcc ??
whilelo p0.s, xzr, x1
```
* the above redundant csel is used to check the overflow of **loop iv**, but it seems not necessary.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8VN2OozoMfhpzYxUlTjuUCy7o9nC173DEjynZE0hFAtOdpz9K6M5MR52VogTifLG_z45r5_RlYi7gcILDOakXP9i5WPuu75PGdr8LoBI9Ow-qxMH7qwNVAlVA1aVt04vtGmt8aucLUPUGVP3qWMrbelAgziBKeBH3EX9XqzscHXsEOuopLGUN9AONnS7bNC0jUI6QnTYIIvZ2Duc_zmhQZwHqFD5-RET8plMc-TsQsYbDScPhjKDOSKDul0J2fhrffaYSL20bKDfc25nRD4zG2isGTfApNLAK2my-2_Ea_d9kYCc-RYSIjeG4pj_lo2G064aiJ6h28q94U4-br4M2bCxes9QFzO1tjss3F78puZ0DUvRcASrRmHX8jvzfuONWGAh7EXcew39QBEh9CbFJjcf05-kk_lVPiAfk8RtS4oPTewjqLG70jbpS_JHqwe6WxkV7fpcwzH98to7NJ-Nd5nyr3WDY7Xag_kE_aIfa4czdMnX15BFbO17roKMNVYWgqjC2a9_zJ57m70lyQjbqxq784CJEpx0ujrvgpx24_S8etSvPvbGvaPvw2IDKmEq9bj_BWbN41B4d8-hwsh4nbtm5ev6dJl2hulzldcKFzMQhJ1IyS4ai4ZcmPzaZrFVXq5x6VrXa8yFTqudj3ye6IEF7IYmklEeVpaoTTXbsJSu5bzvJsBc81tqkodpCA0m0cwsX2TF_EYmpGzYutiWiiV8xGoEodKm5CJhds1wc7IXRzruPW7z2JvYzt3J4-OUnnTaZJufnpfXaTrGzvCsURUuW2RRfGp32w9KkrR2Bqvg2tmV3ne0vbj1QFaNzQFWM_v8AAAD___FBeTE">