[PATCH] D109012: [SLPVectorizer] Make aliasing check more precise
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 31 11:38:50 PDT 2021
nikic created this revision.
nikic added reviewers: ABataev, anton-afanasyev, spatel.
Herald added subscribers: jeroen.dobbelaere, hiraditya.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
SLPVectorizer currently uses AA::isNoAlias() to determine whether two locations alias. This does not work if one of the instructions is a call. Instead, we should check getModRefInfo(), which determines whether an arbitrary modified or references a given location.
Among other things, this prevents `@llvm.experimental.noalias.scope.decl()` and other inaccessiblmemonly intrinsics from interfering with SLP vectorization.
https://reviews.llvm.org/D109012
Files:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/int_sideeffect.ll
Index: llvm/test/Transforms/SLPVectorizer/int_sideeffect.ll
===================================================================
--- llvm/test/Transforms/SLPVectorizer/int_sideeffect.ll
+++ llvm/test/Transforms/SLPVectorizer/int_sideeffect.ll
@@ -44,16 +44,12 @@
; CHECK-NEXT: [[P1:%.*]] = getelementptr float, float* [[P]], i64 1
; CHECK-NEXT: [[P2:%.*]] = getelementptr float, float* [[P]], i64 2
; CHECK-NEXT: [[P3:%.*]] = getelementptr float, float* [[P]], i64 3
-; CHECK-NEXT: [[L0:%.*]] = load float, float* [[P0]], align 4
-; CHECK-NEXT: [[L1:%.*]] = load float, float* [[P1]], align 4
-; CHECK-NEXT: [[L2:%.*]] = load float, float* [[P2]], align 4
; CHECK-NEXT: call void @foo() #[[ATTR1:[0-9]+]]
-; CHECK-NEXT: [[L3:%.*]] = load float, float* [[P3]], align 4
-; CHECK-NEXT: store float [[L0]], float* [[P0]], align 4
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[P0]] to <4 x float>*
+; CHECK-NEXT: [[TMP2:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4
; CHECK-NEXT: call void @foo() #[[ATTR1]]
-; CHECK-NEXT: store float [[L1]], float* [[P1]], align 4
-; CHECK-NEXT: store float [[L2]], float* [[P2]], align 4
-; CHECK-NEXT: store float [[L3]], float* [[P3]], align 4
+; CHECK-NEXT: [[TMP3:%.*]] = bitcast float* [[P0]] to <4 x float>*
+; CHECK-NEXT: store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
; CHECK-NEXT: ret void
;
%p0 = getelementptr float, float* %p, i64 0
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -1965,12 +1965,9 @@
if (result.hasValue()) {
return result.getValue();
}
- MemoryLocation Loc2 = getLocation(Inst2, AA);
bool aliased = true;
- if (Loc1.Ptr && Loc2.Ptr && isSimple(Inst1) && isSimple(Inst2)) {
- // Do the alias check.
- aliased = !AA->isNoAlias(Loc1, Loc2);
- }
+ if (Loc1.Ptr && isSimple(Inst1))
+ aliased = isModOrRefSet(AA->getModRefInfo(Inst2, Loc1));
// Store the result in the cache.
result = aliased;
return aliased;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109012.369755.patch
Type: text/x-patch
Size: 2198 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210831/55b17e91/attachment.bin>
More information about the llvm-commits
mailing list