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

    <tr>
        <th>Summary</th>
        <td>
            [M68k] cmp / br pair doesn't prevent reordering in scheduling
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    I have run into an issue while attempting to get some rust code compiled for the m68k target. While the code does compile, it has a completely different behaviour to that described by the source. The relevant section looks something like this:

```
let mut prev_state = get_input();
loop {
    let state = get_input();
    if state != prev_state {
        do_something();
    }
    prev_state = state;
}
```

I am pretty sure the issue lies with the backend as the generated IR looks correct. The test case can be reduced to the following IR:

```
define internal zeroext i1 @get1() unnamed_addr #1 {
start:
  ret i1 0
}

define internal void @main() unnamed_addr #1 {
start:
  %prev_state = alloca [1 x i8], align 1
 br label %bb5

bb5:
  %state = call zeroext i1 @get1() #11
  %8 = load i8, ptr %prev_state, align 1
  %_11 = trunc i8 %8 to i1
  %_10 = icmp ne i1 %state, %_11
  br i1 %_10, label %bb7, label %bb10

bb10:
  %9 = zext i1 %state to i8
  store i8 %9, ptr %prev_state, align 1
  br label %bb5

bb7:
  br label %bb10
}
```

This is compiled to the following machine code using `llc -O0 -march=m68k` with llvm compiled from the main branch:

```
 .text
        .file   "b"
        .p2align        1 ; -- Begin function get1
        .type get1,@function
get1:                                   ; @get1
 .cfi_startproc
; %bb.0:                                ; %start
 moveq   #0, %d0
        rts
.Lfunc_end0:
        .size   get1, .Lfunc_end0-get1
        .cfi_endproc
 ; -- End function
        .p2align        1 ; -- Begin function main
        .type   main,@function
main: ; @main
        .cfi_startproc
; %bb.0: ; %start
        suba.l  #12, %sp
 .cfi_def_cfa_offset -16
        movem.l %d2, (8,%sp)                    ; 8-byte Folded Spill
        bra     .LBB1_1
.LBB1_1: ; %bb5
                                        ; =>This Inner Loop Header: Depth=1
        jsr     get1
        move.b  (7,%sp), %d2
        and.b   #1, %d2
        move.b  %d0, %d1
        sub.b %d2, %d1
        move.b  %d0, (6,%sp)                    ; 1-byte Folded Spill
        bne     .LBB1_3
        bra     .LBB1_2
.LBB1_2: ; %bb10
                                        ; in Loop: Header=BB1_1 Depth=1
        move.b  (6,%sp), %d0 ; 1-byte Folded Reload
        move.b  %d0, (7,%sp)
        bra .LBB1_1
.LBB1_3:                                ; %bb7
 ;   in Loop: Header=BB1_1 Depth=1
        bra .LBB1_2
.Lfunc_end1:
        .size   main, .Lfunc_end1-main
 .cfi_endproc
                                        ; -- End function
 .section        ".note.GNU-stack","",@progbits
```

The `move.b  %d0, (6,%sp)` overwrites the value in the CC register written by the prior subtraction, preventing the subsequent branch from working correctly. Reversing the order of these two instructions makes the code function as expected.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUV11z4yoS_TXyS5dVEvLngx8m8WQ3VbO7Vdm5dR9dSLQsJgg0gJxkfv2tRpItO86XymUbdGi6z2ka4M7JvUbcRPObaL6d8NZXxm5-YlFp812Vk9yIl809VPyAYFsNUnsDXIN0rkV4qqRC4N5j3Xip9-AN7NGDMzXBnYfCCITC1I1UKKA0FnyFUC9Wj-C53aOP4e9ghLoDWBh0w4iI3YL0UHEHPPQp9KheQMiyRIvaQ44VP0jTWpraV9yDQFdYmaOA_CVYdaa1Bcbws0KwqPDAtQeHhZdGgzLm0QV_fUUBKPlIvkgXZd-iZBslw_ci6T-hqdBD3XpoLB52znOPEGVbin0nddP6iK0ito6ymx5uTAPRsm8BAJCBj8cRUpYDkKWEHU85tkiPMLtjKFdMRcvtqXHhevh3RB-RF3F33_fAaxrv_Qu41nbidRmhJDp4kr4KfTkvHlEL4C4096jRco8C7h965gtjLRa-U8cjZQx3CAXXkJNcoi1QdNoilEYp80Qy3T-8r4_AUmqkbEWruYI_aA0-e5ApRLNkjz7t6IFWa16j2HEhLEQsS0-kOs-tP04DYDGMTy4ZujrhwUhBU9Vc6q9PFbH5hTxcKVNwiOY3KTyDXEXzLS0OruReQ9qPyy0onqOi8Xk-H_tHzTP7J9MFV-8QRI6mo3GrMEYZLsgLdguNt-f-vvaL3u_SNIz0ttUFyFVnyxuQ56gkoGRRN0B8pkdfyWxnZ8Dntn-_SxN6O4p9edFOk3My0uScjXWY9c_AwEAPubcaYM4bi73n689G_q4ky5ET58D0VZZdW4c_K-lAulN9fbVOal5UlJehsraOuqJFolQB0_8lMK25Laoo21I9jhZJt3CVOtSjkm1N3dVsLjXklmsa8d7ag9jjsz8vTHFJNZ6oZnnE2MXLhnWs9Q8lyg1Mp3CDe6mhbHVXq0NWno_0Lw12_ew2miUDtEOF_uwIfueh-Ya072MoSrkLy7KxpujjJBSpEyefMNuju6XdGa3NAX8HFrKkT2eRnEdkves64h8UzA61GKdqH7aTf4jNPnAYYadXSKJQUItTIAO_37WAc8q-Kkkob1ckge7NFVFCf_ZtoPyKgY-Zv0Jt_7g257EKDKesp9g1Y00Flrui5DtTlg49TNPFuQXSqI7DMhS9hRXVuc4QW78l9Wqav3iEO6MECvh_I5U6N5xb3sX34-Ym3aWDyl3jFNSxSHyYtOM8y7ZR9j2Ug3ut0cIPOnD8G7lAS7a32Hha5xeZ8cvZ8Ps6Z4iFOCceV8tR8EPSXixgrgWBA-tvQE4GKeV7TPpKvDgfE_8KccXKavEJcdIPxdE4Eid7Tzk2Vo6dKZcmX5dO6iAW2Rn02oaceEu0kTSLK9IkVwJ-QNqvP6byTOpXFFxJ3OzzdZB2u1Pxga_HfXKBXVbI9M0K2VehUYVMp6OSc6U0fkG66xU0Hq4WA5KxWBuP8b_--9fUeV480gZIRLP-zyxprNnncij9b-z1SFv3RyuAdnFzQPtkpcfu1H3gqqWTaWjc3oLFvXQeLRDGox7uSY2VxtIi9JZ3AdEZx-IBdXe3o7tUmzv83YabVzgKdOeDJ2MfCdKf5tVLDA94QOuGccYKtGBKajgE_2RAaudtGyZyUPPH3ttwUjnuL9wBPjdYeBTxRGwysc7WfIKbdMlmy_l8vV5Oqk2WFtkin-WsxHKOGWdFymarRZHNijydZflEbljCZsmKLdNknqXLOCtn69UiLcosLwRfptEswZpLFdPZJzZ2Pwm3mU2aLFiymISDmQt3ZMY0PnV3HVJvvp3YDQ2a5u3eRbNESefdyYyXXoXL9X_ohDXfAp1rI3ZHx72GSxtuuzpiSz8wDRYDWcSc1OCKCkWrpN5PWqs2lfdNuJqyu4jd7aWv2jwuTB2xO5qz_5k21vzCwkfsLnjqInbXh3LYsH8CAAD__5nobA4">