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

    <tr>
        <th>Summary</th>
        <td>
            [MemcpyOpt] Infinite loops when forwarding memcpy on globals
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            llvm:hang
      </td>
    </tr>

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

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

<pre>
    Reproducer: https://godbolt.org/z/GKzGEKE18
```
; bin/opt -passes=memcpyopt reduced.ll -S
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.S1 = type { i64, i16, i32, %struct.S0, i8, i32, i8, i32, i8 }
%struct.S0 = type { i32, i32, i32, i32, i16 }

@g = external global i8
@g_265 = external global %struct.S1

define void @func() {
entry:
  call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr @g, ptr getelementptr inbounds (i8, ptr @g_265, i64 24), i64 1, i1 false)
  ret void
}
```
```
Found roots: %entry 
Clobber starting at access 1 = MemoryDef(liveOnEntry)
  for instruction   call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  is 0 = MemoryDef(liveOnEntry)
Clobber starting at access 1 = MemoryDef(liveOnEntry)
  for instruction   call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  is 1 = MemoryDef(liveOnEntry)
Clobber starting at access 1 = MemoryDef(liveOnEntry)
  for instruction   call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  is 1 = MemoryDef(liveOnEntry)
MemCpyOptPass: Forwarding memcpy->memcpy src:
  call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr @g, ptr getelementptr inbounds (i8, ptr @g_265, i64 24), i64 1, i1 false)
Clobber starting at access 1 = MemoryDef(liveOnEntry)
  for instruction   call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  is 0 = MemoryDef(liveOnEntry)
Clobber starting at access 1 = MemoryDef(liveOnEntry)
  for instruction   call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  is 1 = MemoryDef(liveOnEntry)
Clobber starting at access 1 = MemoryDef(liveOnEntry)
  for instruction   call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  is 1 = MemoryDef(liveOnEntry)
MemCpyOptPass: Forwarding memcpy->memcpy src:
  call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g_265, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 20, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr @g, ptr getelementptr inbounds (i8, ptr getelementptr inbounds nuw (i8, ptr @g_265, i64 16), i64 8), i64 1, i1 false)
...
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWO9u4ygQfxryBdnCg-M4H_whberVaVX1dH2AFbbHDncYLMBt06c_Ybttmts_PWlPWp0iRcDAwPzmN8MoWDgnO41YkPUVAWh8_fR8fCQAZL1fidEfjC2WyVVlmmPxBw7WNGONlvAdPXg_OMJ3BEoCZWeayigfG9sRKJ8JlJ8-P3-6-XyT5ITtCduRjC2_WeRXtJKaQGkGT6NBOIeO8H2PfT0cw5zFYKqJlaLR_bzJC9uhp43wQomjGT0lfE8JAEY94TuMBtgwwnccpiaIyXsxjLJ0aiL5OkggJ3yXQB61OVtGeprKXrZnaXQf1ADeQfFWDgpfYDzl2ZcsjUb9lzaPOlJSj09Rp8fXXUsLa-ftWPv4Ppm2-uOAlGyuaIAE11Qm2dRxCN2JOpum85PFM4GSzf4fRtiZkUX5q12SnRwxtynrpgPwyaPVQtFOmUqoYPpV4Qtk668qnfp6emqDrdRIH4xsKElZO-qaBHq3AeKsgtrbY0iwSaK0Fkq9blDqoY_nZIkHFn4Td_ngLe3Qo8IetQ-S1JUZdeMogXxmK8y-gJ6czlIaGN--LH7jAD0-fvCQIMAcrIS2QjkMC__Wj3D8DyB9Fw6kJ3CSb6Cx6CcwS3BeY392Xd-LZbBOrTE-VIAQ5ClYdF69Vqaq0FLnhfVSd1R4KuoanaNzvt9ib-xxjy2BXMkHvNM3U6zfULUmODlnjjSa_n-iLx1lHyLhwuL3WfwYCRcWfwaLt9hfD8e7wf8u3HTjS2MfhW0CobPrEeE384g6W1-q9n9atS9JfSmwv0ppuLB4KbC_doH9KbDzHxblOI7P_iuvmoI3W74VKyySDfB1ssnXm9WhyFmG2Tpra9FuWpa0GW-AQ5q3LNsKSLYrWQCDlOUJZ7De8E2cbHnCkWG2zWoGkJOUYS-kiieijO1W0rkRi4TBdpuulKhQueVhH1QI35nBy14-i3DFXHiRwvXb4kHobnn52yLMRdXYuRAI6bx7s-KlV9MHg9spNneDJ-s9_U23UkuPVBkzOPp4QB0u9fsEpkYvj0K3Gq0qzr4fSH8Yq7g2PYFyAjV30WDNn1h7AuXkoSNQLk4-FPB3AAAA__-dQgd4">