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

    <tr>
        <th>Summary</th>
        <td>
            [DebugInfo] Wrong debug location updates in LoopIdiomRecognize
        </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>
    Hi, I found that debug locations are incorrectly set in two places in Transform `LoopIdiomRecognize`. The first place is in [processLoopStridedStore](https://github.com/llvm/llvm-project/blob/2425e2940eb4f24de296ada92e25d6aad9578cd0/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp#L1122), and the second place is in [processLoopStoreOfLoopLoad](https://github.com/llvm/llvm-project/blob/2425e2940eb4f24de296ada92e25d6aad9578cd0/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp#L1421). These two places give the debug location of a `StoreInst`, which is in the loop body, to an `CallInst` in the loop preheader, resulting in a confusing single-stepping behavior. 

The following are the demonstrations of these two bugs. (We use the latest LLVM to demonstrate.)

This is the C source code for processLoopStridedStore:
```C
void fun(double *a) {
 for (int i = 0; i < 1000; i++) {
        a[i] = 0.0;
 }
}

int main() {
    double a[1000];
    fun(a);
 return 0;
}
```

This is the C Source code for processLoopStoreOfLoopLoad:
```C
void fun(int *__restrict__ a, int *__restrict__ b) {
    for (long i = 2047; i >= 0; i--) {
        a[i] = b[i];
    }
}

int main() {
    int a[2048], b[2048];
 fun(a, b);
    return 0;
}
```

We use the following commands to compile this two programs:
```Bash
$ clang -S -emit-llvm -Xclang -disable-O0-optnone test.c -g -o test.ll
$ opt -S -passes=mem2reg,loop-rotate,loop-simplifycfg,loop-idiom test.ll -o test-mem-idiom.ll
$ clang test-mem-idiom.ll
```

Then, we use lldb to debug the executables:
```bash
$ lldb a.out
(lldb) b fun
(lldb) r
(lldb) s
```

We will get the following results:
```
(lldb) b fun
Breakpoint 1: where = a.out`fun + 8 at test.c:3:14, address = 0x0000000000001148
(lldb) r
Process 1126789 launched: '/home/hs/llvm-test/a.out' (x86_64)
Process 1126789 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
    frame #0: 0x0000555555555148 a.out`fun(a=0x00007fffffffbfb0) at test.c:3:14
   1 void fun(double *a) {
   2        for (int i = 0; i < 1000; i++) {
-> 3 a[i] = 0.0;
   4        }
   5    }
   6   
   7 int main() {
(lldb) s
Process 1126789 stopped
* thread #1, name = 'a.out', stop reason = step in
    frame #0: 0x000055555555515c a.out`fun(a=<unavailable>) at test.c:2:32
   1    void fun(double *a) {
-> 2        for (int i = 0; i < 1000; i++) {
   3            a[i] = 0.0;
   4        }
   5    }
   6   
   7    int main() {
```
```
(lldb) b fun
Breakpoint 1: where = 1423`fun + 8 at 1423.c:3:14, address = 0x0000000000001148
(lldb) r
Process 1862058 launched: '/home/hs/llvm-test/LoopIdiomRecognize/1423' (x86_64)
Process 1862058 stopped
* thread #1, name = '1423', stop reason = breakpoint 1.1
    frame #0: 0x0000555555555148 1423`fun(a=0x00007fffffffbea0, b=0x00007fffffff9ea0) at 1423.c:3:14
   1    void fun(int *__restrict__ a, int *__restrict__ b) {
   2        for (long i = 2047; i >= 0; i--) {
-> 3            a[i] = b[i];
   4        }
   5    }
   6 
   7    int main() {
(lldb) s
Process 1862058 stopped
* thread #1, name = '1423', stop reason = step in
    frame #0: 0x000055555555515f 1423`fun(a=<unavailable>, b=<unavailable>) at 1423.c:2:34
   1    void fun(int *__restrict__ a, int *__restrict__ b) {
-> 2        for (long i = 2047; i >= 0; i--) {
   3            a[i] = b[i];
   4        }
   5 }
   6   
   7    int main() {
```

>From the results, we can see that the debugger first stops at the loop body and then goes back to the loop header (the `for` statement), which makes the debugging confusing. This issue can be simply solved by dropping the debug location of the newly created `CallInst`, because the `CallInst` is placed in the loop's preheader, *i.e.*, it's out of the loop.

Later, I will give a patch to this issue.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWFFv67oN_jXKC5HAke3EfshD2txgBTrcYb3Y3Vsh23SiHdkyJLk93a8fKNlJmiZde07PwzUKN5JFiuRHfZIorJW7FnHF0huWbiaid3ttVutOl3ts7aTQ1cvqb5LxW7iDWvdtBW4vHFRY9DtQuhRO6taCMAiyLbUxWDr1AhYdyBbcs4ZOiRIttf4worW1Ng2wRXSvdXdXSd38E0u9a-V_kS2iGfyxR6ilsS7IgfSSLL3pjC7RWhJ7cEZWWD04bZClG8azvXOdZfGa8S3j2510-76YlbphfKvU0_hv2hn9Hywd49tC6YLxLU94ijxPIiySmicV8nwhKpFz5Gm1EKLK02VWVtGJHklyB08s49uHUihhGN--dWlWdh3j8f18zjnjOYVR-BAiWCx1W73rpTb4e00_77Wo_iKOJnzOeO5xtHiK_04-oXf8deqArkFQPnh371rr2CKiOD3vZbkfAkNiSusOKB3po9MgWpK6FUoNQq8Gdgb3KCo0NNqg7ZWT7Y6GCCh1W_eWmvRSOLUOu47aBe7Fk9RmBizasGgd3j4ltVL6mcZQpgc3Gt1aZ4YFoGvqHVwu-p2dAePZnwi9DeOVcGgd3N__6-9k_lEcZ5QZr-Yjr62XugWre1MilLoiKwxcWwfxIE3h83-3of2kZQV13zKeVbovFALja8F4Dmx5E4Z4vYxnsnUggcUbiFh843_ewjyKQovxG_93Kjg8gqU3kqWbIDuj8cMAttwMZh1--DdN1QhJVr3ROJhJSv3k6eaoD2DwhTw4dht0vWnhOPFxujEc1yP88F6EX6_BDwSZPGN8_fho0DojS_f4CIKy8NKH4o3zAxRKU7b6ePIoWY5w_HYEZzr9_1AUQ-NV_H4EEvpGmnmUZJ6Ibr3usXlQf8Dm1rv2at5PYnSydI6Lr9RNI9rK0goqddNJRSMISSIao3dGNPYtSjfC7ocunkCpRLuD6QNMsZFuSnwH038PvZW0olA4_T2a6s61ukWgdTsrYbqDqQ4NpY7adOe8rk5Yi5bFmwYbbnDH-C0x0dRoJxyOLSubTsn6pawPAyQR6ah3nGLaYBO-vJosGHltwOVUx9bTaQinUlUR6IdImIKL37HsHfl8IXDFq8B5YTHTvRv7MuqibCk89Oe95k2PfR_xZ6kU7NCdwR4I_IJ979lxY1B86zSl7pzFa3jeo0G_LIILi6juW2D8BjIQbkCZxeuYxet54rfqqjJobWC179HJM58n2TVv_xHoA-ZzvlhmOSjRt-UeiTyA8SXj271ukP7ZcbumuRnfBrv4kgjge7Z4XCSHneFcqXW667AabViD2xsUFTAez8n0VjTBV8aXo1rqJzkwKKxuA0OcBGk2P6Eh4xXwOCKzg_Pp-MyT7DSGfsXHmzBoWYenqIuIgnIhsuMkc_jI3gTAR2770W1qyuLfIH5nlwJIxjkOpAQA6XnHgtpjYwnXGPNtvv8q-OjkArL9KG5peQE3Ft_2rXgSUhEJ0B5zBhsn6PgJbAAfQc5H_aexA4AYTp4vB3HY3S7ieEYzP8c684TH56RDfV9LOtmCR2n2CdK5cA_jW2_r-0Q0TPSZTB60fikPHaN6mYZQROE0cv4l91_ySyhcy_SfO9qdL4VPH_EGGru2GC4d9j66Ij64Hq7z2tdmw2dprX6bBhdYLWTBNbo7JIGnu1-SBBcZ8UdO-l-SBF_Dif69NXSC3ePhoBYOnKVowSKGitHh6r9DM1R4CHYLw7fD_X6skLSw02ihEOU3OrEexoR7PYWOugh0bej6b-mc3WDrhkJLKCA04hvak8nDLWIoAMxguAnaPlhbIPgT-gtYrZ6wguIFKqNDdeBy8YJ6W3xWL1AaFA6rs7KEzzssxXiZOS9a2FAgqU7LF4wv7esSBuNrOcMZ42ufas6P0L0bLSCp2Skk98IFybvhUC2fEAR0wpX7EM7R8UFsUq3iKo9zMcHVfBllaRbFcTrZr7JFwfN6gcmyXOa8WGZ5HtVpuqjzolzEeTaRKx7xJOKcR2mcpcms5Mt0nhfLDIu5yKqIJRE2QqoZ7TszbXYTP_Eq42nGJ0oUqKwvQHLe4nOwinHO0s3ErPxeVfQ7y5JISevsUYuTTvnK5YZQuWtrTcvgT0Mr6gyovquEC1XItxvepDdq9enKmjeTdlPvxv8CAAD__zlcCDM">