<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/92274>92274</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
SimplifyCFGPass incorrectly hoists load before loop that can have zero iterations
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
GoldsteinE
</td>
</tr>
</table>
<pre>
C++ reproducer:
```cpp
int ub(int &foo, int count) {
delete &foo;
int x = {};
for (int i = 0; i < count; i++)
x += foo;
return x;
}
```
This code compiles to
```llvm
define dso_local noundef i32 @ub(int&, int)(ptr noundef nonnull align 4 dereferenceable(4) %foo, i32 noundef %count) local_unnamed_addr {
entry:
tail call void @operator delete(void*)(ptr noundef nonnull %foo) #3
%cmp4 = icmp sgt i32 %count, 0
%0 = load i32, ptr %foo, align 4
; ^ unconditional UB: load from a dead pointer
%1 = mul i32 %0, %count
%x.0.lcssa = select i1 %cmp4, i32 %1, i32 0
ret i32 %x.0.lcssa
}
```
turning conditional UB (on `count != 0`) into an unconditional one.
This is flagged as incorrect by alive2: https://alive2.llvm.org/ce/z/c3KXo9
Originaly discovered by @feedab1e
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx0VMGO4zYM_RrlQmxgU3YmOfgwmdnsoYcWaAv0NlAk2lEhi4Ykp5P9-kJ27Mlsu8BgIpOP5OMjJRWj7TxRI-qjqF83akwXDs03diYmsv7r5szm1rwIPAo8QqAhsBk1BSGfRfEqiuX_rpj_9DDMFusTjGeB-3wQuGuZBb5A_tI8-iTwAOLpOIMBDDlKtADlas_4dxDydQI_vT64Wg5wz28nRCHkcTq-3Evkz5m5wMMSBjkfHnPA51KB0hg8vK-mXO5zd48t_3GxETQbAs39YB1FSPy_mjh37WeTodZ6AhP5zbFWDjyP3lALViKIqlgEE7i7i5WJ435IYYV69n50DpSznYcKDAVqKZDXpM6OBO6rSVusF8klrsEC61X9icHb6L3qybwpY8LHQMincFtnDJCUdaCVc3BlazJVHiioxOE-OYH77BH4_HPGC6VMTsoldabUD9U0Qav7AWKXZj1Wri9QPKCLCepYmQzL3lzso9-7MGuEPIKov8LoNXtjk2WvHPx5FPJ5TtIG7kGBIWVgYOsThYdq5VStH93Cqcg1Vm4fwPdtsXU6RjUFRHKkE9hy6W-ZRE65nIuH1Vuca5ofd_Dnm5jX1voOPveX7wZ7yHcyMwWB5XxJdkUegfWJQfkfZGFP2_8suY3QOtV1ZEBFsF5zCLm58y1rfSXMUl5SGmLeGDwJPM32bd78LYdO4EmTwNP3fJC__MWHxyK_BttZr9wNjI2arxTI5OSiKloio84lbUwjzUEe1Iaa8qmsn_ZVWePm0uxNgUVVVaVSWEtJqHe7HcpypyuS1UFubIMFVkVd1mVVocRtiao6aKlkpWupiURVUK-sW8lubIwjNQfEp2rj1JlcnJ5HRE__wOQUiPm1DE2O-XIeuyiqwtmY4keWZJOj5nfbD862t5fTt99UfFDP3eDCOWJewjO1HAgc8wDpohJo5eGirgTfKTDYlG-bZR83Y3DNZ7E7my7jeau5F3iaHpv558sQ-G_SSeBpYh0Fnqau_g0AAP__uP_BoA">