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

    <tr>
        <th>Summary</th>
        <td>
            InstCombine drops debug value info towards end of function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            debuginfo
      </td>
    </tr>

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

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

<pre>
    The `InstCombine` pass removes debug value info for `is_annotated` towards the
end of the function, and this is then propagated throughout the whole function.

## Versions

* Clang: version 17.0.0 (https://github.com/llvm/llvm-project.git 20f650b231e324bdee619a57efef87c7b5d56b36)
* LLDB: version 17.0.0git (git@github.com:llvm/llvm-project.git revision 55e2cd16095d64e9afca6e109e40ed95d735dc7f)

## Compiler Explorer

* [Optimisation pipeline view using x86-64 Clang trunk (may change over time)](https://godbolt.org/z/Wh73d6Mzn)

## Program source

```c
int get_name_prio;
int b(void);
int main(void) {
  int is_annotated;
  if (b())
    is_annotated = 0;
  else
 is_annotated = 4;
  if (is_annotated)
    get_name_prio = 2;
 return 0;
}
```

## Debug info view

```
$ clang -fno-discard-value-names -fno-inline -g -O1 -c -o example-O1.o
$ llvm-dwarfdump -n is_annotated example-O1.o
0x00000067: DW_TAG_variable
              DW_AT_name        ("is_annotated")
 DW_AT_decl_line   (4)
              DW_AT_type        (0x00000047 "int")
```

Location for `is_annotated` is missing throughout the function.

## IR before `InstCombine`

```llvm
define dso_local i32 @main() local_unnamed_addr #0 {
entry:
  %call = call i32 @b()
  %tobool = icmp ne i32 %call, 0
  br i1 %tobool, label %if.then, label %if.else

if.then:                                          ; preds = %entry
  call void @llvm.dbg.value(metadata i32 0, "is_annotated", metadata !DIExpression())
  br label %if.end

if.else:                                          ; preds = %entry
  call void @llvm.dbg.value(metadata i32 4, "is_annotated", metadata !DIExpression())
  br label %if.end

if.end: ; preds = %if.else, %if.then
  %is_annotated.0 = phi i32 [ 0, %if.then ], [ 4, %if.else ]
  call void @llvm.dbg.value(metadata i32 %is_annotated.0, "is_annotated", metadata !DIExpression())
  %tobool1 = icmp ne i32 %is_annotated.0, 0
  br i1 %tobool1, label %if.then2, label %if.end3

if.then2: ; preds = %if.end
  store i32 2, ptr @get_name_prio, align 4
  br label %if.end3

if.end3: ; preds = %if.then2, %if.end
  ret i32 0
}
```

## IR after `InstCombine`

```llvm
define dso_local i32 @main() local_unnamed_addr #0 {
entry:
  %call = call i32 @b() #3
 %tobool.not.not = icmp eq i32 %call, 0
  br i1 %tobool.not.not, label %if.else, label %if.then

if.then: ; preds = %entry
  call void @llvm.dbg.value(metadata i32 0, "is_annotated", metadata !DIExpression())
  br label %if.end

if.else:                                          ; preds = %entry
  call void @llvm.dbg.value(metadata i32 4, "is_annotated", metadata !DIExpression())
  br label %if.end

if.end: ; preds = %if.else, %if.then
  call void @llvm.dbg.value(metadata i32 poison, "is_annotated", metadata !DIExpression())
  br i1 %tobool.not.not, label %if.then2, label %if.end3

if.then2:                                         ; preds = %if.end
  store i32 2, ptr @get_name_prio, align 4
  br label %if.end3

if.end3:                                          ; preds = %if.then2, %if.end
  ret i32 0
}
```

## IR diff before and after `InstCombine`

```diff
@@ -1,8 +1,8 @@
 define dso_local i32 @main() local_unnamed_addr #0 {
 entry:
-  %call = call i32 @b()
-  %tobool = icmp ne i32 %call, 0
-  br i1 %tobool, label %if.then, label %if.else
+  %call = call i32 @b() #3
+  %tobool.not.not = icmp eq i32 %call, 0
+  br i1 %tobool.not.not, label %if.else, label %if.then

 if.then:                                          ; preds = %entry
   call void @llvm.dbg.value(metadata i32 0, "is_annotated", metadata !DIExpression())
@@ -13,10 +13,8 @@
   br label %if.end

 if.end:                                           ; preds = %if.else, %if.then
-  %is_annotated.0 = phi i32 [ 0, %if.then ], [ 4, %if.else ]
-  call void @llvm.dbg.value(metadata i32 %is_annotated.0, "is_annotated", metadata !DIExpression())
-  %tobool1 = icmp ne i32 %is_annotated.0, 0
-  br i1 %tobool1, label %if.then2, label %if.end3
+ call void @llvm.dbg.value(metadata i32 poison, "is_annotated", metadata !DIExpression())
+  br i1 %tobool.not.not, label %if.then2, label %if.end3

 if.then2:                                         ; preds = %if.end
   store i32 2, ptr @get_name_prio, align 4
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWNtu2zwSfhr6ZiCDIiXZvvBFHP9ZBOiii6LYXhqUSMnsSqSWpJykT78gLUU-pRs3aYsCv5CDTXKGc_q-ocislZUSYonSFUrXE9a5rTbLr-aJKTvJNX9aft4KQBm-V9bd6iaXSqAMQ8usBSMavRMWuMi7Cnas7gRIVWootfEy0m6YUtoxJ7gXcvqBGW7BbQXCa4RvhOKgS_8dyk4VTmqFyC0wxcFtpQUZ1ipojW5Z5dWA2xrdVVvduSD2sNX1KDzdq-3_EooIhX8LY6VW9njqBm5rpipEb2C3XwDxbIqnGBCZb51rLaI3iNwhcldJt-3yaaEbRO7qejf8i1qjv4rCTSvpgOAyS3FOaCwoSXIuRBYvWDoTpSjns2KWpzzNcpohshhN-PBhvTq3wKtDZF5JhxJ8sDm9eWlzI3YyKEhTQQoeZ3iR8iwRC1YWLBMxXogEC75I-YymvJiVoxWHkbrVTStrYeCvx7bWRpjTkKF09bF1spGW-WhDK1tRSyVgJ8UDdFaqCh7nWZQl--iCM536j3emYU9QbJmqBOidMOBkI7wR6fo83JrnunZTbSpE7r4hcvdlO6M8--c3ddnsfxldGdaA1Z0pxNGCDO9_iv13qRxUwm0Ua8SmNVIjuhpnckTmOy253-VwvGFSjVOAZv0cgJ89qnE6TpXeba_SqxvsBoAjAUB0DfhATNS29-B8XXKm_mjvwz2OnAzCZBQ2wnVGHWyLZuuTeF2I8jpgPKDbZ_timAeBBIqQ_qhUOuLSFszwKNBD5K2y-wmpQu1EFUQfY4gKiDSIR9a0tYg-xlM9agsFzx-YKXnXtBCp4-CcC-FHHJ5s5uG1_rL5fPOPzY4ZyfJajGEan_WXzc3nELJhJGSOHEeYjEHeC3BR1JvgRRBIjpJwqt09tYfaBxuTGfiNlDvUfzETH3Sxx90L9CotNNIGFJ6w5Pf48f4T5KLU5gLLX0xyIKEwxEXpXedWb2pdsBokJYAS3APGgyWMbzrlI8s3jHMDiFA8gkgoZ5489vuwIZIWrK5DzYYPvc4BSeMyp3Ot9wtl0bSgxH7tXoFvI3hYnRuQ8Sjj52qWi9oPyXLqW8zp2AjEngj6ZfQktd97EF1BawS3wUhE0r2zvVHBO08q3j0f1CnPq2lAiSdM4RhnjgWfsLfuUjXewvM6ROL1_V-PrRHWhjZ6Qjy5OfZP8RP3gse_xb3kl7inuPfuzOjB82DCczWMZXZolD8d0DW0W7kvtXQ1pGYQhNDRbsNUMk75HcLU9cE5M-EdgvWMhPgSfM63ewlI8SUkkTMoKU4vQIm8mI4hdwDWeV7ydgWtrTM-YMct3J8Xa1kpSF6uhdP9w9AL2z_7cGaNEa6H4-vb5v0nYKUT5k8gVy_dR2rM8VRp53_HShH_fS3RDrIXyfUSCV8m3L959E_n0SucaLW0-7fAt3vymlq8mrJ-OK2_ltreZOe7cyCXZTkcM_3b_TWc6GX7oQSjBEPk-84cEFn1H8Jwb-F78CYcE2f0ymNpdN25NHrrwZSsrqH0YfnVtB4E35HZ4f3P0r-2CTyXIUXkNsahEOl5Jf4_MoWRTd-G1pd4N_pZB9joN59gox8-wp5j7uozLFn9hnZ2DQZf1dHgJ7S0H-ppJ41jwpeUL-iCTcQyzmazeTJPkvlkuyzYbMFylpeLLMtYTGnBSo7xgs-TNKULMpFLggnFFNOYYpzMp2VRzEnGZiyjZUxYihIsGibraciYNtVEWtuJZRbHKZ2EYNlwD05IuNCWqtQ-S-l6YpbhCirvKuszLq2zoxYnXS2WB40MuNHthVvx4fq7v_UeLmUmnamX1105I3IXbLeI3AXz_xcAAP__Jkm5lw">