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

    <tr>
        <th>Summary</th>
        <td>
            Invalid lifetime intrinsic after MemCpyOpt
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    This is followup to https://reviews.llvm.org/D155406

Here is reproducer for issues caused revert e0f9cc71cb6f4eb2e1566177e05425c497759dc6.

Thanks to [@joanahalili](https://reviews.llvm.org/p/joanahalili/) for reproducer.

Cpp: https://gist.github.com/vitalybuka/b6361a44762ad3cf0c3e7ce47a09512f
IR before transformation: https://gist.github.com/vitalybuka/86a2bdc17d8e074da8839baacea4ec94

```
 define void @_ZN6rClass6refineERKNS_6paramsE(ptr nocapture noundef nonnull readnone align 1 dereferenceable(1) %this, ptr nocapture noundef nonnull readonly align 1 dereferenceable(1) %p) local_unnamed_addr #0 align 2 {
 entry:
   %c = alloca %class.vec, align 8
-  %b = alloca %class.vec, align 8
-  %ref.tmp = alloca %class.vec, align 8
   %ref.tmp5 = alloca %class.vec, align 8
   %h = alloca %class.vec.0, align 8
   %0 = load i8, ptr getelementptr inbounds ([8 x i8], ptr @linearVal, i64 0, i64 3), align 1
@@ -3506,18 +3504,17 @@
 
 _ZN3vecILj3EdEC2Ed.exit: ; preds = %cont2.i.i
   %conv4 = fpext float %sub to double
-  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %b) #9
+  call void @llvm.lifetime.start.p0(i64 24, ptr %ref.tmp5)
   %cmp = fcmp oeq float %sub, 0.000000e+00
   br i1 %cmp, label %if.then, label %if.else
 
 if.then:                                          ; preds = %_ZN3vecILj3EdEC2Ed.exit
-  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %ref.tmp) #9
   call void @llvm.experimental.noalias.scope.decl(metadata !7)
   br label %cont.i
 
 cont.i:                                           ; preds = %cont.i, %if.then
   %indvars.iv.i = phi i64 [ %indvars.iv.next.i, %cont.i ], [ 0, %if.then ]
-  %arrayidx3.i = getelementptr inbounds [3 x double], ptr %ref.tmp, i64 0, i64 %indvars.iv.i
+  %arrayidx3.i = getelementptr inbounds [3 x double], ptr %ref.tmp5, i64 0, i64 %indvars.iv.i
 %arrayidx.i = getelementptr inbounds [3 x double], ptr %c, i64 0, i64 %indvars.iv.i
   %1 = load double, ptr %arrayidx.i, align 8, !noalias !7
   %div.i = fdiv double %1, %conv4
@@ -3527,12 +3524,9 @@
   br i1 %exitcond.not.i, label %_ZdvRK3vecILj3EdEd.exit, label %cont.i, !llvm.loop !10
 
 _ZdvRK3vecILj3EdEd.exit:                          ; preds = %cont.i
-  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %b, ptr noundef nonnull align 8 dereferenceable(24) %ref.tmp, i64 24, i1 false)
-  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %ref.tmp) #9
   br label %if.end
 
 if.else: ; preds = %_ZN3vecILj3EdEC2Ed.exit
-  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %ref.tmp5) #9
   call void @llvm.experimental.noalias.scope.decl(metadata !11)
   br label %cont.i12
 
@@ -3548,8 +3542,6 @@
   br i1 %exitcond.not.i17, label %_ZmlRK3vecILj3EdEd.exit, label %cont.i12, !llvm.loop !14
 
 _ZmlRK3vecILj3EdEd.exit:                          ; preds = %cont.i12
- call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %b, ptr noundef nonnull align 8 dereferenceable(24) %ref.tmp5, i64 24, i1 false)
-  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %ref.tmp5) #9
   br label %if.end
 
 if.end: ; preds = %_ZmlRK3vecILj3EdEd.exit, %_ZdvRK3vecILj3EdEd.exit
@@ -3562,8 +3554,9 @@
 
 cont4.i: ; preds = %cont4.i.preheader, %cont4.i
 %indvars.iv.i23 = phi i64 [ %indvars.iv.next.i26, %cont4.i ], [ 0, %cont4.i.preheader ]
-  %arrayidx.i.i24 = getelementptr inbounds [3 x double], ptr %b, i64 0, i64 %indvars.iv.i23
+  %arrayidx.i.i24 = getelementptr inbounds [3 x double], ptr %ref.tmp5, i64 0, i64 %indvars.iv.i23
   %3 = load double, ptr %arrayidx.i.i24, align 8
+ call void @llvm.lifetime.end.p0(i64 24, ptr %ref.tmp5)  # BAD BAD BAD BAD
 %arrayidx.i25 = getelementptr inbounds [3 x float], ptr %h, i64 0, i64 %indvars.iv.i23
   %conv.i = fptrunc double %3 to float
   store float %conv.i, ptr %arrayidx.i25, align 4
@@ -3599,7 +3592,6 @@
 
 cont7: ; preds = %_ZN3vecILj3EfE5clampEff.exit
   call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %h) #9
-  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %b) #9
   call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %c) #9
 ret void
 }
```

So the transformation eliminates 2 allocas and keeps %ref.tmp5.
Before transofmation: %ref.tmp5 was alive for the loop on "cont.i12".

But after transfomration we start lifetime of tmp5 at _ZN3vecILj3EdEC2Ed.exit: 
and end lifetime inside of the loop cont4.i: 
And the next iteration of the loop will be bad.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWM1u4zgSfhr6QkSQKOrv4EMcJ9jG7PYCPYM99CWgyFLMbprUUrSTvP2CkhzRjpw4mUZjgySyLNYPq-r7WCrWdfJBAyxRtkLZesF2bmPsci8dU8_17idb1EY8L__ayA7LDjdGKfO4a7EzeONc26H0GpE7RO4s7CU8dpFS-21k7AMid-sky2ico3iN4uvh_z_AgtdjobVG7DhY3BiLZdftoMOc7ToQ2MIerMMQNxXnRcLrvKFQE0iyPE-KAuKMkozTqiiySvA8Cg38tWH6Z-fd8xui8Q_DNNswJZVE2RqR8l2vW0TuQim_ruq9nJw-MnnTtii9PgnHg-xc9CDdZldH3GwRuZtCishdnad5wigtcsJEypuYp1BwoAWLqywhzaD5yzdcQ2MsYGeZ7hpjt8xJoz9srswZqQVPClFCXFDByjKtasY4MAq8ouF2UB6Pv_0tFtBIDXhvpMCIxvffv-b2RrGuy23_5PbbH1__vM9bZtm2u0WkbJ3F2nDWup0FrM1OC2iwNlrvlMIWmNBGA2ZKPmicYAEWGrCgObBaASJl4gOOSOY2skPkBr-v0Gj1fIHC1l-V4Uzd77RmWxD3TAiLEUnjUZxgVKzGnYN29tmHeLjFXgXHKF1jpryW_t5HItoD944OKsph_VW_vv7gegtN5LbtxVI4lMo-KLY5tz6Kz0jEvYQyTGBZHnLzAA4UbEE7fyd17TPUYURKlK1K_OSXeuwNqxGNldTA7H-Y8t_JnOL48CFFpJpMJ2NF0hjRGF-lWZwjcpOUGJFVmsXU3xR4eDx6OV7uv39N98C__PNHeitub8itiOBJOg8clK5wa8E7mK77XRvtSCQjeZRno_e0X9G08ORwowxz_kG3qz27CLPztXXIHGdKvUCkJxMlG3ByC1HnmHVRGyNS-h0SOpX0UMC-SoYCTatxw2T1OZVBKfhAhvsZa6rxHwz892hDXjyO4v4HEFnF8YtobbFMRgV-mWI19C7LJnIb0KffgergOBWHhalXd-HPqxydy-cviv8YtOMs4Dm18NSClb7WmYq0YUqyLuq4aSESwBUi5RYcE8x5QCVFmIXaTpHyNfdScONl_O4jcZov5kj6LQY5CupAarFntovkPpK9TLuRPfJQtjp5ruFpUjXoxSOO_eL42Ej_KCAyZi17luIpHe2cI4lsleKnA5wClgiScsIRJ7sIIPMrzWaX2Q1tftokv9BWv8NkouBR16Ro8iTk7z5PyVisQ1kG-sRLKTRC7kedvaEp9Xt6ysSk8ORLBibuMVUdE3FAHR6p3GgRaTMW1AsO7r-L_bc_AmiPuA7XhCWdDNg2pvU3ySvWn9f2FqTOIeg8s2xhy9vnqI39r8zpS8tz3JeM0Z9pR3y4qpH2D1T0YdkTdAy0JhPcMM_AB9p5mxpBi08SY8hlnvW1eEX6_Ukwd97-Hi7PfjmZJ8nbbJ6QoxhMWKEegmPTQgkiN_mFUPHnxxFYtuoysCRkFi70FC7z-j4Bl8Per_7f8ZL9HsC8rr5LEKPFGcCczfsbFHpShDmZijCb4eugCaFDFzKbahrJqLWwASbABr0BDQ_E8Ogi6UVtBsmPlc11Gq_sn-s5fDNP6CcP4_q9w5ik8y3H37J6addxMD6c3elFvYB369X7nPf-45V-UuG-xPHqeh3-zfVFJLsgLP0byXFUNh8Lh-9UDr1M6-xO86CdSf1r22DjINI5Y2F6ExrEZ0NIsimAr3qhyr-yFgO0qhl-D6BVvHsiNrf-NXzb3jZNgOPZ42s-WQP3n9DS5piP_i7L1Rccrh9Qx0_UWXC9rkP8ivXsaGr4_6fBbnM6IcOg5FZq5qDDZJxwdJhpgX8CtF1Yx-MsbxUM2kwzzdnC6cqj16HkHvpxoLfaH61GY0TIdPKSo_HgaucwaxzYg4tbO7j4CLjvZ_AhUtg0uLfD3JsDjF6t3wtoMQlL3Ukx6Dg4FpJ5L3StRf_Ucy6WDkZPQplHqRSuAddMjNtYiGUqqrRiC1gmeUWLJEkJXWyWNCspgZLWQJoya0jZ8CppGGecNkIkzUIuSUzSuEpoUsQlpRFwKJusZCmUeQ6CIBrDlkn1Mn9d9JPgZZ7TOF3052XXT6YJ0fA4jIkRIShbL-zSy1zVu4eunyh1bpriLpx0CpZf9J4peRQiZ32Y-JiQf8H2pn3-d-sWO6uWpxPVYJjqFY-Xq9aaH8AdInfD1BqRu97d_wUAAP__CqPc5g">