<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60640>60640</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
IndVarSimplify loses track of debug value from loop body
</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>
`IndVarSimplify` seems to lose track of value of `y` (the main value being assigned in the loop body).
## Versions
* Clang: version 17.0.0 (https://github.com/llvm/llvm-project.git 91a6df3068fc45872e4db43141b0a439b2cf122d)
* LLDB: version 17.0.0git (git@github.com:llvm/llvm-project.git revision 55e2cd16095d64e9afca6e109e40ed95d735dc7f)
## Program source
```c
int example(int n) {
int a = 2;
int y = 0;
for (int i = 0; i < n; i++)
y += a + n;
return y;
}
int main() {
int n = 10;
return example(n);
}
```
## Debug session
```
$ clang example.c -g -fno-inline -fno-discard-value-names -O1 -o example-O1
$ lldb -- example-O1
(lldb) target create "example-O1"
(lldb) b 6
Breakpoint 1: where = example-O1`example + 23 at example.c:6:3, address = 0x0000000100003f97
(lldb) r
Process 43210 launched: '/Users/jryans/Projects/Malleable/Experiments/Debug Info/Issues/basic/loop-unbounded/issue-indvarsimplify/example-O1' (x86_64)
Process 43210 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x000000010c7edf97 example-O1`example(n=10) at example.c:6:3 [opt]
3 int y = 0;
4 for (int i = 0; i < n; i++)
5 y += a + n;
-> 6 return y;
7 }
8
9 int main() {
Target 0: (example-O1) stopped.
warning: example-O1 was compiled with optimization - stepping may behave oddly; variables may not be available.
(lldb) p y
error: Couldn't materialize: couldn't get the value of variable y: variable not available
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression
```
## IR before `IndVarSimplify`
```llvm
define dso_local i32 @example(i32 noundef %n) local_unnamed_addr {
entry:
call void @llvm.dbg.value(metadata i32 %n, "n", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 2, "a", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 0, "y", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 0, "i", metadata !DIExpression())
%cmp5 = icmp sgt i32 %n, 0
br i1 %cmp5, label %for.body.lr.ph, label %for.cond.cleanup
for.body.lr.ph: ; preds = %entry
%add = add nsw i32 %n, 2
br label %for.body
for.cond.cleanup.loopexit: ; preds = %for.body
%add1.lcssa = phi i32 [ %add1, %for.body ]
br label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
%y.0.lcssa = phi i32 [ 0, %entry ], [ %add1.lcssa, %for.cond.cleanup.loopexit ]
ret i32 %y.0.lcssa
for.body: ; preds = %for.body.lr.ph, %for.body
%i.07 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
%y.06 = phi i32 [ 0, %for.body.lr.ph ], [ %add1, %for.body ]
call void @llvm.dbg.value(metadata i32 %i.07, "i", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 %y.06, "y", metadata !DIExpression())
%add1 = add nsw i32 %add, %y.06
call void @llvm.dbg.value(metadata i32 %add1, "y", metadata !DIExpression())
%inc = add nuw nsw i32 %i.07, 1
call void @llvm.dbg.value(metadata i32 %inc, "i", metadata !DIExpression())
%cmp = icmp slt i32 %inc, %n
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
}
```
## IR after `IndVarSimplify`
```llvm
define dso_local i32 @example(i32 noundef %n) local_unnamed_addr {
entry:
call void @llvm.dbg.value(metadata i32 %n, "n", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 2, "a", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 0, "y", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 0, "i", metadata !DIExpression())
%cmp5 = icmp sgt i32 %n, 0
br i1 %cmp5, label %for.body.lr.ph, label %for.cond.cleanup
for.body.lr.ph: ; preds = %entry
%add = add i32 %n, 2
%0 = add i32 %n, -1
%1 = mul i32 %0, %add
%2 = add i32 %n, %1
br label %for.body
for.cond.cleanup.loopexit: ; preds = %for.body
%3 = add i32 %2, 2
br label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
%y.0.lcssa = phi i32 [ 0, %entry ], [ %3, %for.cond.cleanup.loopexit ]
ret i32 %y.0.lcssa
for.body: ; preds = %for.body.lr.ph, %for.body
call void @llvm.dbg.value(metadata i32 poison, "i", metadata !DIExpression())
call void @llvm.dbg.value(metadata i32 poison, "y", metadata !DIExpression())
call void @llvm.dbg.value(metadata !DIArgList(i32 %add, i32 poison), "y", metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_stack_value))
call void @llvm.dbg.value(metadata i32 poison, "i", metadata !DIExpression(DW_OP_plus_uconst, 1, DW_OP_stack_value))
br i1 false, label %for.body, label %for.cond.cleanup.loopexit
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWVtv67gR_jX0y8CCRN2sBz8k8TGQIosNtqenjwElUjb3yKRKUrnsry-Gsiw5VtKToKdFizWCROKMZr658OPEYtbKnRJiTdJrkm4WrHN7bda_mxem7KLU_GVNsvBW8W_M_FUe2kbWLyQLwQpxsOA0NNoKcIZV30HX8MiaTuAFyUKvR-jK7QUcmFRHYSmk2sHRLwepABUarVtAd4QWAQk3JLw6_qYxoTF8E8ZKrey56ApuGqZ2JL6Cx14BojwIA-9371xrSXxF6JbQ7U66fVcGlT4Qum2ax-HPsjX6d1G5YCcdFBHLeB2H2aquknSVU5HwMomjJCpDlsRFSas6opQTWowQ7u4215cI0Byhq510JAknzuOrt5wb8Si9gTQVtOJRFhYpzxJRsLpimYjCQiSh4EXK8zjlVV6PKKaZujd6Z9gBrO5MJc4UsrD_qfp7qRyIZ3ZoG0HoCu8UoQWQ_LqXA-AaAxJvgJL4bPXFr4aT1VobOJqRJ6G_vAHlLwm99j_F8AigGXqNygwvvN4gNMJ1RsHLaYnkm2k06AjbitDVDGrlIUThpcExYox2xvqQpZncbkTZ7cAKi3WaTe2gnkCFnTl4CypY7mBZK72UqpFK9Ndc2ooZvvQ7Y6nYQVhY_hrBUg8PLn-NRpNNw0tYLmdkKxRhGhwzO-GgMoI5AYTSiS6lF-olZP3atRHse6sxdRE289NeGOFzODGQhccbXywaA3NjgCS-ykh8FRN6A4xzI6zt2-A57D8R_orrIr9AYfqVe6MrfCqJaRRCwzpV7QVHNITmhG7_ZoWxhG57ciJ0e9_vHrz8hTWNYCXWdfvluRVGHoTykr5mt6rWhG5vre0ErpbMygp3odbtslOl7hQXnNCtRI2lVPyRGTsQHt1O05hjnz-vsocsOTXzOXbrdNsKPnKE2xvBOBAaR5iff3Si67NLaF7pQ8BazCG287JX9RHfeENgBLO6b-hyUqYgGvdRbdgBqxKHmK5Jyqtc8LrIZ6vot0C8iUKswVwpgaTXunUk3Zw8xW_sfkjAfz7DAikcP2-ywZLEXyDrlS54AQByFJx2MACsTlcFit7iiq_9bgn7HltNi1wMRTyeRk_MKNkfNaMaPDELlT60shEcnqTbg26dPMg_mEMmX4J1om3xwDuwFyjFnj0K0Jw3CB8emZHYs9ZLlXZQCmCPTDa4GlzskxZe-jVhjDYI5UZ3DVeE5hifE0ayRv4hUFKNEgwRz9jT4Tz4xSRejXcI4OT9lSN_ITjozuGRvdFfnkXVOYFNOnF1b0TLjPg6iP9y-_XLc2vOCPMdfr39DUpRa2SemaFjlnD9aeqXuKiRWLnVD42uWAMypkCSSbfjgvI7vQZCU3_aedWHTiH58gckrrE9hHIGUzQ0U8WaBh615GgWHQe83AU-rYSuDsIxzhzr_XrzN8jAComX3sBJTmi0uZ2kxTflZEN8wA09-mA_0Ud49PHyQR-fcCE_GgahaXVoU880sjq0YHfuLP_hoFkakNGgj5KGlaLBhVqbACfPoDFBu78QVVrxoGoEU1077cBXjyGDxNfQGsHtkdnTvn9GqIxzL8K_yj6dAaUToBfQXvudYgrwCBPP0iGENz4XyM4ND-CioKms7Qe-di97fOn1IO2LdHoWJufCa9DvJe1MNpe2tyPsAbxO60sQvgE8nD7h8eL9GFH_2CSuWbfTQI049dfJ7VxXvFOMH6_O2JHzJZNBmL8Z87mRV8FLVb1TzT647HOm_0WnfIxDMcLPcsPHPGHAnyS6Ieq5vc04PybDO_gwM54l9FPIpKpGYN3TFNyQ3eiTxRma6LO8PaHtxl1YTdUcd89S97ukPdLHj_-jd_sbsNoJ8-cc8ucc8v89h8zOIISm4azGMpqo9IR36JpBZTgfkPRGNTprCZ__b4888Wtk9N1J7CNDzafO_J8_9MT_m7POB7Zwq6XV6j8wM5w5-kmc5K1cmd2dtO54bowzxRRE8eM4Nn9_-PX-4e7u2y8PzOx6bqI3cLkcjctt09nxzjpWfX84gv13ZO8HyjTieOgqrax7hfAtTD3d1qyx4idMDgu-jnkRF2wh1lGWp0W2SrJ8sV_naSqqJAwZy3ieF0VCk4hXWVJTWhZplC_kmoY0DmlYRKskT_IgFlGZxCGLVllBaR3hwHBgsgl8HrXZLfw3k-sszJJw4SFb_9KGUi7Kbif9F5yUpJuFWft3C2W3s1gHaZ0drTjpGrE-n2n8Sxw7vsXxBo9fF9VGH8a3M4vONOuPvVgZvlO1hG49-H8GAAD__zVCnvA">