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

    <tr>
        <th>Summary</th>
        <td>
            Dead Code Elimination Regression at -O3 (trunk vs. 14.0.4) 
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    ```c
static short c, d;

void foo();

char a();

static long e(short f) { return f & (f - 1) ? 0 : f - 1; }

int main() {
    for (int h = 1; h; h = e(h))
        for (; d < 1; d += 1) {
            c = h;
            if (c + 1 == h) {
                foo();
                h == 1 || a();
            }
        }
}
```
`llvm-4c2bccfda3892ae13e97b6bfdbc99ec8cf5d095d (trunk) -O3` can not eliminate `foo` but `llvm-llvmorg-14.0.4 -O3` can.

Target: `x86_64-unknown-linux-gnu`

------------------------------------------------

`llvm-4c2bccfda3892ae13e97b6bfdbc99ec8cf5d095d (trunk) -O3 [-emit-llvm] -S -o /dev/stdout case.c`
<details ><summary>Reduced assembly</summary><p>

```asm
main:                                   # @main
        .cfi_startproc
# %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        pushq   %rbx
        .cfi_def_cfa_offset 24
        pushq   %rax
        .cfi_def_cfa_offset 32
        .cfi_offset %rbx, -24
        .cfi_offset %rbp, -16
        movzwl  d(%rip), %eax
        testw   %ax, %ax
        jle     .LBB0_1
.LBB0_10:
        xorl    %eax, %eax
        addq    $8, %rsp
        .cfi_def_cfa_offset 24
        popq    %rbx
        .cfi_def_cfa_offset 16
        popq    %rbp
        .cfi_def_cfa_offset 8
        retq
.LBB0_1:
        .cfi_def_cfa_offset 32
        movl    $1, %ecx
        xorl    %ebp, %ebp
        jmp     .LBB0_2
        .p2align        4, 0x90
.LBB0_9:                                #   in Loop: Header=BB0_2 Depth=1
        leal    -1(%rbx), %ecx
        testl   %ecx, %ebx
        cmovnel %ebp, %ecx
        testl   %ecx, %ecx
        je      .LBB0_10
.LBB0_2:                                # =>This Loop Header: Depth=1
                                        #     Child Loop BB0_7 Depth 2
                                        #     Child Loop BB0_6 Depth 2
                                        #     Child Loop BB0_5 Depth 2
        movswl  %cx, %ebx
        testw   %ax, %ax
        jg      .LBB0_9
# %bb.3:                                #   in Loop: Header=BB0_2 Depth=1
        leal    1(%rbx), %edx
        cmpl    %ecx, %edx
        jne     .LBB0_7
# %bb.4:                                #   in Loop: Header=BB0_2 Depth=1
        cmpl    $1, %ecx
        jne     .LBB0_6
        .p2align        4, 0x90
.LBB0_5:                                #   Parent Loop BB0_2 Depth=1
                                        # =>  This Inner Loop Header: Depth=2
        xorl    %eax, %eax
        callq   foo@PLT
        movzwl  d(%rip), %ecx
        leal    1(%rcx), %eax
        movw    %ax, d(%rip)
        cmpl    $32766, %ecx                    # imm = 0x7FFE
        ja      .LBB0_5
        jmp     .LBB0_9
        .p2align        4, 0x90
.LBB0_7:                                #   Parent Loop BB0_2 Depth=1
                                        # =>  This Inner Loop Header: Depth=2
                                        # kill: def $ax killed $ax killed $eax def $rax
        movzwl  %ax, %ecx
        incl    %eax
        cmpl    $32766, %ecx                    # imm = 0x7FFE
        ja      .LBB0_7
# %bb.8:                                #   in Loop: Header=BB0_2 Depth=1
        movw    %ax, d(%rip)
        movw    $1, %ax
        jmp     .LBB0_9
        .p2align        4, 0x90
.LBB0_6:                                #   Parent Loop BB0_2 Depth=1
                                        # =>  This Inner Loop Header: Depth=2
        xorl    %eax, %eax
        callq   foo@PLT
        xorl    %eax, %eax
        callq   a@PLT
        movzwl  d(%rip), %ecx
        leal    1(%rcx), %eax
        movw    %ax, d(%rip)
        cmpl    $32766, %ecx                    # imm = 0x7FFE
        ja      .LBB0_6
        jmp     .LBB0_9
.Lfunc_end0:
        .size   main, .Lfunc_end0-main
```
</p></details>


------------------------------------------------

`llvm-llvmorg-14.0.4 -O3 [-emit-llvm] -S -o /dev/stdout case.c`

<details ><summary>Reduced assembly</summary><p>

```asm
main:                                   # @main
        .cfi_startproc
# %bb.0:
        movzwl  d(%rip), %eax
        testw   %ax, %ax
        jle     .LBB0_1
# %bb.3:
        xorl    %eax, %eax
        retq
        .p2align        4, 0x90
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
                                        # kill: def $ax killed $ax killed $eax def $rax
        movzwl  %ax, %ecx
        addl    $1, %eax
        cmpl    $32766, %ecx                    # imm = 0x7FFE
        ja      .LBB0_1
# %bb.2:
        movw    %ax, d(%rip)
        xorl    %eax, %eax
        retq
.Lfunc_end0:
        .size   main, .Lfunc_end0-main
```
</p></details>

------------------------------------------------

### Bisection
Bisected to: 6001bfcedc3102b45878b7883c241b45863d7e2c
Committed by: @nikic
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdWFuPmzgU_jXJiwXiHnjIQ5PMaFcaaatu30fGNsFTbsVmJu2v32NMiJPQGXrJSm3EMNjn-PO5-TMmremX9SJy9EUWzm7hvBMSS06QyOtWIrLwtogu_I2W6ftzzSnK6nrhxQsvuRCSHLcIT4oG5KKu9oiBhp4iA0W0WG1Qy2TXVihDCy-CvzhDFnJ7oX-PHLi_Q7rL34D-zkTmlUQl5pWeVqHpfgS_rG4VmlLJAWSnAfL-1reVKbmyFq5xlDFSaVLQ3OqR8OhtNM7lVMcf6XHz0X1TxpV_MVEgyFV6WvVbUNqOy1BfauRHIEBcbeG6yoCpPQbvquP0cCyKsVkUz6UVEC8lJKPYjxMPM9dnySqN0oymJEkYiUkWUicJVYhi2XbVJ-WX9Y8P4xHBFapqiVjBS15hyRD0KtdAlnYSHedQt7rdW25gO3ZgjLbNjH_E7Z5JVRMgPcTRYxRYMF9Vv1RWwavuYO2r7mR_f7e-82eO_dkIoEW4sVjJZe_fItwh619k1aB2T9kz3IWkNUSBYMFscjLc31ImMS8EZPgOWqIrS9x-gcYHRjvCKMJCsDItoGurYEY5tBv179wJfWFR6p5-0fhX9TTxW3jgQ-D0AwbIxCYZf4RV3cqmrQf66PW8ME1tB4BH1aYT-Wf4D6I2bc4RKMseSYYf6ywTTCI3mh51eHWUF0yOwq-P8r1z8dA9zAfcZxm4VxpNr2HYW9bPX18KeKD98gtb3vTEslX6zLBFMiFftIn4MMgN8VPB1HwPm43z6OreoXEW1EPdFhqEjSjmLJhSHYcgHqSteD32ZhTrZmbozYQZg16fKR6lwPufz3w0XXwjaRBwHYHAPfpPDlPx0bkansYwl80YZqMQGg8XfA9lngRqkHNIHNO-ZMaCUasAuL5CD3XdKP2_GKasBYru50I71kjYH3buOGvBsLLVcofKUeWXTPikKufoFBmTbmSIQEwqdu33mxiGwpNRfme-ezN977eju485F30ERvffXXo-g3mMgCK0zXlBNaayZ6XxkPdL0KJfihaeo-lqFS9D4Cdz9xYt7Me0JJds69-yKieLkpo111zXkyF_qk4Ftbq0PLiJ5aNJk8xgGhTNXvnhbEvf45bBC-dYC1cWvl1VJzi9mBDql9PfVcXaby0qb4r6JrcGgotCMbV6AQuc9w8fZ-5hRgwvaoMcprc6wDsr6XPY63T53iqKTtN9Kyi8LPu3bOewur-_OyUWj3kNJ3k-mZ3t1W-S7e8B_8SLQkHAjgrtAB_6HkavGpDBo1J7nsyvRwbDUzsHr4hRdzfM7hWNxDehkXnVO2qNZGOy9g9VX_SbVN9Pcc3ckfhP5ajotSqxH7KuIo-somdv_bbgX9XupT94bJGhZhnHs4sTfH86bPS5sD909qfKywPiLzsnX5_if_QE_Gedg294Qjx_F5y9xk7Hrxms5H7_-_-rJPIDDHXzLQxOzZdvjrfdyq7y511UzAxump_l_59VfopPPF9faMMFI5LXgyW6CZmWtaqGyHHcNAMeIL7reGkQxqs4XcWxTyCNqhn5dMW8YXFu6xKISI1Ov_TfEAOn4p84WdK1TxM_wUvJZcHWOyhYtK0pQ3fDV0uYH31g-5YJoR6x1NQ2fOxDz8JGmvLUd79l1xbrXMpGqEh793Dtucy71CZ1CY2eCPU_C5jjCRyCJheiYwIewsgJ4mW-TlKHpTigSbaKo5SSGGrECVyMnQS8DtmywCkrxBoIFmh1ydee43lO5Iau5_hObK8SmvmYOKCehG7ogLcMUlrYamIbWHrZrnsb0m4vQFhwIcVJCMQKjMDYER93Mq_btcwZXDWt22Vv8bo39z8WeRxA">