<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">