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

    <tr>
        <th>Summary</th>
        <td>
            [Debuginfo][GVNHoist] The hoisted GEP preserves the debug location from one of the conditional branches
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    When hoisting GEPs used by hoisted instructions from `if.then` and `if.else`, the debug location of the hoisted GEP is not properly updated, preserving the debug location of the cloned GEP, ie., the GEP in `if.then` in the following program. However, the debug location of the hoisted GEP should be the merge of those in two branches, ie., applying a merging update. 

```LLVM
; Function Attrs: noinline nounwind uwtable
define dso_local void @func(i32 noundef %a, ptr noundef %b) #0 !dbg !10 {
entry:
  tail call void @llvm.dbg.value(metadata i32 %a, metadata !16, metadata !DIExpression()), !dbg !17
  tail call void @llvm.dbg.value(metadata ptr %b, metadata !18, metadata !DIExpression()), !dbg !17
  %tobool = icmp ne i32 %a, 0, !dbg !19
  br i1 %tobool, label %if.then, label %if.else, !dbg !21

if.then: ; preds = %entry
  %arrayidx = getelementptr inbounds i32, ptr %b, i64 1, !dbg !22
  store i32 1, ptr %arrayidx, align 4, !dbg !24
  br label %if.end, !dbg !25

if.else: ; preds = %entry
  %arrayidx1 = getelementptr inbounds i32, ptr %b, i64 1, !dbg !26
  store i32 1, ptr %arrayidx1, align 4, !dbg !28
  br label %if.end

if.end: ; preds = %if.else, %if.then
  ret void, !dbg !29
}

...
!22 = !DILocation(line: 3, column: 9, scope: !23)
...
!26 = !DILocation(line: 5, column: 9, scope: !27)
...
```

```LLVM
; ModuleID = 'main.ll'
source_filename = "main.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: noinline nounwind uwtable
define dso_local void @func(i32 noundef %a, ptr noundef %b) #0 !dbg !10 {
entry:
  tail call void @llvm.dbg.value(metadata i32 %a, metadata !16, metadata !DIExpression()), !dbg !17
  tail call void @llvm.dbg.value(metadata ptr %b, metadata !18, metadata !DIExpression()), !dbg !17
  %tobool = icmp ne i32 %a, 0, !dbg !19
  %0 = getelementptr inbounds i32, ptr %b, i64 1, !dbg !21
  store i32 1, ptr %0, align 4
 br i1 %tobool, label %if.then, label %if.else, !dbg !23

if.then: ; preds = %entry
  %arrayidx = getelementptr inbounds i32, ptr %b, i64 1, !dbg !21
  br label %if.end, !dbg !24

if.else:                                          ; preds = %entry
  %arrayidx1 = getelementptr inbounds i32, ptr %b, i64 1, !dbg !25
  br label %if.end

if.end: ; preds = %if.else, %if.then
  ret void, !dbg !27
}

...
!21 = !DILocation(line: 3, column: 9, scope: !22)
...
!25 = !DILocation(line: 5, column: 9, scope: !26)
...
```

The [hoisting code](https://github.com/llvm/llvm-project/blob/a20f7efbc587a213868b494d3d34a8cbeaff04ab/llvm/lib/Transforms/Scalar/GVNHoist.cpp#L924):
```C++
void GVNHoist::makeGepsAvailable(Instruction *Repl, BasicBlock *HoistPt,
 const SmallVecInsn &InstructionsToHoist,
 Instruction *Gep) const {
 assert(allGepOperandsAvailable(Gep, HoistPt) && "GEP operands not available");

  Instruction *ClonedGep = Gep->clone();
 ...

  // Copy Gep and replace its uses in Repl with ClonedGep.
 ClonedGep->insertBefore(HoistPt->getTerminator());

  ...

  // Replace uses of Gep with ClonedGep in Repl.
  Repl->replaceUsesOfWith(Gep, ClonedGep);
}
```

By the way, the debug location of Its user `store` was updated by dropping (the [commit](https://github.com/llvm/llvm-project/commit/368681f803830f42c539fe37e753d8401a121454)). However, I think merging would be a better choice, because the hoisted `store` is the merge of the two StoreInst in two branches. Merging could preserve the scope information of the merged `store`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWF-P4jgS_zTmxQIldhLCAw_QDGxLM7ejnb7Zx5HjVMA3jh3ZTjN8-5OdP0DUPdu7M7o76baF6KTs-tWv7HIVLmatOCqANUq3KN3NWOtO2qw3jeYnUHZW6PKy_v0ECp-0sE6oIz68-2hxa6HExaWTQomFss603AmtLK6MrjHKIlEt3AkUyiLMVNlLQFpAWYTIA3YnwCUU7RFLzZnXxboK0gH28O4jFhYr7XBjdANGXnDblMxB6QEaAxbMs2f1OhaXWnVQXkXAYjAdwNWEqFBhrNJS6rMHbow-GlYv8C_6DM9g3k7cnnQrS1xAGKnBHKGbpi0EO2eNC8MUP4G9ocaaRl68ZRZ0_FPn8gKjaIeiTf-dRd3n_fvPH3oR3eJ9q8Iu4I1zxiK6wUoLJYUCrHSrzkKVuD07VkjolEqo_GBp9RfvjMTPWpQYJVHVKo5ILigJmiVUGJGUhXV35lZWILLCiNAIIxKXxdH_iyOMltvOBChnLoj2xDF2TEjMmbzakvK5XpTFcfHMZAuI5DU4VjLHsDc_mB2FHj-bSnaP7775gLBCK0RyRFbh83BLavlXKHhvOy8nFPIfooBI6nShtcSI7rDgdYMV3PkbTVRXg2phsIivAH6aZAVILxpieSILx-4OjsS34TSo0Q32YdQYKG0ghkja7d-VNjOGXUT5LYwfwYGEGpTz6yRU4ePCej-GSBnWTmQJjiccyABrnTad9_GN3mApnAspjgonE4DkZk3u_FXlZGY6cTesyJ9xN_4J_mZv8zd-3eH8Ow5PHFTli_7dRcMYLz2qAReOxMRqH3poubs1slgs-le_lT1-vHt832dFRHKfeTwL6gG5lm0dYiycCst1020BiQlFg5E71Oy7qOkfoS5fQB0S5xuy6QddthIedz2JZc2EWkiJSH-KrW4Nhy-VkKBYDf00EqZxNES3Y-YIDvssIdlFt26YB_Ma0Q3MG7KMEN1QEr78a3z_6p-yJHzNxfjgg4FuYpLPqzzqn1QQZYN6lsw_-WkTKs6IRo50v-XZlyyZt-qr0mc1l0K13-ZH1Y5af5eX_6vygkga_YRcF38_10W3Oa6b-XPqGv0fqGvxm8tS8kpZevPff7R-pf-V6rP84-oT_1j1IS9Xn_THqk_2xurzdAKM0u14xeK6BJTuEMlPzjU-zSKyR2R_FO7UFguua0T2PqP0_-aN0f8C7hDZF1IXiOwZiaolVAVP8yUjMc2zvEhWSUlLmrCcF8CqKkpYcYMj_MuTYcpW2tQWkf0nziQziOwPn__xi-e24E2DCH2_Ion3jE6L5wMiW_8J0pD5Bk0_l25q9hUO0NjNMxMy1AiSP15vjhiRzW_QhHO_ZVbwrdT8q5cGjI8OkYc-UrhW1uFPNZPyM_BHZb1ydoNln3RneFSZGDpA4-tKBzTWEsysBeMQyZmUB2h-bcAwVd4xDpoPeOTki1OG_C8VQvy9T_c64drKroohxuj2duPxlNVDuKweoAmBd4Bmjui7cIPtE_6gj68RNZ50HyL4QTcXrxiu3AYayThg4cKV3fprp19hfBbuhEdjPdJV4K0K5VdiC5U23njvrh85gnsCUwvFnDbXQjR17TWGv_WkAiFdBbL3fAaaA6_w4i33_vzTgv21-l2403U7RuU7KmPGeOnYbS_hZn5ml9cv9Y_dyhmMsijUMZRF-Mzs0IbAxQWXRjeNP7eI5K47ylzXtXB_8Qz3ymRPszzL4yqPaE6jKiE8pasK6BKWKS3zJIpZTOIkTboNuGtRPGJ3Eurr2EI4D70IhgtwDgzmJy14yMMFcNZauGtg3Lor7LSDAaF58clP8AE87WYs8IfeLA9m-z5NZyFkSCyUzzJ3vZOAf2d5MSvXtFzRFZvBOl7GcbQkNM1np3VSEk7imJUrltGcsGUJNGYQJVnKVxmpZmJNIpJElJAoTgnNF1GRL1nMIc6KJM4iQEkENRNyEX6ZaXOcCWtbWOcZIctZqG02dMUIUXDGYdCf4XQ3M-uwYUV7tP6XnbDOXlGccDK003Y-lrybPgrS7ZgJ0x1-mnSKhvWxLwVh6KZpNa4816oUfoTJccFnrZHrPx1nwSef6IPP_w4AAP__54nhPQ">