[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