<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/147511>147511</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [DebugInfo][NewGVN] Deleting instructions without salvaging their debug values
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            debuginfo,
            llvm:transforms
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Apochens
      </td>
    </tr>
</table>

<pre>
    In NewGVN, `NewGVN::eliminateInstructions` deletes instructions by first marking them for deletion. In the following code, the instruction is deleted after being marked without having its debug value salvaged.

https://github.com/llvm/llvm-project/blob/6c8c836b4f5a0b519db6f97c4882c6c061edd004/llvm/lib/Transforms/Scalar/NewGVN.cpp#L4079

Here is an example: https://godbolt.org/z/K4EanM9Ka. In this example, `%add2` is deleted and its debug value becomes poison.

```llvm
; Before NewGVN
define void @binop(i32 %x, i32 %y) !dbg !5 {
  %add1 = add i32 %x, %y, !dbg !12
    #dbg_value(i32 %add1, !9, !DIExpression(), !12)
  %add2 = add i32 %y, %x, !dbg !13
    #dbg_value(i32 %add2, !11, !DIExpression(), !13)
  call void @use(i32 %add1, i32 %add2), !dbg !14
  ret void, !dbg !15
}

; After NewGVN
define void @binop(i32 %x, i32 %y) !dbg !5 {
 %add1 = add i32 %x, %y, !dbg !12
    #dbg_value(i32 %add1, !9, !DIExpression(), !12)
    #dbg_value(i32 poison, !11, !DIExpression(), !13)
  call void @use(i32 %add1, i32 %add1), !dbg !14
  ret void, !dbg !15
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVVGP4yYQ_jXkBTUyA8T2gx-cy6WNrr2XVn2twIwTWgIR4Oxuf32F4-ym25NOrVqpUiQcYL75Zob5RqVkjx6xI3JL5G6lpnwKsesvYTihTysdzEt38PQzPn3782cCHyjZVMsf3hPeo7Nn61XGg085TkO2wSeyqahBhxkTtQ_7VL_Q0caU6VnF36w_0nzCMx1DvF23wa_pwZddOgbnwlO5MwSDxXPZfUCjNi1ODFVjxkg1lusFGg19svkUpkxP6lp2bS639XSkV-UmpEm5qzqiWZOqJ1V_yvmSSkSwJ7A_2nya9HoIZwJ756735ZtLDL_ikAnstQuawH4zNEPDN1qMUlVastbozdjWg2gaGDZDtWFoTFWJBxxb7H6KyqcxxHMisP9xUE5FAvtbYtfD5UKAfy-qur2x-w4jlnCVp_iszheHhPf0HedgdHB5HeKRwP53AvtP4qPyP7Sf1JJTm16tb3UkIJUxUKr1mEtv_pItjUM4Y6KXYFPwS84KwvybI6t6wrd0i2OIeH8uVW9wtB7pNVhDiai09eFCoLEcKAH5XIgs3y8EWkqAGX0si6Sk3pKqp_TGklHCd1QZQx9tb3YfHuwYzEbFjBt9_GXm_-axIC0G7bLuDh-fLxFTssETaAjcDxiU7zcK8J7C4vpO5ZUC_xoFuHtgX-XA7xwG5dxrHqf0hZj-hN--4yRmkIh5xnh3KEv16t1SVr6l_dxP_2IV_wdF_CLa7UH_x-Vg_7wc9xZbmY6blrdqhR2rJWvrhol6deqEMA1XumYANRNiIxopkCmh6nEcgDcr20EFsqqrhgGXvF3LkXNALkWrdNsOSESFZ2XdurRxkY-VTWnCjolaMrZySqNL83wAmDXB-jEQKG-YAMy9z_v8oGdQBknsZsHU0zERUTmbcnpzkG1288jZFbxDwZM7IrfLg5M7upvHQdHtx_Fx1_SbeC_zw8ZHqUqrKbrub8v5HHLR4iXqawd_BAAA___0ThLJ">