[PATCH] D150967: [MemCpyOpt] precommit test for memcpy removal for immutable arguments from attributes (NFC)

Kohei Asano via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun May 21 03:58:45 PDT 2023


khei4 updated this revision to Diff 524092.
khei4 added a comment.

add `ret void` and update tests (Sorry for being noisy...)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150967/new/

https://reviews.llvm.org/D150967

Files:
  llvm/test/Transforms/MemCpyOpt/memcpy.ll


Index: llvm/test/Transforms/MemCpyOpt/memcpy.ll
===================================================================
--- llvm/test/Transforms/MemCpyOpt/memcpy.ll
+++ llvm/test/Transforms/MemCpyOpt/memcpy.ll
@@ -391,3 +391,74 @@
 
 declare void @f1(ptr nocapture sret(%struct.big))
 declare void @f2(ptr)
+
+declare void @f_noattr(ptr)
+declare void @f_fullattr_immut(ptr nocapture noalias readonly)
+declare void @f_noa(ptr noalias)
+
+; TODO: remove memcpy, which is guaranteed to be invariant
+; before and after the call because of its attributes.
+define void @immut_param1(ptr align 4 noalias %val) {
+; CHECK-LABEL: @immut_param1(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    [[VAL1:%.*]] = alloca i8, align 4
+; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VAL1]], ptr align 4 [[VAL:%.*]], i64 1, i1 false)
+; CHECK-NEXT:    call void @f_noattr(ptr noalias nocapture readonly align 4 [[VAL1]])
+; CHECK-NEXT:    ret void
+;
+start:
+  %val1 = alloca i8, align 4
+  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %val1, ptr align 4 %val, i64 1, i1 false)
+  call void @f_noattr(ptr align 4 nocapture noalias readonly %val1)
+  ret void
+}
+
+; TODO: remove memcpy
+define void @immut_param2(ptr align 4 noalias %val) {
+; CHECK-LABEL: @immut_param2(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    [[VAL1:%.*]] = alloca i8, align 4
+; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VAL1]], ptr align 4 [[VAL:%.*]], i64 1, i1 false)
+; CHECK-NEXT:    call void @f_fullattr_immut(ptr align 4 [[VAL1]])
+; CHECK-NEXT:    ret void
+;
+start:
+  %val1 = alloca i8, align 4
+  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %val1, ptr align 4 %val, i64 1, i1 false)
+  call void @f_fullattr_immut(ptr align 4 %val1)
+  ret void
+}
+
+; TODO: remove memcpy, cause union of attributes on call-site
+; and palam shows immutability of arg ptr.
+define void @immut_param3(ptr align 4 noalias %val) {
+; CHECK-LABEL: @immut_param3(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    [[VAL1:%.*]] = alloca i8, align 4
+; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VAL1]], ptr align 4 [[VAL:%.*]], i64 1, i1 false)
+; CHECK-NEXT:    call void @f_noa(ptr align 4 [[VAL1]])
+; CHECK-NEXT:    ret void
+;
+start:
+  %val1 = alloca i8, align 4
+  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %val1, ptr align 4 %val, i64 1, i1 false)
+  call void @f_noa(ptr align 4 %val1)
+  ret void
+}
+
+; can't remove memcpy because if the call doesn't specify the alignment,
+; then it is some target specific value that we can't know.
+define void @immut_param4_no_align(ptr align 4 noalias %val) {
+; CHECK-LABEL: @immut_param4_no_align(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    [[VAL1:%.*]] = alloca i8, align 4
+; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VAL1]], ptr align 4 [[VAL:%.*]], i64 1, i1 false)
+; CHECK-NEXT:    call void @f_fullattr_immut(ptr [[VAL1]])
+; CHECK-NEXT:    ret void
+;
+start:
+  %val1 = alloca i8, align 4
+  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %val1, ptr align 4 %val, i64 1, i1 false)
+  call void @f_fullattr_immut(ptr %val1)
+  ret void
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150967.524092.patch
Type: text/x-patch
Size: 3107 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230521/1d2e3c13/attachment.bin>


More information about the llvm-commits mailing list