Skip to content

Commit 0c4f326

Browse files
authored
[MemCpyOpt] Combine alias metadatas when replacing byval arguments (#70580)
Fixes #70578.
1 parent 133e50d commit 0c4f326

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1864,6 +1864,7 @@ bool MemCpyOptPass::processByValArgument(CallBase &CB, unsigned ArgNo) {
18641864
<< " " << CB << "\n");
18651865

18661866
// Otherwise we're good! Update the byval argument.
1867+
combineAAMetadata(&CB, MDep);
18671868
CB.setArgOperand(ArgNo, MDep->getSource());
18681869
++NumMemCpyInstr;
18691870
return true;

llvm/test/Transforms/MemCpyOpt/memcpy.ll

+14
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ declare void @f1(ptr nocapture sret(%struct.big))
393393
declare void @f2(ptr)
394394

395395
declare void @f(ptr)
396+
declare void @f_byval(ptr byval(i32))
396397
declare void @f_full_readonly(ptr nocapture noalias readonly)
397398

398399
define void @immut_param(ptr align 4 noalias %val) {
@@ -709,6 +710,19 @@ define void @immut_param_noalias_metadata(ptr align 4 byval(i32) %ptr) {
709710
ret void
710711
}
711712

713+
define void @byval_param_noalias_metadata(ptr align 4 byval(i32) %ptr) {
714+
; CHECK-LABEL: @byval_param_noalias_metadata(
715+
; CHECK-NEXT: store i32 1, ptr [[PTR:%.*]], align 4, !noalias !0
716+
; CHECK-NEXT: call void @f_byval(ptr byval(i32) align 4 [[PTR]])
717+
; CHECK-NEXT: ret void
718+
;
719+
%tmp = alloca i32, align 4
720+
store i32 1, ptr %ptr, !noalias !2
721+
call void @llvm.memcpy.p0.p0.i64(ptr align 4 %tmp, ptr align 4 %ptr, i64 4, i1 false)
722+
call void @f_byval(ptr align 4 byval(i32) %tmp), !alias.scope !2
723+
ret void
724+
}
725+
712726
!0 = !{!0}
713727
!1 = !{!1, !0}
714728
!2 = !{!1}

0 commit comments

Comments
 (0)