<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62311>62311</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
SimplifyCFG fails to merge all == -1 into a single block
</td>
</tr>
<tr>
<th>Labels</th>
<td>
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
https://gcc.godbolt.org/z/vn1v37Ger
```c
#include <x86intrin.h>
bool allones(__m512i x) {
return
x[0] == -1 && x[1] == -1 &&
x[2] == -1 && x[3] == -1 &&
x[4] == -1 && x[5] == -1 &&
x[6] == -1 && x[7] == -1;
}
```
Branched off from #59998 - all but the last comparisons are merged into the same basic block, preventing vectorization.
```ll
define dso_local noundef zeroext i1 @allones(long long __vector(8))(<8 x i64> noundef %x) {
entry:
%x.addr = alloca <8 x i64>, align 64
store <8 x i64> %x, ptr %x.addr, align 64
%0 = load <8 x i64>, ptr %x.addr, align 64
%vecext = extractelement <8 x i64> %0, i32 0
%cmp = icmp eq i64 %vecext, -1
br i1 %cmp, label %land.lhs.true, label %land.end
land.lhs.true: ; preds = %entry
%1 = load <8 x i64>, ptr %x.addr, align 64
%vecext1 = extractelement <8 x i64> %1, i32 1
%cmp2 = icmp eq i64 %vecext1, -1
br i1 %cmp2, label %land.lhs.true3, label %land.end
land.lhs.true3: ; preds = %land.lhs.true
%2 = load <8 x i64>, ptr %x.addr, align 64
%vecext4 = extractelement <8 x i64> %2, i32 2
%cmp5 = icmp eq i64 %vecext4, -1
br i1 %cmp5, label %land.lhs.true6, label %land.end
land.lhs.true6: ; preds = %land.lhs.true3
%3 = load <8 x i64>, ptr %x.addr, align 64
%vecext7 = extractelement <8 x i64> %3, i32 3
%cmp8 = icmp eq i64 %vecext7, -1
br i1 %cmp8, label %land.lhs.true9, label %land.end
land.lhs.true9: ; preds = %land.lhs.true6
%4 = load <8 x i64>, ptr %x.addr, align 64
%vecext10 = extractelement <8 x i64> %4, i32 4
%cmp11 = icmp eq i64 %vecext10, -1
br i1 %cmp11, label %land.lhs.true12, label %land.end
land.lhs.true12: ; preds = %land.lhs.true9
%5 = load <8 x i64>, ptr %x.addr, align 64
%vecext13 = extractelement <8 x i64> %5, i32 5
%cmp14 = icmp eq i64 %vecext13, -1
br i1 %cmp14, label %land.lhs.true15, label %land.end
land.lhs.true15: ; preds = %land.lhs.true12
%6 = load <8 x i64>, ptr %x.addr, align 64
%vecext16 = extractelement <8 x i64> %6, i32 6
%cmp17 = icmp eq i64 %vecext16, -1
br i1 %cmp17, label %land.rhs, label %land.end
land.rhs: ; preds = %land.lhs.true15
%7 = load <8 x i64>, ptr %x.addr, align 64
%vecext18 = extractelement <8 x i64> %7, i32 7
%cmp19 = icmp eq i64 %vecext18, -1
br label %land.end
land.end: ; preds = %land.rhs, %land.lhs.true15, %land.lhs.true12, %land.lhs.true9, %land.lhs.true6, %land.lhs.true3, %land.lhs.true, %entry
%8 = phi i1 [ false, %land.lhs.true15 ], [ false, %land.lhs.true12 ], [ false, %land.lhs.true9 ], [ false, %land.lhs.true6 ], [ false, %land.lhs.true3 ], [ false, %land.lhs.true ], [ false, %entry ], [ %cmp19, %land.rhs ]
ret i1 %8
}
```
to
```ll
define dso_local noundef zeroext i1 @allones(<8 x i64> noundef %x) {
entry:
%x.addr = alloca <8 x i64>, align 64
store <8 x i64> %x, ptr %x.addr, align 64
%0 = load <8 x i64>, ptr %x.addr, align 64
%vecext = extractelement <8 x i64> %0, i32 0
%cmp = icmp eq i64 %vecext, -1
%1 = load <8 x i64>, ptr %x.addr, align 64
%vecext1 = extractelement <8 x i64> %1, i32 1
%cmp2 = icmp eq i64 %vecext1, -1
%or.cond = select i1 %cmp, i1 %cmp2, i1 false
%2 = load <8 x i64>, ptr %x.addr, align 64
%vecext4 = extractelement <8 x i64> %2, i32 2
%cmp5 = icmp eq i64 %vecext4, -1
%or.cond20 = select i1 %or.cond, i1 %cmp5, i1 false
%3 = load <8 x i64>, ptr %x.addr, align 64
%vecext7 = extractelement <8 x i64> %3, i32 3
%cmp8 = icmp eq i64 %vecext7, -1
%or.cond21 = select i1 %or.cond20, i1 %cmp8, i1 false
%4 = load <8 x i64>, ptr %x.addr, align 64
%vecext10 = extractelement <8 x i64> %4, i32 4
%cmp11 = icmp eq i64 %vecext10, -1
%or.cond22 = select i1 %or.cond21, i1 %cmp11, i1 false
%5 = load <8 x i64>, ptr %x.addr, align 64
%vecext13 = extractelement <8 x i64> %5, i32 5
%cmp14 = icmp eq i64 %vecext13, -1
%or.cond23 = select i1 %or.cond22, i1 %cmp14, i1 false
%6 = load <8 x i64>, ptr %x.addr, align 64
%vecext16 = extractelement <8 x i64> %6, i32 6
%cmp17 = icmp eq i64 %vecext16, -1
%or.cond24 = select i1 %or.cond23, i1 %cmp17, i1 false
br i1 %or.cond24, label %land.rhs, label %land.end
land.rhs: ; preds = %entry
%7 = load <8 x i64>, ptr %x.addr, align 64
%vecext18 = extractelement <8 x i64> %7, i32 7
%cmp19 = icmp eq i64 %vecext18, -1
br label %land.end
land.end: ; preds = %land.rhs, %entry
%8 = phi i1 [ false, %entry ], [ %cmp19, %land.rhs ]
ret i1 %8
}
```
Interestingly, the equivalent 'allzeros' has the same problem on the first SimplifyCFG pass, but a later pass merges the last comparison as well: https://gcc.godbolt.org/z/oe8cjY137
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUmU1z4ygTxz8NvnTFJUCvBx8m8Xjqqee2c9pTCkvYYhaBB3A2mU-_BbZjyZYUTcW7qaRcjiW6gf9PjdQtmLViqzhfoOQeJcsZ27tam8Uf__8uGq1ma129LGrndhbRL4isEFlty3K-1dVaSzfXZovI6hciqyeFn2j2jRsULVH0BaXR4VMejwkVqpT7igOiD895KpQzQs1rRL8eLcL3WmsJTEqtuEUkf3xsEkwEPCNSAMruD0YAhru9UacjgGeU3EcoWQKiS0SXcIcBkRSRNLTgvpauMxl0pm87x4POydvO6aBz1mlB9KgeZcsLxm2A94apsuYV6M0GNkY3gAhNiqLI4c6DhfXegas5SGYdlLrZMSOsVhaY4dBws-UVCOV0MLKs4bBmVpSwlrr8C5EH2Bn-xJUTagtPvHTaiF_MCa3m7Wm8zk3Kw4mKb4TiUFn9KHXJJCi9VxXfwC9uNH92IDCgODpfeqnVFsLX4-NhHETyHJEifHJEH3J4BpHGiH597QyRpBsqXDnz4kP3yNwbzFlVGQ82BFrJoNOXl8ik2CpI45OXddrwrtlxqAfYOXPutc8ZkSQKo0nNquux3vJHJHnipSfk--DPzrDScckbrtz1lCLfg6AEotbwZbMLzsL_4D-9-blb73CHT9ZrEy5E8PEtkq259MeSqWouazt3Zs-vW7iq2pe_a01DsL_1h-i9j63Khrkikhyu3VkGfgfFs148iSM-ccRdjmQYJO6QbIMkwyTp76GknuUVqC7t83zJTYDFk4CREzDSBZYMA4uHQy8ZJpb-HrH0bWK0NWN6E2TZJGT0hIx2keXDyLJhZPkwsuL3kBXTFuw41LSlKb7F7Q9Hk6DGJ6hxFyrGIys3GsaK8TBX3LOwx8BiMonsONiipSu5CVg6CWxyAptcgI1HwNIRsPEI2J71Pwo2uQFY3L5zpTchm04im57IphdksxGy6QjZ7Jqeqe00pN5w2vN6CtJ2rGQ3QZpPQpqdkGYXSIsRpPkV0rdx-XODD5gj9P7o7r-Z9N66ex-BvZlEX6J2kUkhkhwY7moRYia5hw2TlvdPFVCyDC2jZmSSWTHJKp1kRSdZDRkFIO3GU3i0OzG1DSbnmvO4xvLxQszpW9VAn6bIeWeN8x8XOZ-tlvDntZmXWlXBxXLJS9ct1LrFhsDHcP-sxcBZMYmuNR-bOrqTAd2fK6Nv6caDuknUUZ4PKH9P2v0heXdLIRkWjzviMR5Q_57c-EOS45ZEOqyedNXHA-rfk79-SALbkhgPq6dd9Vmf-tdU-LW_D0yHL99hvScJ_vRZ8CWM0Tz0X03R_qccN9w6obbyxXfoag785148MRlQkoxJ6dMyi0gGNbPn1-E7o9eSN6BVOLcRxjr4LpqdFJuXh9U32DEbFK_3DhhI5rgJ5w5v123f23dgFv7mUnqKU3ZbNM_LH39ims2qBa0KWrAZX-A0JyROMM5m9aLK_EGepJs0LvNok-VFkpM0z-K4yPJ1PhMLEhEaxYTiCOc0m1dFtMkqlsdZjGkWYxRHvGFCzqV8avzYM2Htni9SQjGehaCwYdeIkEZYy6s7vXOiOe4GIEJQspyZhfe-W--3FsWRFNbZc39OOMkXbXQbJqQFpw-own7FeWsk7EowsP6i8cN-xGxv5OX2lHD1fj0vdYPIyg91_He3M_oHLx0iq6DDIrIKUv4JAAD__4YBZm4">