<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">