[PATCH] D117095: [BasicAA] Add support for memmove intrinsic

Evgeniy via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 12 01:34:42 PST 2022


ebrevnov created this revision.
Herald added subscribers: jeroen.dobbelaere, hiraditya.
ebrevnov requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Currently, basic AA has special support for llvm.memcpy.* intrinsics. This change extends this support for any memory trancsfer opration and in particular llvm.memmove.* intrinsic.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D117095

Files:
  llvm/lib/Analysis/BasicAliasAnalysis.cpp
  llvm/test/Analysis/BasicAA/modref.ll


Index: llvm/test/Analysis/BasicAA/modref.ll
===================================================================
--- llvm/test/Analysis/BasicAA/modref.ll
+++ llvm/test/Analysis/BasicAA/modref.ll
@@ -253,7 +253,54 @@
   ret i32 %Diff
 }
 
+define i8 @test_memmove_noalias_locals() {
+; CHECK-LABEL: @test_memmove_noalias_locals(
+; CHECK-NEXT:    ret i8 2
+;
+  %A = alloca i8
+  %B = alloca i8
+
+  store i8 2, i8* %B  ;; Not written to by memcpy
+
+  call void @llvm.memmove.p0i8.p0i8.i8(i8* %A, i8* %B, i8 -1, i1 false)
+
+  %C = load i8, i8* %B
+  ret i8 %C
+}
+
+
+define i8 @test_memmove_mayalias_args(i8 *%A, i8 *%B) {
+; CHECK-LABEL: @test_memmove_mayalias_args(
+; CHECK-NEXT:    store i8 2, i8* [[B:%.*]], align 1
+; CHECK-NEXT:    call void @llvm.memmove.p0i8.p0i8.i8(i8* [[A:%.*]], i8* [[B]], i8 -1, i1 false)
+; CHECK-NEXT:    [[C:%.*]] = load i8, i8* [[B]], align 1
+; CHECK-NEXT:    ret i8 [[C]]
+;
+  store i8 2, i8* %B  ;; Not written to by memcpy
+
+  call void @llvm.memmove.p0i8.p0i8.i8(i8* %A, i8* %B, i8 -1, i1 false)
+
+  %C = load i8, i8* %B
+  ret i8 %C
+}
+
+define i8 @test_memmove_noalias_args(i8 * noalias %A, i8 * noalias %B) {
+; CHECK-LABEL: @test_memmove_noalias_args(
+; CHECK-NEXT:    store i8 2, i8* [[B:%.*]], align 1
+; CHECK-NEXT:    call void @llvm.memmove.p0i8.p0i8.i8(i8* [[A:%.*]], i8* [[B]], i8 -1, i1 false)
+; CHECK-NEXT:    ret i8 2
+;
+  store i8 2, i8* %B  ;; Not written to by memcpy
+
+  call void @llvm.memmove.p0i8.p0i8.i8(i8* %A, i8* %B, i8 -1, i1 false)
+
+  %C = load i8, i8* %B
+  ret i8 %C
+}
+
+
 declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
 declare void @llvm.memset.p0i8.i8(i8* nocapture, i8, i8, i1) nounwind
 declare void @llvm.memcpy.p0i8.p0i8.i8(i8* nocapture, i8* nocapture, i8, i1) nounwind
 declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind
+declare void @llvm.memmove.p0i8.p0i8.i8(i8* nocapture, i8* nocapture, i8, i1) nounwind
Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp
===================================================================
--- llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -1013,7 +1013,7 @@
   // The semantics of memcpy intrinsics either exactly overlap or do not
   // overlap, i.e., source and destination of any given memcpy are either
   // no-alias or must-alias.
-  if (auto *Inst = dyn_cast<AnyMemCpyInst>(Call)) {
+  if (auto *Inst = dyn_cast<AnyMemTransferInst>(Call)) {
     AliasResult SrcAA =
         getBestAAResults().alias(MemoryLocation::getForSource(Inst), Loc, AAQI);
     AliasResult DestAA =


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117095.399251.patch
Type: text/x-patch
Size: 2612 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220112/0de5c854/attachment.bin>


More information about the llvm-commits mailing list