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