<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">