<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/97956>97956</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
DSE removes store before free() incorrectly
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:optimizations
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nunoplopes
</td>
</tr>
</table>
<pre>
TL;DR: the transformation below needs gep inbounds, otherwise the input ptr may have a negative offset.
```llvm
; test/Transforms/DeadStoreElimination/free.ll
define void @test2(ptr %P) {
%Q = gep ptr %P, 8 x i32 0, 1 x i64 4
store i32 4, ptr %Q, align 4
call void @free(ptr %P) alloc-family(malloc) allockind(free)
ret void
}
=>
define void @test2(ptr %P) {
call void @free(ptr %P) alloc-family(malloc)
ret void
}
Transformation doesn't verify!
ERROR: Mismatch in memory
Example:
ptr %P = pointer(non-local, block_id=1, offset=-4) / Address=#x000
Source:
ptr %Q = pointer(non-local, block_id=1, offset=0) / Address=#x004
Function @free returned
SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 > size: 0 align: 4 alloc type: 0 alive: false address: 0
Block 1 > size: 9 align: 1 alloc type: 0 alive: true address: 4
Target:
Function @free returned
Mismatch in pointer(non-local, block_id=1, offset=0)
Source value: #x00000004
Target value: poison
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVU9z6jYQ_zTisgMjJGPjgw-A4dLk0ST00FNHttegVpY8kswL79N3JExC0nkzffF4sNf777e7P1bCOXnUiAVZrMminIjBn4wt9KBNr0yPblKZ5lIcHghfl8-Er8CfELwV2rXGdsJLo6FCZb6DRmwcHLEHqSsz6MYRtgHjT2i_S4fRUep-8NB7C524wEmcEQRoPAovzwimbR36GaEloavxN6XXW6lzN37ia_DoPGG7ww2HI2xXomhevLG4VbKTOkIjbNdaxJlS90EbbKVGOBvZAEloCMYIWwZYhC1-JywHkq2vthA-PQHhZSzt3WYDS3gFyRnQIMyDkCaQ3NxcgBL1SdCPjk_hXSh51O-WtVDqDUyA-wmLUMrU01Z0Ul0IW3ZRflP8I3VD2PLql48xLfoYcaw6K2-tKwnffqUJX8V48_8JoMNHIjUGnSYs83BGK9sLYfP7uW2fn_eRg4_SdcLXJ5AaOuyMvXwwexVdr5DwUb7hjEPsjdQeLWFLbfRUmVqoMJIqdPIv2RBeziNtIxUJL6dJ7ATbwappLDoXesj4K6X0PueLGWz9n5RPX0pJf5ZxZMxu0HVs1ziK0NzBamw-ANr_8bzZwuP2cf_8J7wcVoftHQe-dEf3b_tv04f9ZvUA64f95reXt5LXoRygQPgWrpeTP0JHgF4JH16TUXXlC_hLP1qEL_IchVYoh9HmVv4K6H2Oecxxi56_R5__j-jeDgifoif3jTsIewxjWP1Cs-_5-JVp33MIzkINEepIs3Al99jeLXojndGfNuWkKXiT81xMsJhnjPJ0wXk-ORWLJG-bNuEZW2R5nookz5I0XeZ5vUxSkWYTWTDKEprRbL6YL3g-azmb07TKRMVyKkROEoqdkGoWtvHM2ONEOjdgkWf5Ip0oUaFy8SRhrJOuNl0v1biHGWEbwlhc43xlei87-SPqXFAuyoktgnJaDUdHEqqk8-49j5deYVG-bMFiZ87oxv1aYRse40YKfxypa2Mt1l5dJoNVxcn7PkyZsB1hu6P0p6Ga1aYjbBfBXB_T3pq_sQ6HSiwpHCjXqs4F-zcAAP__S9sZnA">