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

    <tr>
        <th>Summary</th>
        <td>
            LLVM's DWARF associates instruction from caller with source from inlined callee
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            wrong-debug,
            debuginfo
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          hubert-reinterpretcast
      </td>
    </tr>
</table>

<pre>
    Consider the following program:
```c
__attribute__((optnone)) void f1(int x) { }
__attribute__((always_inline)) inline void f2(int *p, int x) {
  *p = 42; // moved outside of loop
  f1(x);
}
__attribute__((optnone)) void f3(int *p) { }
int main(int argc, char **argv) {
  int q;
  for (int x = 0; x < argc; ++x) {
    f2(&q, x);
  }
  f3(&q);
  return q;
}
```

Compiled with `-O3 -g`, the store of `42` is moved outside of the loop to just before the call to `f3`: https://godbolt.org/z/oYx7YqMhj
```asm
.LBB2_3:
 mov     dword ptr [rsp + 4], 42
        lea     rdi, [rsp + 4]
        call f3(int*)
```

However, the `lea` instruction, which corresponds to `&q` in the call to `f3` is associated with line 3 (`*p = 42`) in the DWARF:
```
Address            Line   Column File   ISA Discriminator OpIndex Flags
------------------ ------ ------ ------ --- ------------- ------- -------------
0x0000000000000000      1      0      0   0 0       0  is_stmt
0x0000000000000004      1     43      0   0 0       0  is_stmt prologue_end
0x0000000000000010      6      0      0   0 0       0  is_stmt
0x0000000000000015      6     44      0   0 0       0  is_stmt prologue_end
0x0000000000000020      7      0 0   0             0       0  is_stmt
0x0000000000000023      9     21 0   0             0       0  is_stmt prologue_end
0x0000000000000025      9 3      0   0             0       0
0x0000000000000027      0      3 0   0             0       0
0x0000000000000030      4      3      0   0 0       0  is_stmt
0x0000000000000037      9     29      0   0 0       0  is_stmt
0x0000000000000039      9     21      0   0 0       0
0x000000000000003b      9      3      0   0             0 0
0x000000000000003d      3      6      0   0             0       0 is_stmt
0x000000000000004a     12      3      0   0             0       0 is_stmt
0x000000000000004f     13     10      0   0             0       0 is_stmt
0x0000000000000053     13      3      0   0             0       0 epilogue_begin
0x000000000000005a     13      3      0   0             0 0  end_sequence
```

```
ranges.o:       file format elf64-x86-64

Disassembly of section .text:

0000000000000020 <main>:
 3d: c7 44 24 04 2a 00 00 00       movl    $0x2a, 0x4(%rsp)
      45: 48 8d 7c 24 04                leaq    0x4(%rsp), %rdi
```

Similarly, the `lea` instruction is represented as being inlined from `f2`:
```
0x000000b0:       DW_TAG_inlined_subroutine
 DW_AT_abstract_origin       (0x00000059 "f2")
 DW_AT_ranges        (indexed (0x0) rangelist = 0x00000010
 [0x000000000000002b, 0x0000000000000037)
 [0x000000000000003d, 0x000000000000004a))
```

Clang version info:
```
clang version 22.0.0git (https://github.com/llvm/llvm-project.git 7694856fddbb3fed10076aefec75c9b512cc352e)
```

Partial IR:
```
for.cond.cleanup:                                 ; preds = %for.body, %entry
  store i32 42, ptr %q, align 4, !dbg !52, !DIAssignID !61
  call void @f3(ptr noundef nonnull %q), !dbg !62
;   ...
!52 = !DILocation(line: 3, column: 6, scope: !53, inlinedAt: !59)
!53 = distinct !DISubprogram(name: "f2", scope: !1, file: !1, line: 2, type: !54, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !56)
; ...
!59 = distinct !DILocation(line: 10, column: 5, scope: !60)
; ...
!62 = !DILocation(line: 12, column: 3, scope: !33)
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykWF1z46jS_jXkhooLgz6sC18o8ev3pCp7Zmpn62ztlQsJJDOFQQGUj_31pxqk8Uc8mZmzlCsI6H5onga6Cfde9UbKNcrvUL654WPYW7fej4104dZJZYJ0g5Oh5T7cNFa8re-t8UpIh8Ne4s5qbV-U6fHgbO_4AbEakRoVJP1aROrdjofgVDMGudshukJ0ZYdgrJGIVohW-NkqgbsloitlAn6FLlTeYVRurmtz_cLf_E4Zrb5hpMYERScoROsB0Xt8CotIjeMARmyDM4rYHUZ0i-gWH-yzFNiOAdaHbYe1tUOUj8YBAmIA8F3Lrq2LnRlzujToPXBlJgHu-hasbffcgTSiNXf986ndIPaUbMC4syCWOIuLIbAW-LxPWHFld4jena0dJ34QLZ5gtuOq8GQWTjYngW9jTobRmXn2JPnNzfBN6nt7GJSWAr-osMeoILefGL7tYZzex-3ig3WRWVSQjKKCYOXf0w6SQD0OFn8dfcCN7EAP-luuNfSjgnQMkFmN9yEMHjZedGNvRWN1WFjXI7r9G9Gt_eu1_Ovpt_3XU5O5PyBSLx7v7uiOpV0LlgA_WLxYJ_AQHEb5nfMD0IgzlG9gHRmdaISiJY-1EwrGLsWPgtHueS9E51bvCfyXfZHP0s1soYJoySNLxgc3tkFZA4Mve9XucWudk36wRviJkeiyKH6VKyCbe29bxcPspXhqGOyjqH88FtCqZqTNn_Xv24ujjUhdC-Gk9_ikPAIexvdWjweDt0pD6-FLjTfKt04dlOHBOvxpeDBCvuKt5r1HpL59V_D3KnxN7KIXkZq8kouSDFymihwrMjegVn7nwyFcA8hOATL2MQDch9r2o9xJI66gLSeV4n81Z5mfAmTZPzOHTirlrEiORuEzEz-2ik60VPEvXf4Uzg-Ny2fQM9Kvgl5TL89k2C-qs2kwm9V_1VOsPOOk-nWA6oLUawDX9JpTvY_Iu6otztSKH1L_wQqydEsu6Q8t-QmsLmElkCX5J1g5O8X6GbvkoNJWbWSvzDVI_rOQBGNpxM7Lp1GaVr4PB6dNx00v_cJCvEulg7u1s-7AA5a6K7Lb11VxW2RJd6M8914eGv0GIdXLGDzwIsjXMF3kpL44JwRSh5iQsP-bIiITMGFbwgVDM0wyTDkmZPqlcrDPGmpEM_JKOQQo8prFDCJ3fkiRLolmOcBlK7wSuGwnxIuiJX-KBF1gQHilOQTad0R9UQeludNvH0ZOCH9ODk56aSD-cY8bCalryh0F7pw9xGBJU2JxMdHs6YYcnbD5c_dH_f9TKip2fmycHQOkpaSGwfqPHW98cLwNO-tUr8ykiOhqxssrjCiFpIxOXCXF5HJ8VFAQMqWYdCE8RxGtfEj53wS4BGshF3l3EzbJOZf30zTtFQ0mrmlkPGW4V1JAzU2Pn6XzkXDT2fc8tmcylC7IgvQKEuTVRSanwn5sFq09ILrV-nmubgdnv8o2LECrLKpslRedEE3DOimWhJQFl51sy7ytmnxJ25blVF419zN3QXGNH35_b2Zn3aK1RixaLbkZh6PTv18g5R6cFD76A9EcQODVNO1eaYJ7i6chZcKKUci16H1KNmkeU3KuVW9wlnSWoumhyunU3jzU8dH2ABMsi2WEi6lefG-gjMQ0EwCNHY2QHTbWmFHraYLqHLiAfBYMx3ixWMA3TDYtYLl5eLQtT4nnKr63WI1ZfKbEFA-aBTR9a4c4COosvbrioajD3DtvGRCI-EL5oEwb0kRfxmZ-RNKV4YcJbT4Z51MsoQOuwNP2bF-UDm9He7Jv6o-nIl3MPlmNNw-QiH52NlhQExiV91NnrfU919pvJOSvjYwHwg_bo-qXz9DYyE4ZFe-ZpJy6Pw1BHdTfSW00aiYjPomcDBwo-rcV0s-2FhNL7O7EH9UVvq44JsEePZNf0haz-kv04mNvL-k5KLsEZezicN2INRMVq_iNXC_LPMsrVhTkZr8WvG0ZXzWkbFeSiopJJhhlbSXbvCgrcaPWlNCcrEi5rEiZkUW-orJYVayVTSOycoUyIg9c6QVcBPDGu1Hej3K9zGleFjeaN1L7-N8MSl-cNf2tkM3Ypx2EKI2teC9RivLNjVvHG6UZe48yAlepP0IHFbRcPz7-5zdES59eQccXlD8LLjF4wDGULr2svB1dK1P_HGHiuLwZnV7_2lWH6Dau0yO6nZb6vKb_DQAA__9sL541">