<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/136506>136506</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[WebAssembly] `DEBUG_VALUE`s not collected for non-first defs
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
SingleAccretion
</td>
</tr>
</table>
<pre>
In writing a test for an unrelated issue, I came across this code:
https://github.com/llvm/llvm-project/blob/842e5915778a820c63cf38b75bec932a6ea8c18b/llvm/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp#L29-L44
This means that any non-first defs of multivalue instructions will get their `DEBUG_VALUE`s dropped. The reproduction is something like below:
```llvm
target triple = "wasm32-unknown-unknown"
declare {i32, i32} @extern_func_multivalue(i32, i32)
define i32 @single_non_dbg_use_multivalue(i32 %0, i32 %1) !dbg !15 {
%full_value = call {i32, i32} @extern_func_multivalue(i32 1, i32 2), !dbg !27
%full_value_one = extractvalue {i32, i32} %full_value, 0, !dbg !27
%full_value_two = extractvalue {i32, i32} %full_value, 1, !dbg !27
call void @llvm.dbg.value(metadata i32 %full_value_two, metadata !16, metadata !DIExpression()), !dbg !28
%partial_value = call {i32, i32} @extern_func_multivalue(i32 %full_value_one, i32 %full_value_two), !dbg !28
%partial_value_one = extractvalue {i32, i32} %partial_value, 0, !dbg !28
%partial_value_two = extractvalue {i32, i32} %partial_value, 1, !dbg !28
call void @llvm.dbg.value(metadata i32 %partial_value_two, metadata !17, metadata !DIExpression()), !dbg !28
ret i32 %partial_value_one, !dbg !29
}
!15 = distinct !DISubprogram(name: "single_non_dbg_use_multivalue", scope: !1, file: !1, type: !7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
!16 = !DILocalVariable(name: "value_used", scope: !15, type: !9)
!17 = !DILocalVariable(name: "value_unused", scope: !15, type: !9)
!27 = !DILocation(line: 27, scope: !15)
!28 = !DILocation(line: 28, scope: !15)
!29 = !DILocation(line: 29, scope: !15)
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2, !3}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "LLC", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "test.ll", directory: "")
!2 = !{i32 7, !"Dwarf Version", i32 4}
!3 = !{i32 2, !"Debug Info Version", i32 3}
!7 = !DISubroutineType(types: !8)
!8 = !{!9, !9, !9}
!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
```
```bash
> llc test.ll -mattr=+multivalue -target-abi=experimental-mv -O0 -o - --filetype=obj | llvm-dwarfdump -
```
```dwarf
0x0000000b: DW_TAG_compile_unit
DW_AT_producer ("LLC")
DW_AT_language (DW_LANG_C_plus_plus_14)
DW_AT_name ("test.ll")
DW_AT_stmt_list (0x00000000)
DW_AT_low_pc (0x00000002)
DW_AT_high_pc (0x0000002c)
0x00000022: DW_TAG_subprogram
DW_AT_low_pc (0x00000002)
DW_AT_high_pc (0x0000002c)
DW_AT_frame_base (DW_OP_WASM_location 0x3 0x0, DW_OP_stack_value)
DW_AT_name ("single_non_dbg_use_multivalue")
DW_AT_type (0x0000003b "int")
DW_AT_external (true)
0x0000003b: DW_TAG_base_type
DW_AT_name ("int")
DW_AT_encoding (DW_ATE_signed)
DW_AT_byte_size (0x04)
```
We should expect to see the variable record for at least `value_used` (`value_unused` looks to be getting dropped earlier).
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykWN9vo7gT_2vIyygRMUkgD3nIlmZVfXu3K7W7fUTGDMS3xka2adr767-ygYSkafd6V6ESjOczPz4zYxtqDK8k4iZYfgmW6YS2dq_05oHLSuCWMY2WKznJVfG6uZNw0NxyWQEFi8ZCqTRQCa3UKKjFArgxLQbkBu6A0RqBMq2MAbvnBpgqMIi2QeiuvbWNcU9kF5Bdxe2-zWdM1QHZCfE83KaNVn8hswHZ5ULlAdklC4LL9XwZxwlNSMhWESujJI-XObJ1ROgKacLmST7C4e7hkeoKHc4T5ltjsM7F6_lTinlb_aSixT-opBXqGWuagET3ZD29Xyw6sx-dIzVS6XyiFqh8BanktOTaWCiwNKBKqFth-bODAi6N1S1zQTRw4EJAhRbsHrmGYBWmt19-fM1-bu9_3Aar0EChVdNgMYPHPYLGRquiEwZuwKga7d6FX_BfCDkKdegDugq7y_scbq33FqzmjUAIohQCQg7U1BGZtvKXVAc53ANCOtcKZIJqhCD-wiPiOHS3OIVgEeKLRS2zspUsOzkXkGQ0k6wHnJJLdENO0vhEyqSSWZFXWWvwDQAEZBn2KO73PCBrCMi8yCt3my-dSUG4BfeybIXIutA6txgV4tMWw3zQ5q0mNyNtJHaazhRlSnbK8MVqymyv_Y3SsYwbD3-PbA_q3yDPryF3sXhWvHD-u0SYFXk1G_yu0dKCWjpE-dwKB3ic4YK-uhxJ725fGo3GcCUDkvjAXcYuGVhqqLac_nei3vAwSpNLB64ac2nLP-fyTOwandfx_zGjb_AvSfX4n-P0jSlvaI3_Pa0a7XU9PS0jAd8J4rTrB30JRykU3Fgume30PrR5o1WlaR2QRNLarQ2uTf2mY_gwGqaafv7cx63k4uzZvh7fe5dLQSu33EB6txO0-q6VVW5O4dGa3en1w3f3kLomxq0Pyg20ktseLez7nCuRvrHO07t7xaj4STWnucBzd7oYtcapemv78sLY9Qk-_gy8_LwCcqGgczYRXPq5JL6GNcgmH8smH8muP5ZdvyvrxY9FwNoBxy0Pjpku4_optSpagTNP_PlE0mdrNE7R8EqG3qi64QJ_OPZJIqisWlp5q9Kn7H7759fsJmtEa7p_88W1ROxWcNQ9Xff3Nz1L3HxrLK_531i4dyUVxpeRbqXlNf5E7Usy2naNB2vua_R_XPr5u1YIv2PpElhw65_upOCSy-oM0qXLo0udQfhPX7JDop3o2HGfXs6HUYq5nd5MiN7ugmtkVunX_q2_BmpHgXatIu4jHRCSHqguYfCKDM0QFkfWogthMhJ2rsGdLNUVhOiIMErohzbXqrVc4qPLfZK4EjA9McnR4OQ8M4bGd7oP0KOc_UINZz3qKEpc2qH--N9-sOv4KJkqekbSp2z7eJv5HXfRGzHs3Ma_c2r27jm6BSEY9ATAtKbW6iBKA_JltMWcdru9Kc15EKX40qDmNUpLxbR-hum3EKYKpjCdOl67VpCq_C8I4hvwm-zCcVO0dQPT9yzyU4JwG76E3V_e-_O4_Zqxrk4y3ybD3s1syHwAtyVIRsm_9uvJ-K-TGCrMTX-vwt6TdUwMI522cdquT2YZW9tMcGO7iUeHwg_sUoesYWezP_Biz6u9mw7nCgg7drHjEBkF0ZyWw0vcCzsuDD9376T9iu7rsKWmNWY5NUPgv33PnrYPf2Si784QvkQQvvg-1L02lrJfw9blfWRPSsfG71f192Fczo7difJxwb0v120tqfCxsHqwdcRANE5jFwGv62N_Ril2ZkKvsy936GN5We_XgfNXi5nrG72bi7fN4QnB7FUrCnAVzixYBQbRHSXhud8agEamdNEdyy0IpMa6U-ZoD7IKve3HMTmMCqV-GQeaozui-lN-fxoFpFpw1AFZzybFJirW0ZpOcDOPF8t5Eq6j1WS_yROMExazkoXxYlWuYoaLBSmwJIvVMs8XE74hIVmGCxKSkCTL1SyJVwvEkISLeRSzOXGHgZpyMfPrt9LVxH9N2Myj1TJcTQTNURj_nYIQiYfhWwMJlulEb3wny9vKuI0yN9acYCy3wn_gGJ_9l-m187dUFpgSApnFLo7np_tJq8Xm098uvKUmILvelecN-X8AAAD__5NcG8A">