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

    <tr>
        <th>Summary</th>
        <td>
            Failure to propogate knowledge from comparison into branches
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          Kmeakin
      </td>
    </tr>
</table>

<pre>
    This rust code produces sub-optimal assembly:

https://godbolt.org/z/Ex7jKGzj7
```rust
#[no_mangle]
pub fn starts_with_a(s: &str) -> bool {
    s.bytes().next() == Some(b'a')
}
```

```asm
starts_with_a:
        cbz     x1, .LBB0_2
        ldrb    w8, [x0]
        cmp     w8, #97
 cset    w8, eq
        cmp     x1, #0
        cset    w9, ne
 and     w0, w9, w8
        ret
.LBB0_2:
        cmp     x1, #0
 cset    w9, ne
        and     w0, w9, w8
 ret
```

The `cmp x1, #0` in each branch is implied true/false by the `cbz x1` test.
The optimal assembly can be produced by removing the `select` in the final basic block:

https://godbolt.org/z/87MKvPjf6
https://alive2.llvm.org/ce/z/VofZ27
```llvm
define i1 @src(ptr %s.0, i64 %s.1) {
bb1:
  %0 = icmp ne i64 %s.1, 0
  br i1 %0, label %bb2, label %bb3

bb2:
  %2 = load i8, ptr %s.0, align 1
  %3 = icmp eq i8 %2, 97
  br label %bb3

bb3:
  %4 = phi i1 [ %3, %bb2 ], [ undef, %bb1 ]
  %5 = and i1 %0, %4
  ret i1 %5
}

define i1 @tgt(ptr %s.0, i64 %s.1) {
bb1:
  %0 = icmp ne i64 %s.1, 0
  br i1 %0, label %bb2, label %bb3

bb2: 
  %2 = load i8, ptr %s.0, align 1
  %3 = icmp eq i8 %2, 97
  br label %bb3

bb3:
  %4 = phi i1 [ %3, %bb2 ], [ 0, %bb1 ]
  ret i1 %4
}
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVkuPozgQ_jXOpdSRKSDAgcNmMtlD70or7WgPe2nZUEncbWzGNv369SsDeU73SHvbRVEI9fi-KhefHeG92huimuVrlm8WYggH6-r7jsSTMgtp27f620F5cIMP0NiWoHe2HRry4Ad5Z_ugOqFBeE-d1G8s_YXxDePz9yGE3kcbbhlu97aVVoeldXuG23eG26-vxeP9r--PxZy04tMnss0mTFm-NvahE2avieWbyd4PEnYGfBAu-IcXFQ4PgmEZyYDhygfHsII7ln4Faa0GVqynRAAAv5RvgTzDkmG1NPQapp_A0g1LN_Cn7YhhKRkWgmHBsJqLKTY3hV42ezIK302W6-qOSwPz1cj38f6aMPwCy9_Wa_6A1yG6dTLeX8oYwvL1Kz-twAmm6-EiBtNqXk1oPIWzh75_nDfRM0z5jf-YXUW_odkrTDvR8WienC_ldaqjeXrHpn5o_TPuT0jn66fcJ9IPh_PtQMBWPBJfkK44KAMkmgNIJ0xzAOVBdb1W1EJwAzHc7oT2BPINwgwh3yPEikMgH5Zn-FstQCMMyJNg2ojhqLPPyuyPYJ40NWGuI9p2yggNUnjVgNS2efqXiiqL3--f_3jcrT4KF1o9Ey61fu7mlIbmvL_s7m-8lWEMnEwt7ZQhUAmwjHvXMCz74IBh7pfjMNQqm56SUUdHtUmZXAyfYc6jxkDFOUS8i6wvcHoBpRuZMB-htZCk45OUePOcXi5NdF9x4cilrWhBjRK4LllotTeQXCSk5-LoO6hyBImhJ0nF0j7nT6_5sxGuP6ixm3w9UkzvXuwFopQnWcNgWtqdXAlcqJxhno9A8e2_WJZIcIxxFGZXfrtT_Ti-sA__3fHB_3N-_OPZneeS_fwEWbR12lZpJRZUJ0VSFtkqydLFocY2EZlA2WRNwpuCyzJpiySpGqQmSbNkoWrkmPFVUmKCFU-XSZVz3FWN5G2VYrViGadOKH2S_UJ5P1Bd5VWVLcbF8OPxj9gp76mdDnX1LoKyhiHG_wWujtl3cth7lnGtfPBnvKCCpnorlB4cQbBxx-vtXgSCJ2NfNLV7gp2zHTS264VT3hpQJth50yW_GJyub7Y2FQ6DXDa2Y7gdN6Lpdtc7-xj3TNyOfXiG26mV5xr_CQAA___U4Vik">