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