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

    <tr>
        <th>Summary</th>
        <td>
            InstCombinePass makes value of constant variable not available when debugging and InlinerPass on SCC then drops it entirely
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          dcdelia
      </td>
    </tr>
</table>

<pre>
    In this minimized C example, variable `l_141`, defined within the scope of function `a`, is not available on the call site upon calling the externally defined function `test`. This happens at every tested optimization level (`-Og/-O1/-O2/-O3`). 

With opt-bisect-limit we found out that there are two passes involved in this information loss: `InstCombinePass on function (a)` and `InlinerPass on SCC (main)`. If we stop the optimization pipeline right after the former, variable `l_141` will be marked as optimized out instead of having the correct value available. If we stop the optimization pipeline right after the latter, variable `l_141` will even disappear from the list retrieved with the frame variables command in lldb.

We tested clang and lldb 14.0.0 commit 116dc70 on x64.

```
$ cat a.c
void a()
{
    char b = 0;
    short l_141 = 2;
    int l_149 = 3, l_151 = 0;
    for (; b != 9; b = b + 1)
    {
        test(l_141, l_149, l_151);
        l_141 = 5;
    }
}
int main()
{
    a();
}


$ cat lib.c
#include <stdio.h>
 
void test(int l_141, int l_149, int l_151) {
    printf("%d %d %d", l_141, l_149, l_151);
}
```

LLDB trace:
```
$ clang -Ox -g a.c lib.c -o opt
$ lldb opt
(lldb) target create "opt"
Current executable set to '/tmp/opt' (x86_64).
(lldb) b 8
Breakpoint 1: 2 locations.
(lldb) r
Process 172 launched: '/tmp/opt' (x86_64)
Process 172 stopped
* thread #1, name = 'opt', stop reason = breakpoint 1.2
    frame #0: 0x0000000000400510 opt`main [inlined] a at a.c:8:9
   5        int l_149 = 3, l_151 = 0;
   6        for (; b != 9; b = b + 1)
   7        {
-> 8            test(l_141, l_149, l_151);
   9            l_141 = 5;
   10       }
   11   }
(lldb) frame var
(int) l_151 = 0
(int) l_149 = 3
```

**IR before** `InstCombine`:
```
define dso_local void @a() local_unnamed_addr #0 !dbg !7 {
  call void @llvm.dbg.value(metadata i8 0, metadata !11, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i16 2, metadata !13, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i32 3, metadata !15, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i32 0, metadata !17, metadata !DIExpression()), !dbg !18
  br label %1, !dbg !19

1:                                                ; preds = %6, %0
  %2 = phi i16 [ 2, %0 ], [ 5, %6 ], !dbg !18
  %3 = phi i8 [ 0, %0 ], [ %10, %6 ], !dbg !18
  call void @llvm.dbg.value(metadata i8 %3, metadata !11, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i16 %2, metadata !13, metadata !DIExpression()), !dbg !18
  %4 = sext i8 %3 to i32, !dbg !20
  %5 = icmp ne i32 %4, 9, !dbg !23
  br i1 %5, label %6, label %11, !dbg !24

6:                                                ; preds = %1
  %7 = zext i16 %2 to i32
  %8 = call i32 (i32, i32, i32, ...) bitcast (i32 (...)* @test to i32 (i32, i32, i32, ...)*)(i32 %7, i32 3, i32 0), !dbg !25
  call void @llvm.dbg.value(metadata i16 5, metadata !13, metadata !DIExpression()), !dbg !18
  %9 = add nsw i32 %4, 1, !dbg !27
  %10 = trunc i32 %9 to i8, !dbg !28
  call void @llvm.dbg.value(metadata i8 %10, metadata !11, metadata !DIExpression()), !dbg !18
  br label %1, !dbg !29, !llvm.loop !30

11:                                               ; preds = %1
  ret void, !dbg !34
}

declare dso_local i32 @test(...) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local i32 @main() local_unnamed_addr #0 !dbg !35 {
  call void @a(), !dbg !38
  ret i32 0, !dbg !39
}

[ . . .]

!13 = !DILocalVariable(name: "l_141", scope: !7, file: !1, line: 4, type: !14)
```

**IR after** `InstCombine`:
```
define dso_local void @a() local_unnamed_addr #0 !dbg !7 {
  call void @llvm.dbg.value(metadata i8 0, metadata !11, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i16 2, metadata !13, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i32 3, metadata !15, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i32 0, metadata !17, metadata !DIExpression()), !dbg !18
  br label %1, !dbg !19

1:                                                ; preds = %6, %0
  %2 = phi i32 [ 2, %0 ], [ 5, %6 ]
  %3 = phi i32 [ 0, %0 ], [ %9, %6 ], !dbg !18
  call void @llvm.dbg.value(metadata i8 undef, metadata !11, metadata !DIExpression()), !dbg !18
  call void @llvm.dbg.value(metadata i16 undef, metadata !13, metadata !DIExpression()), !dbg !18
  %4 = shl i32 %3, 24, !dbg !20
  %5 = icmp eq i32 %4, 150994944, !dbg !23
  br i1 %5, label %10, label %6, !dbg !24

6:                                                ; preds = %1
  %7 = ashr exact i32 %4, 24, !dbg !20
  %8 = call i32 (i32, i32, i32, ...) bitcast (i32 (...)* @test to i32 (i32, i32, i32, ...)*)(i32 %2, i32 3, i32 0) #3, !dbg !25
  call void @llvm.dbg.value(metadata i16 5, metadata !13, metadata !DIExpression()), !dbg !18
  %9 = add nsw i32 %7, 1, !dbg !27
  call void @llvm.dbg.value(metadata i32 %9, metadata !11, metadata !DIExpression(DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_stack_value)), !dbg !18
  br label %1, !dbg !28, !llvm.loop !29

10:                                               ; preds = %1
  ret void, !dbg !33
}

declare dso_local i32 @test(...) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local i32 @main() local_unnamed_addr #0 !dbg !34 {
  call void @a(), !dbg !37
  ret i32 0, !dbg !38
}

[ . . .]

!13 = !DILocalVariable(name: "l_141", scope: !7, file: !1, line: 4, type: !14)
```

The second call to `llvm.dbg.value()` intrinsic has `undef` as first parameter when called with metadata `!13` (associated with `l_141`), thus making the variable not available during debugging.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWd1v2zgS_2ucF8KCviU_-CGJWyBADi3uit1Hg5Jom1dZ0pGUk-xffzNDSZYcO02yQXf3bt1Utsj55m-GIzGri6flXcXMTmq2l5Xcy99EwW6ZeOT7phQz_5YduJI8KwWbxW659kIPvnG8EBtZAfGDBG4UIZjO60awesM2bZUbWVfIwzt60FDVhvEDlyXJqy1TzsuSaWkEaxsYwltZbWlKPBqhKhh4GrSNJRuhDXw57Buav-NNIyrNuGHiINQTw2ngqBuDbnHiKmGqZDM_Bb75l-3M_zz_4tHVp2tAxi4cNnNXM_faXn8FD1HMPJNa5GZegjzDHgTb1G0FCloD1nK8CCUYh__moWYN11poJqtDXR7ADtmFWVabWu07c2qtZ8E1OnNXaXNb7zPw8itwYnSOvvopB6uAinFQSNQQJKF6yn_d3iLRnsvK0jnsboMWalM3FMpJFBrZCORnSm53sCQbCDNRoWVCXVp1WGpYqkywPVffwSOue7HCRkGCD4IXiIAdP_SrmNdKQdhAZNmK4_q_08SSG_MjE2GRK1ZIjYjgim1Uvbe8UhumhFFSHDrkWrcV34tBngaL93sMNCxZWRaZMwGD6IGVlxw8RDokYl7ouI5LvIAOz4uLPHFxcR7jcCIBIWb_7K0fAujBRSe3A4daQmwRo7CUliS5sT8YfPIduJSxWbBi7iwYTehdrQyjSNCsP5mVlZ1b0FyAAYTbyDsjCFBAKRLcoB7fQ4pFdwc_ceyGeYN1yDKxED-Um35q18XqCheDUuQNTjiOhkeTuVmy6qPQ_UBXLNQvhKgPXi_mKGJ87eJeyqyP_MwPZJWXbQGYCm61KWTt7GbBp07yaHk69_qgkotDhEc35Oo0Oo2CuQ1ZCDUngnTuLzRwy14Rs6NDJ1ii6_396oYZxXMBteUy5gi-8y-PbL5F8NlAsHmNiXgkI2yPRlIcQKcMV1thWK4Eh9oNtiMReEB0ty3kPIRAPIq8NZSlGohNDYQJVFqzb-BKHAli7TGN13GIlfeZnoylduwGNH1vaoysh0XTh_KZU7XQz7mUHfmq6lxAjfQSoOZQT3eioIL7shXPmbFKNcDb6bmGuqGw1AFkaK0qrCAIXhBlBeIo1Tag01jEMXVGLjj-KOOoAIEsF41zH93hE7pu5Lm0ALGLoGez6EZS9S9m0Ypx1pWO4BoS9vqYklGfV69P_LhneXsBSHrWAepzyBuWstHnTSVhMea8UBogLr3S1XHQm9SMIyKGIj_MQGRwYhyN51ND3C7nG8AB_u7-CVsjRE7Y25M9HVkuJKNtbVih6zUCumRUYWah25Uxgnm5bivEWLHmRaEIKrgyRbbFr2RcYqih6mWU5WHvAJVDuy_2CMLwghvOZMqoLxsGQI7nnY6s7j49NgqyANKsq6o-LdpRuZe-VbMXM_-Z6uCnqA589kyRF_0s1c8Dnvwu1ZmCqpZRRxt5J0SLMUSpYL7xgwkPlhS6q2tRbDVEbq8efvs02ewkrSrUJruySAV3K_oNg1E3GA-DZ7yB-eAoLiVG95w09NZ9jcTXpwLq_uOyAQP5wQkBIkMKpoanqN5D3IABh1Mef7yeEfHIfN8wqEmIWRSEDCea_GAEQukRLxXzHo_x5M47gacfjuEZfwQ8vZEbCQ3-Rq538e19PxKlRETLZB1Nu9hMvxzHoT5EmpzD84Mlwy87QbU-pIfRTsUPJNH-sBjERElHYQtTVyZOox29A1XPytrvh5TdDGELYpV-mMDjdH2TERds1MhmFDRgPdOCgpWecL0vc72P3sheqKsDExlV1tDgwU0waQi8d5Tby3CGB1aKxNSOoE-g6bNNIaCvV-NuguJt8Tlg9kJL4U26GjDoc_8G4toYRW8qqrqtHiQ887YP1NZfaGE6pcentFc0MUF0sYvpH-imEUjHERq21xHB4myIcAdx8B9uHJM2DhKkiz7A5R4N_qV7JwD60XD76OB3LSzlNL3zsuN2M9_Isr-3bS52f3BPWWKeBmLv-KDxcldJ7z7-bir_bir_H5tKrCOvayrPNpEd-6UucvGxTWRbQdr9cfA_r_6j2shd3yXZRtkPX9dFiv9M24TIXSzCRXjK_aNu0m7x0-byJ3eTXO8UHozkZuLRi4H4k7SYPcW0xcSCH_yF-szkxT7zDRWzz_w3penq1_WXr-v7-1_-sc7r6iCUQQYbdZi7_vYJdlMtt_hizg6dIU9fpNaG59_Xncnv7U_7lnrSn_rTwu3-hP60f2P2v9Ofhm_sT5NxhM71p-lfuT_9hge-ArBd2Fjgu_34eeJ155ayMkoC4HO24xoJ7WaFJ5oaTFJQ2RqOb2jxnO9hJ-xBcH9Id0xLPJ7F-hLjyqRc6zqX3PR0kyNqWg6zazXb8-_9YeRwaDg9iy5ahRSFyNrtFn45V8UyKBbBgl8ZaUqxPD2eBZFCd0ea9YZBGCB5K3NJPnk0SKdDwzNHuIaoVN1oJg0TlZFKlE9XrSqXO2MaBPjM_wx_W3C2zZy83sMNhrz7mjeq_rfIIZE-S61boeFHFMHuerVbZlkSuH7MN_kmzcIE1jeM3DCByyLMxEZcUUXRS4AfAO9KLn3X993QjxHJYeRweMiNhIgXcSLC1HUB9gLyp3RoyWu1vVJLsgGc1FiCpTb6OAluYrUTvXzeml2tlkVeiFLyKzJ3Sbb-FzDR19Q">