<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/129373>129373</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[VectorCombine] scalarizeLoadExtract - infinite loop if we scalarize a dead extract waiting to be erased
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
RKSimon
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
Reduced test case:
```ll
define void @infinite_loop(ptr %p0) {
%load = load <4 x float>, ptr %p0, align 8
%shuffle0 = shufflevector <4 x float> zeroinitializer, <4 x float> %load, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
%shuffle1 = shufflevector <4 x float> %shuffle0, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 poison, i32 poison>
%extract = extractelement <4 x float> %load, i64 1
ret void
}
```
scalarizeLoadExtract iterates across all users of a load, and doesn't account for possible orders in the worklist that prevent unused instructions that use the load from being erased afterward.
Fix incoming
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMlM-PqzYQx_8acxltZAwscOCwL3m5tKdXqdfK4CGZ1tjIHpLt_vWVCdFmV9v2SZYY_5jxZ8bfQcdIJ4fYieqbUOrHL7_R5J1QSlSHTC989qHbFrPem7-7H2iWAQ0wRoZBRxTFi5DreJa3Ya2QLwZHcggXTwZEKcmN5IjxD-v9LFQzcwChqlkK1YKovwn5AmnBem1AFAfYjH0JrzBar1kU34Xaw4PjHrSlk4Pm7hzPyzhalGuAbXLBgX34HAneMPgERNrSG4YU7PORjeZhiwq1bhR7KhSsBMko70Z-N6oE-xEq_wmohxS-Avp35v8Dmz3F9KofZu-I-MpBD7wSbjZanNDxfxWFnkvIU4iAvL5z0kB9eFTCTRhx0FYHesNfvTbft7uIMWjGCHoIPkbQ1sISMUTwI2i4X6KdAeMxOqFqBj0MfnEMow8w-xiptwg-mORGDviMcPXhL0uRgc-aYQ54SWksbologFzksAxM3sXbgSXi6rbKbQx-gh7JnQCDTg56ZAxXHczulsqRXoHc4Cdyp8x0hWmLVmfY5XUpG5W3TZWdu_a5zJVqilHXjdRDmZsWmxJ7NdblYFBm1CmpKlnIXLZFW1Y7lEbnEqWqaqywaUUpcdJkd9Zepp0Pp4xiXLDLVVvURWZ1jzZuLevwCuvu1rShS05P_XKKopSpFPE9DBPbtdd_XxW491NPDkV1gC8f6QnufQupb4FGuOL7UdBgUJu7ZuCqiVPx2EOPWwmzJdjuzDzH9KNQR6GOJ-Lz0u8GPwl1TGjb52kO_k8cWKjjmlAU6rhlfOnUPwEAAP__Nvx22g">