<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/124977>124977</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MachineVerifier] Does not report broken livein-list
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:codegen
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
JonPsson1
</td>
</tr>
</table>
<pre>
A test case emerged that seems to be due to an erroneous kill-flag, in the way that a register as live-in while it was killed in the only predecessor of the block:
```
renamable $r1l = AHIMuxK killed renamable $r1l, -1, implicit-def dead $cc
$r14l = COPY killed renamable $r1l
BRC 14, 6, %bb.3, implicit $cc
bb.2:
liveins: $r1l
$r14l = COPY renamable $r1l
```
Even though this may look harmless, this will actually cause Machine Copy Propagation to produce wrong code:
```
$r14l = AHIMuxK killed renamable $r1l, -1, implicit-def dead $cc
CHIMux renamable $r5h, 9, implicit-def $cc
BRC 14, 6, %bb.2, implicit $cc
bb.1:
successors: %bb.2(0x80000000)
liveins: $r1l
$r14l = COPY renamable $r1l
```
It seems reasonable that MachineVerifier would have helped to detect this case, but it does not. At least for a block with a single predecessor, I think it should check that the register is live out from it..?
The above in a .mir test case:
[tc_badlivein.tar.gz](https://github.com/user-attachments/files/18593401/tc_badlivein.tar.gz)
llc -mtriple=s390x-linux-gnu -o after-machine-cp.mir -mcpu=z15 -O1 ./tc_badlivein.mir -run-pass=machine-cp -verify-machineinstrs
This is related to #124768
@guy-david @topperc @arsenm @michaelmaitland
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVd1u4zYTfRr6ZiBBoiT_XPjCiT_jS4vFBkVRoFfFiBxLrClS4I8d79MXlJx1kE0WvaghSII853A4Z84QvVedIdqy5oE1-wXG0Fu3_cWaZ--tKRetldftDgL5AAI9AQ3kOpIQegzgiQYPwUJLICOlNzRAzllDNno4Ka2zo8aO8UdQBkJPcMHrDEZw1CkfyAF60OpMmTJw6ZUmUAEuOONJviKt0VcYHUkS5L11YI_T91ZbcWLVjhXTtSxuV7EDAHBkcMBWEzBeu1IDq_aw-__Tl_jy6-sC72NSulk5JT2MWgkVMklHkIQyRQhx456i65ny8evzn5_yzeEPvz1CWSfaZbox3rRtXr1d5jv7hGjbnM_7SuhUIWU8q3Z31s_y-CCBt3Vhxe5_Z0pVtbHrIfTKw4BX0NaeoEc3aPI-5TX9c1FaA4oQUesrCIye4AuKXhmCRzte4dnZETsMyprUAqOzMgqCi7OmA2ElfSrO28T_I00eJ5p38KZPwM0P6LfAD9XhH6oDkG5tm5d3eXwUc1veFLqh18XLuph_jG9-IuXM-S_FhB8FfXq1oyP01kzxk89uUv1BTh0VObjYqCX0eCboSY_JyxYkBRJh1jv5PG27jSEZUVryYGzIYRdAE_oAR-sAZ9_BRYUeELwynaa39kwUT4nRnBKN76d1RU_iNCeWvPt9BKh5BICNAY7ODqBCnrPqMG_u954AW3umNAsQ8kG5-0y6d1fzEMRfLcq5vnlAl3ffWLNnfN2HMKaCM35g_NCp0Mc2F3Zg_BA9uQxDQNEPZIJn_HBUmtKzXDebqi5Kxg8fMU-Cai0gG4JToyZW7X21KV4yrUx8yToTIbOAx0AuG2YdMjFO6WeDGCOr9t_KBrKvJeTv15iCXDTZiN6zan_HQ3ZOYl5fKZXxwfnXSimfiulIY5i1Zbwqeb1aruFWprro4jWTeFYSgNVFsONITqRXdJ7MkN4GJXokPaAKGo2EhdxWclNtcEHbclWty3VZVstFv60LKgXiCquaE28ruZJNs6J6U8jNEUku1JYXvClKvuFF0VTLHCWtm-pYFi1V63W5ZHVBAyqda30ecuu6hfI-0rbk9Wa1WmhsSfvpiOI8hbBql6ZKR4Zxno4tt02fszZ2ntWFVj74O1dQQU8H3DsjsGYP-1tvg6PRugCtsycyN39miWgRnd7-pHmmfOZHNjr7N4nA-GHKf2qgeQvnLf8nAAD__1OJUvA">