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

    <tr>
        <th>Summary</th>
        <td>
            Missed combination of addition carry flag and conditional jump
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            llvm:codegen,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    If we have a conditional branch on overflow/carry flag and this condition is merged with some other conditional branch with `or i1` then the codegen is not able to use the carry flag in the branch instruction directly (it will use temporary register to store the carry with `setcc`).

```c
void bad(unsigned x, unsigned y, unsigned z, unsigned* sink)
{
    unsigned s = y + z;
    _Bool ov = s < y;

    if (x || ov) 
 return;
    
    *sink = s;
}

void good(unsigned x, unsigned y, unsigned z, unsigned* sink)
{
    if (x)
        return;

 unsigned s = y + z;
    _Bool ov = s < y;

    if (ov)
 return;
    
    *sink = s;
}
```

```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define dso_local void @bad(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr nocapture noundef writeonly %3) local_unnamed_addr #0 {
  %5 = add i32 %2, %1
  %6 = icmp ne i32 %0, 0
  %7 = icmp ult i32 %5, %1
  %8 = or i1 %6, %7
  br i1 %8, label %10, label %9

9: ; preds = %4
  store i32 %5, ptr %3, align 4
  br label %10

10: ; preds = %4, %9
  ret void
}

define dso_local void @good(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr nocapture noundef writeonly %3) local_unnamed_addr #0 {
  %5 = icmp eq i32 %0, 0
  br i1 %5, label %6, label %10

6: ; preds = %4
  %7 = add i32 %2, %1
  %8 = icmp ult i32 %7, %1
  br i1 %8, label %10, label %9

9:                                                ; preds = %6
 store i32 %7, ptr %3, align 4
  br label %10

10: ; preds = %9, %6, %4
  ret void
}

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
```

```asm
bad: # @bad
        add     esi, edx
        setb    al
 test    edi, edi
        jne     .LBB0_3
        test    al, al
 jne     .LBB0_3
        mov     dword ptr [rcx], esi
.LBB0_3:
 ret
good:                                   # @good
        test edi, edi
        je      .LBB1_1
.LBB1_3:
 ret
.LBB1_1:
        add     edx, esi
        jb      .LBB1_3
 mov     dword ptr [rcx], edx
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMV8mO4zgS_Rr6QihBUasPPthpJDDAzGkuczMoMSSzUiI1JOUlv75BarGU5ayqblQDbRgSqXixMOJxY8aIWgLsUHJAyXHDentWeleeK2bsplD8vvtXha-Az-wCmOFSSS6sUJI1uNBMlmesJFYX0FWjroi-lUzrO64aVmMmObZnYR5KWBjcgq6B46uwZ2xUC1jZM-hnhj0EpURpLEKUEmzPIN0Dl4pDDd6cVBazogFsFe4NDOJHDGJQGC0KaazuSx8KFxpK29wxormw-CqaZjAAbac003esoRbGgnamjVV6aXyKzYAtS5QSRLcviBwR2Y_PlAz_cuhflOC4YBzRvJc-5RzfEH3Fc---6n0se4jusRHyHdHtaD07DA2M8UPHYBQdsRvQAX-gaAE5HZRqsLp4gIO94vsMeMBE5ZJxwyh7RdkrVhdEt3gUa7C9liurixbdu_gG8w_D2XHpwaegVurvyMEY-SzE4-9T1KPwd2fMJ-p35GkizVMmNc2lHT5ZpmuwmDPLGnZXvfUGEaUQtCjaQ9DRjKBoH1H_cN1w3XWtNPaPQEyNKndKIc0DmbtGOumkcfDfkOaI0pV_q0XXwOT7lqenNA56-S7VVQaNkP0tqGU_aw1PDpWQgLlRp0aVrMGeFigmw-QQEcVS9ZKDy2xCHAU-fQuffKPuW2c1lqpkne01zNKrFhaU9BM9iRyjvd9TLyVrgZ8Y5xojGhG8YBSiSeIHxjj3viYf3v8DlHqQKNsOS5iAPmiyQGUPVN_YCZY8sZd7pF_wvPkRkk2QYpLkTtKwAhpvgqy622XCtyjaYxQdcKeBm7FaSTxZHBa2ZUgujUOqXjFrRC1xvHC_9LnwEpIv3AwDmKelBusr_nSF-JIb46rxTyOHryj8_3nd51Ilq9qknwu3GH_641LNTPoJKfOndMs-I_8ql_7k77vxpGMAK-Zlv5t523G40xSKf4mBzFotit6CGavujGUH3PbGdlrVGow7clQaHIc0lL02rmXusvSkugrJ_Vli2AdwC63Sd0RzpusW3Oo8cM5Rrb9af3JBlLZCBg3UrAkuUFqlg6vg9uyWzuiIKCWIuixRqQKrWdcJWQctWwCs7mHEGMvK96DTyg6Wir6qQAdGfMAMz0fssJAHZdfPolueBmm8llfA3KwxMwjRQ3lztEH0UN2MHlptexsaxsDcoEPrlmeTzV7CymMNErQovfjXdkJmxo3Q7Rmu-DSadpDV7u_mifuBEY4FwG9ruQFbeFwzfrdgrFfgo4JYK3yT4N8v_z4cyClaCydl1gz8HaU_1GnVxb_5VWk-8D856PKGkqMPwIwBTMrR_nHMGFp-afylWTlmySt8H_iXQx6i9-GHp_ARTvg0nAkW7b8oBb-tBja7KZZupiz9LD2fCzqHMVNlw3cR30ZbtoFdmOYxIXGYks15xwuS5UUS5yRKS0KSLatIlkEc5UVIopBuxI4SGpEkjMI8SQl5qaDMqhgymiQQxhChmEDLRPPiDmYvStcbYUwPu5Sm23TjVyvjr1WUFqx8B-nq9L889fPnFVHqD3TRfrzMzJ9bYQzwQHVWtOKDucuKkyXHjd45laDoa4Ni0ghjzcO5FbaB3X-8Mi5VWwjpdbGqXPaH-9en29ny0vWtb7tNr5vd2drOuALSN0TfamHPffFSqhbRNx_x8HIrzDcoLaJvftgG0Tc_8j8CAAD__2-97fg">