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

    <tr>
        <th>Summary</th>
        <td>
            [AVR/RegAllocGreedy] Allocator clobbers a live register
        </td>
    </tr>

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

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

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

<pre>
    Hi,

I've got some code which works on`-O0` and `-O1 -regalloc=basic`, but gets miscompiled with `-O1` (and even `-O1 -opt-bisect-limit=0`!) - the issue downstream is:

https://github.com/Rahix/avr-hal/issues/505#issuecomment-1946294267

... which I've been able to somewhat minimize, down to:

<details>
<summary>Show LLVM IR</summary>

```llvm
@buf = private unnamed_addr constant <{}> zeroinitializer, align 1

define internal fastcc void @main() unnamed_addr addrspace(1) #1 {
start:
  %0 = alloca i64, align 1
 %1 = alloca { ptr, i16 }, align 1
  %2 = alloca i64, align 1
  %buf = alloca [3 x i8], align 1
  tail call void asm sideeffect alignstack "sei", "~{sreg},~{memory}"() #5, !srcloc !3
  %3 = tail call i8 asm sideeffect alignstack "in ${0}, 0x3F", "=&r,~{sreg},~{memory}"() #5, !srcloc !4
  tail call void asm sideeffect alignstack "cli", "~{sreg},~{memory}"() #5, !srcloc !5
  store i64 12, ptr %2, align 1
 call void asm sideeffect "", "r,~{memory}"(ptr nonnull %2) #5, !srcloc !6
  %counter = load i64, ptr %2, align 1, !noundef !7
  %dummy4.i = urem i64 %counter, 10
  store i64 %dummy4.i, ptr %0, align 1, !noalias !8
  call void asm sideeffect "", "r,~{memory}"(ptr nonnull %0) #5, !noalias !8, !srcloc !6
  %4 = icmp ult i64 %counter, 10
  br i1 %4, label %main.fmt_num.exit, label %bb6.i

bb2.i:
  %5 = icmp ult i32 %i.05.i, 2147483647
  %spec.select = select i1 %5, i16 0, i16 3
 %spec.select2 = select i1 %5, ptr @buf, ptr %buf
  br label %main.fmt_num.exit

bb6.i:
  %n.06.i = phi i64 [ %6, %bb6.i ], [ %counter, %start ]
  %i.05.i = phi i32 [ %7, %bb6.i ], [ 0, %start ]
 %6 = udiv i64 %n.06.i, 10
  %7 = add i32 %i.05.i, 1
  %dummy.i = urem i64 %6, 10
  store i64 %dummy.i, ptr %0, align 1, !noalias !8
  call void asm sideeffect "", "r,~{memory}"(ptr nonnull %0) #5, !noalias !8, !srcloc !6
  %8 = icmp ult i64 %n.06.i, 100
  br i1 %8, label %bb2.i, label %bb6.i

main.fmt_num.exit:
  %9 = phi i16 [ 3, %start ], [ %spec.select, %bb2.i ]
  %10 = phi ptr [ %buf, %start ], [ %spec.select2, %bb2.i ]
  store ptr %10, ptr %1, align 1
  %11 = getelementptr inbounds i8, ptr %1, i16 2
  store i16 %9, ptr %11, align 1
  call void asm sideeffect "", "r,~{memory}"(ptr nonnull %1) #5, !srcloc !6
  %12 = icmp sgt i8 %3, -1
  br i1 %12, label %bb3, label %bb2

bb3:
 call fastcc addrspace(1) void @report_irq_disabled() #5
  br label %bb5.preheader

bb2:
  call fastcc addrspace(1) void @report_irq_enabled() #5
  br label %bb5.preheader

bb5.preheader:
  br label %bb5

bb5:
  br label %bb5
}

declare noundef zeroext i1 @uart_write(ptr noalias noundef nonnull align 1, i8 noundef) unnamed_addr addrspace(1) #2
declare fastcc void @report_irq_enabled() unnamed_addr addrspace(1) #0;
declare fastcc void @report_irq_disabled() unnamed_addr addrspace(1) #0;

attributes #0 = { noinline nounwind "target-cpu"="atmega328p" }
attributes #1 = { noreturn nounwind "target-cpu"="atmega328p" }
attributes #2 = { nounwind "target-cpu"="atmega328p" }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nounwind }
attributes #6 = { noreturn nounwind }

!llvm.module.flags = !{!0, !1}
!llvm.ident = !{!2}

!0 = !{i32 8, !"PIC Level", i32 2}
!1 = !{i32 7, !"PIE Level", i32 2}
!2 = !{!"rustc version 1.78.0-nightly (ee9c7c940 2024-02-14)"}
!3 = !{i32 733181}
!4 = !{i32 732071}
!5 = !{i32 731113}
!6 = !{i32 189156}
!7 = !{}
!8 = !{!9}
!9 = distinct !{!9, !10, !"main.fmt_num: %buf.0"}
!10 = distinct !{!10, !"main.fmt_num"}
```
</details>

Now, the most important bit is this assignment:

```llvm
%3 = tail call addrspace(0) i8 asm sideeffect alignstack "in ${0}, 0x3F", "=&r,~{sreg},~{memory}"() #5, !srcloc !4
```

... which doesn't get used up until the end of the program, when it's being tested on:

```llvm
  %12 = icmp sgt i8 %3, -1
  br i1 %12, label %bb3, label %bb2
```

LLVM (understandably) decides to spill the result of that `in ..., 0x3f` into memory:

```asm
        in      r24, 63
        std     Y+3, r24
```

... to later load back:

```asm
        ldd     r22, Y+3
```

... and - even later - test on:

```asm
.LBB0_18:
        /* ... */ 
        tst     r22
        brmi    .LBB0_20
```

The direct issue is that this `ldd r22, Y+3` instruction is executed only for one code path (out of two) that leads to `.LBB0_18`!

(that is, in the generated assembly, `.LBB0_18` can be reached from two blocks, but `ldd` happens in only one of them)

Code seems to be compiled correctly with `-O0` and `-O1 -regalloc=basic` - the later in particular keeps `ldd` and `tst` together:

```asm
        ldd     r24, Y+1
        tst     r24
        brmi    .LBB0_19
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWVtv67jx_zTMy8ACRd0f8hAnJ___Aqft4rRYoE8BJY5t9lCkS1Jxsg_97AUp2ZYvuezuKdACgaPL8De3H4dDijsn1xrxlhRLUjzc8MFvjL39mXv7-p1VN60Rr7f_Lwm7J_SB0Lvx9yfCqmeEtfHgTI_QGYGw28huAztjvzswmpR08RdKSgpcC4h3KSwsrrlSpiPZQ8ud7EhJCbuHdvCwRu-gl64z_VYqFLCTfjMNDDCE1QEJn1Ef4MzWL1rpsPMLJXvpSfZAI2RKWAML8BsE6dyAIMxOO2-R9yAdye7m3my838Zn7JGwx7X0m6FNOtMT9viNb-QLYY_82S42XBH2GOEcYY8FLQjL4m1n-h61X6RNXrImZ2U1h0-SZIrNFLYWUQNvFYI3MX67DffQSy17-SuGeARrwZszO0l2L9BzqRzJvhweuaHvuX0l2Ze_bswOvn795U_w0zeS3RP2eHx3glPS8U-p5356lNN2WAHJHmBr5TP3CIPWvEfxxIWw0BntPNceAm61JNUDyb7Ar2iN1NJLruSvaIPlXMm1hnSuTuBKagSpPVrNFay4810Hz0YKIDntudSE1SFhJyrDj9vyDgmrYzoJy1IIyiOq89z6Q4AACCtotD_yi4Ms8wt7glA6FyLVErY-Gi7TEoJbF2PCIPYhcpDaR3APXiwzeAFZk-IabEgkdFypMRLc9eCkQFytsPOjsPO8-w6EMYeSMBZACGP_ItXSWVyP1oa7HntjX-M9m0JJWFaM8qmznTJduMpmxmbR1KMRsn7fBKmBsJxUSzpFib5kj0ejSPZAWGkng36fefnvCU2nfkhoir1u543FkGNII-rW28iAywy-aWBUtTfJXjckwGqj9aDUBP-GYeUsZ50ZwiSKmVOGiz0Vr9k44mgzaIGrcFnNgMTQ9695IiPSYLGPDh81hNEpvQzJbOhML72mlyvJXbis9zA_Ml70LF4n-t4LYR5dll2_hUH5d91uLcg0jgnPFW8xqg71Kln1_kkPfYIv0p-8bdsykfPq17Yskad1qjizIWPhqUxoMYaVpXmV11mZz1PmttglDlUMWPYA0-VoYbGvYHR_kR0r3mwke2NoTGRcAmZpDXfHULzj_4m35bm3OqHlxLTtRo4RL5bhTTlmaowZTFVyejfLSHAhFPsoccQd43XEDVEcx1Zv4dI34IIt41QQ8nnPidHuU0oE8LHEC3GZt_R8hl2ZYOVHU-t_dmbVV2fWPIqXM6s-mztsFH17Nl2S74RrzZEOYTkvlpBdpPzIsdnEODCGTYw5Yqb0ABqzMo6dpsrHyOwt6DH1U6JTOst6er29SMfWZY0eFYZ-M4hL3YYS70KbcYYQQsDOiBaiwopmLnpN248kVPqppS1lR_q4tQ_tSGhSwphFesGbcWme0SQ7J9JpUcqONImuTS3oRYu570ktbo31T9L-80lIF1p1MW8erlTFti2SrcUNcoH2rP7POPpbtaP-g8rnL45mnA0-G_KhYPVw2t93iluEfa8RdgX4Mq4vOR249U87Kz0eqDEWlL34niqzMifr_dtP7QrYqR1n-4s3o_khLiXZ8rPQZzT5DdjjL_feynbw6OLbOBnC7kQbqVXYPoWA7GTYSjPmuV2jX3TbYd95M-57XPOM1VvCGBwydAqbzmAt-sHqHwLLZrB_HC07oPWD81tr1hZdoEuYO23o-rVZWZxFZCeVmtyZShGruV332JPsDibuNW_pyz-vz73q7rNqLXLxkeriSuCuS5bvZe50OhKWhn190hsxKExWiq_dOJqlYffM0qkNStPjyGmMFKj9qTC7hKczidAE7fsCwtjPP93DV3xGNa0S4TWbq0nPxlbzsV_eH8tOLQsr0OB8B89onTQa0qSqE7rQcr3x6hUIqxGbruqanAKjLF9QtkhzwpqgYIabnduUZWl9Epz8QoLR6kSiuJBI0zSbS5RnEmndpEU5l6jm_s2e16d-N_N3Y8cjpPNSx_X5IDTlmB4DPG-eAkXHNiahZ-GY8nuJ-SbWfPz-bOlwPkXY48WpVfz9s9kFPL9B6I3zIPtQTbn20EoP0oHfSAfjAWVod85Pw66cYl0ea8xrb2xt_3vOOc5DdXZYKAw6TVgVT0ZhcChg2MKgvVQxZqgFmFW8jEWL90HRboMawp60ctCi1Gvw6DwKMPrj-P0nO7FrzsazSsLqsNRb57kWvFWvIW4COynQxQPSrVSjxxZd2FlEp7kHUlKpIUmSKUsrUlKQ2pt9OX7DX-72dKGN1IQ2lsUdfpkdHjsvCG3-TtgyuhME3k-ZN6C4Rzsey4RV4zPalRBRfYzhqO19NVwLWIxH4KO6RUzvO8k9qEu-Lpf0Ka1ngk088L4LIQTC7gh7hMMr7_xk2v5Ja3tJaDPiMPqOpX_bIAhp4xlDPHyPc5n7cUIHxgkBJ17HxDlvh86HQi4d4At2w8hb9QorY8Ho6TvDlvtNYI0ZRi7sTGBMVKCQi0gaUtKDw-P3gJMlrI7S0sVlRkdyrVGj5UEjdw77yMP7MxzouIY2EJF3GxSwsqYP-qFVpvvu9l8yRg-D_IZvt6hd0BH9CD6Mc7YPy9DMpvvgmUPso_ltcHX6DNIZG0KpXmcfRD7zXWX6_DHyRGrYcutlNyhu4Tvi1s3MnJBCzksK3qzRb2b7hU8wON_nMr1gUH6dQWlzBnsjbjPRZA2_wdu0ojVlZcXYzea2TLtWZFlTlyWypsoLWnaiLPJVxYqyFPxG3obVnbK0SJuCUZYUXLBVXYu0LPMKq4bkFHsuVRKbHGPXN5GXt3XapOlNLFYufgBjTONuJG2o4cXDjb0NYxbtsHYkp0o6744oXnoVv5zd_fKNsMdvuL4LSfg_iyheSfEA8ZZ7Y6FTpm3ROuCg5HOg0Fo6j_ZmsOr2nQ9QsTiP_xZba_4RzyqOH6GiB_8OAAD__7b0xFU">