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