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

    <tr>
        <th>Summary</th>
        <td>
            llvm.dbg.value left out by IndVarSimplify
        </td>
    </tr>

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

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

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

<pre>
    During `sinkUnusedInvariants` step in `IndVarSimplify` pass, it is possible that `llvm.dbg.value` is left out after loop invariant value is sunk into exit block. For example, if I debugify this test https://github.com/llvm/llvm-project/blob/main/llvm/test/Transforms/IndVarSimplify/sink-from-preheader.ll
```
opt -debugify -indvars -indvars-predicate-loops=0 -check-debugify -S llvm/test/Transforms/IndVarSimplify/sink-from-preheader.ll
```
It produces
```
; ModuleID = '../llvm-project/llvm/test/Transforms/IndVarSimplify/sink-from-preheader.ll'
source_filename = "../llvm-project/llvm/test/Transforms/IndVarSimplify/sink-from-preheader.ll"
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
target triple = "i386-apple-darwin10.0"

define i32 @test(i32 %a, i32 %b, i32 %N) !dbg !5 {
entry:
  call void @llvm.dbg.value(metadata i32 %add, metadata !9, metadata !DIExpression()), !dbg !15
  br label %loop, !dbg !16

loop:                                             ; preds = %loop, %entry
  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ], !dbg !17
  call void @llvm.dbg.value(metadata i32 %iv, metadata !11, metadata !DIExpression()), !dbg !17
  %iv.next = add nuw nsw i32 %iv, 1, !dbg !18
  call void @llvm.dbg.value(metadata i32 %iv.next, metadata !12, metadata !DIExpression()), !dbg !18
  %cmp = icmp slt i32 %iv.next, %N, !dbg !19
  call void @llvm.dbg.value(metadata i1 %cmp, metadata !13, metadata !DIExpression()), !dbg !19
  br i1 %cmp, label %loop, label %exit, !dbg !20

exit:                                             ; preds = %loop
  %add = add i32 %a, %b, !dbg !15
  ret i32 %add, !dbg !21
}

; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
declare void @llvm.dbg.value(metadata, metadata, metadata) #0

attributes #0 = { nocallback nofree nosync nounwind readnone speculatable willreturn }

!llvm.dbg.cu = !{!0}
!llvm.debugify = !{!2, !3}
!llvm.module.flags = !{!4}

!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
!1 = !DIFile(filename: "../llvm-project/llvm/test/Transforms/IndVarSimplify/sink-from-preheader.ll", directory: "/")
!2 = !{i32 7}
!3 = !{i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = distinct !DISubprogram(name: "test", linkageName: "test", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
!6 = !DISubroutineType(types: !7)
!7 = !{}
!8 = !{!9, !11, !12, !13}
!9 = !DILocalVariable(name: "1", scope: !5, file: !1, line: 1, type: !10)
!10 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
!11 = !DILocalVariable(name: "2", scope: !5, file: !1, line: 3, type: !10)
!12 = !DILocalVariable(name: "3", scope: !5, file: !1, line: 4, type: !10)
!13 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 5, type: !14)
!14 = !DIBasicType(name: "ty8", size: 8, encoding: DW_ATE_unsigned)
!15 = !DILocation(line: 1, column: 1, scope: !5)
!16 = !DILocation(line: 2, column: 1, scope: !5)
!17 = !DILocation(line: 3, column: 1, scope: !5)
!18 = !DILocation(line: 4, column: 1, scope: !5)
!19 = !DILocation(line: 5, column: 1, scope: !5)
!20 = !DILocation(line: 6, column: 1, scope: !5)
!21 = !DILocation(line: 7, column: 1, scope: !5)
```

Even though `-check-debugify` is OK with the result, I find it strange that the `llvm.dbg.value` in `entry` block associates the source variable with a non-existing value. I think it should be set to "undef" and another `llvm.dbg.value` should be created (a copy of the first one) after `%add` in `exit` block to reflect the new value.

### More context:
I am facing a verifier failure in `CoroSplit` pass trigged by this.

Before `IndVarSimplify`:
```
preheader:
  %shr.i.i1076 = lshr i64 %316, 24, !dbg !84650
  %or.i.i1077 = or i64 %shr.i.i1076, 128, !dbg !84650
  call void @llvm.dbg.value(metadata i64 %or.i.i1077, metadata !84646, metadata !DIExpression()), !dbg !84647
  ... ...
  
loop:
 ... ...
 
exit:
 ... ...
```

After `IndVarSimplify`:
```
preheader:
  %shr.i.i1076 = lshr i64 %316, 24, !dbg !84650
  call void @llvm.dbg.value(metadata i64 %or.i.i1077, metadata !84646, metadata !DIExpression()), !dbg !84647
  ... ...
  
loop:
 ... ...
 
exit:
  %or.i.i1077 = or i64 %shr.i.i1076, 128, !dbg !84650
  ... ...
```

After `coro::buildCoroutineFrame` and spilling materializable instructions across suspension points
```
preheader:
... ...
  %or.i.i10772788 = or i64 %shr.i.i1076, 128, !dbg !88824
  %shr.i.i1076 = lshr i64 %272, 24, !dbg !88803
  call void @llvm.dbg.value(metadata i64 %or.i.i10772788, metadata !84646, metadata !DIExpression()), !dbg !84647
  ... ...
  
exit:
  %or.i.i1077 = or i64 %shr.i.i1076, 128, !dbg !84650
  ... ...
```
`%or.i.i1077` is sunk into exit block but its `llvm.dbg.value` is left out. When building coro frame, materializable instructions are reconstructed. `%or.i.i1077` is reconstructed at the beginning of the block containing its user `llvm.dbg.value`: https://github.com/llvm/llvm-project/blob/main/llvm/lib/Transforms/Coroutines/CoroFrame.cpp#L2675. This triggers an assert

```
Instruction does not dominate all uses!
  %shr.i.i1076 = lshr i64 %272, 24, !dbg !88803
  %or.i.i10772788 = or i64 %shr.i.i1076, 128, !dbg !88824
``` 

Even though I think the spilling code can be improved in this case, `IndVarSimplify` is where things go wrong. 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdWVlz2zgS_jXyC0osEtRBPfjBtqIt1WQyW5VM5jEFkqCENQSwAFCO59dvN3iIpBWN5XF2qjaRCeLq40N3owGmOn--XVdGqB2ZLEIr1OPvqrI836ojM4IpZ6GZWMdLIhQO2ar8KzOfxaGUonjGzpJZO6EPRDgiLCm1tSKVnLg9czhByuMhyNNdcGSy4jgBRkleOKIrR1jhuCFSa6TfsCR-JA6zlXqEdqcJ_w7kU6mzx4BstIE6Awm451uQLcl5Wu1AIGAL8xy3juydK-0kvpvQDfx2wu2rNMj0ASooU1NMS6P_wzMHVSCfQnFgQp3GICkovhimbKHNAVTdjDCgG8RtWhiN1Pies5ybQMpJuJ6Ed6Bx8_NVXToy7aSdCpWD1rZ7QQK5yJjjUwQF5F-HZJrtefbYm_WZ_CTpto4AHnmVcXu2fxLfk1-hX_LtmoBsZEKXQfASyncQjy5rllZXJuPfCiG5YgfecKU_iyutuTpmdtyRnDkm2TNaasOXT0uwqZieHlMRQZng31Qkp9doAWXzmIrhjMWsrS1m02LQVwz6jr7WPKbHiCLx7jllIbyEDZkk7PeNVXFGgMO0aog4WUxZCS3TnJknoaIwCLsp9TPnhVDghzElk1lYo5r4Gp0z73n1e9p7_zShKygjcHgs5mSyvK-pceXMM7qjrxGSMSnJUYsciY-CBE0O3DEEv6XL8hy5dM1AezVuWG8_fIfFhPijwYEBgJX_PfTkieYt-xSiDku5ROLoaaNxiz4Qvj-GSVf8Q09BX7YN4j0m8xqKRhCoi6MfVO5Fre78noT9odCy9nXo8MMDxb-7ZoSPne2AkwLLt-EsjmNUo-gtOC8H6nl5vY6wjkRVT0TZpyHLaEQgeav8HTYDJehblEh6SmSH0isg8MVKd4Zhbf4DCqtrtYgaXi8UiN-iwKpn7QPSL0y_a8CNdkiFhn1f8P3v4gsnbNEoWuPox5c2tpzzX8PdKDb0JI4aiZfrvugoxqZSmQPEyJ1zBrMDojSuTcqyR3gtDOdQ2GeVQVEpCIw5sGK50hAJbcmzSgL-mN88CSlBiMqoNlpmkhn-14vcX8jhO0bOeIA2AylFWkHs9V01fsv7dxCajMGhUSdxVjULFWH0plF4GtuOalORwTjaLEP8YvzB5wxBIdnODufMXspRq5kL6wQsVm3rD_pQQgbwu0LrTCRTu4rtOK7f-o9vH-8-_evbAzLHLAEb0VSw3iQzpm6jrdi40eGeZX8rnTiIP3mOA5ypfEJpKgWt_Cs33regx0djfhDe2X4BeLFxU0m5RoLod63sUavdertBWWjSJi6NCD8vbwERc2GAovb7LPFtG_88yUd76KP7LPtLFY86Z_3O2aizXWxg4FEgW1Vo0oLWAAzjBsYwP7O0n6sUoNgZBhgkPaRqODwdCUrDcn8622kzXfpmVSEQL40AZvu6r7jnsu1cdLM_9kfYcoNm6m1r-_nfWFljJiR83JgsH7rmk_XAtErVgdH7C1oRuDWQzT_pnNumI-kvxeJkKgCBgRwThn9B8WiCUraTlv1Jy7739IBNhl7VbgRRu612vjl0ztVJho8YUr7iCSz1dttbiWiMNK7kNUgjIj0fCU9c75kVWaN0f-2fIQFumALA2Br7GleZzuG02nj-3ZcP3yplxU7hIvRYRK9SjF6rWHxZMfoqrvG1XGeXucav4jq7lut8zHU24Dp7xSImozVMrlnC-VAtV-c5AxPLtKwO6uS5Q9V6tBYXadGraC0v0oqvopVcpDW7itbqIq35NbRoeJHW4ipa0UVay9fTGl1F-OeHI1fE7XW12-Nl0-impLlt-u0XSHzcHsZxCMu2kj7D3YLlQ6IkHLEOttxdc2WFg85fW_n7r_rsBlV_GUWYtToTDBM0nFhfVpBj44E1WwZZmZpC4oy73q6-3QqAvdsLvN4C_iC_zEkK8_GgrtF5KgXHbygJAxmZ0kDdnJfrNDuDpM9xyD5pwgDT8pnowotVCGMdgWwQc8z6yg1xrFPnk2qY2neagRiGFxLyCU9C8adG8mG2Ftc_8quG3DfTyuFhqD3lbwk7kIJlqDYjR25EIYB3wYSsYHjN9kEb_RnSG9deJuJVxW4HeqT1dd6A4z0vkNO5m8iO7chSukSpd_sAutu9CUQgonBZRwcJDUQsZtgX18kBnQ0PFslsMQ97JHRLoY4Jupvfo-0PtzS5QOi1Z8Oa9Inn-EQIRGeLNxwTcV53Xg-CAP86JfsXIE3jcMjgWHhuxFm_vWuN8J9exf8_8N_PMK9YxgycGEWI79JKyBx92uezG4P5ADg2hjELRziJseAAYQoipBR_-igpFETgyp_LLWGZ0Rav_uHgqhA4UmqB3yFeZxRjCPtY0GWSXItHkoD5vM7c6JKeNbckCeO_a24o-v_O5P4Rg_IbUs_B6r373CcgklYO9k37l5-XAvLHHvIDb5Jod2ilpPAmibBdskKDqQLsZ3UbzwPyAwEHo0iTQKR8J5RCls0OXMuN-yMcCrEdxa_sD_Z0zH3e5_OVFOn4SqHzzbbifTTIyhL28Y90sZwH5Iv_iua3YQNgKMxzuHGDrX_05eiEHsk1pEOQssDLQShAmaDVg7Z20l7NvYszvaNzd9qQH2WXbb7m07w2kMFJBrIewAeyL9jCjD6CDQhVf4XMmPV2dvarKfQ_QUrHPdWdJTtNnoxWu4Dc5LdxvopX7MYJJ_nt0DpOn04hOxqSvamMvL3abIS1lTeFOWC-uNnfpmm4TGazWZ6GdLFI05TzfJHROI_gJV-ubvxdsb2dzO-7KzVVaDzqzdc34paGlIZz-E_nizAKVkm0Wi4yRmk2i9MkhrjHwUZl4PXSZndjvIpToGMxKEKabE-dYHh4NOSeHdBnFayHuWWlllI_Pd148W-97P8FQKbGLg">