[PATCH] D119980: [SLPVectorizer][OpaquePtrs] Check GEP source element type
Arthur Eubanks via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 16 14:35:05 PST 2022
aeubanks created this revision.
Herald added a subscriber: hiraditya.
aeubanks requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Fixes a miscompile with opaque pointers.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D119980
Files:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
Index: llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
===================================================================
--- llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
+++ llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
@@ -6,12 +6,12 @@
define void @test(ptr %arg, ptr %arg1, ptr %arg2) {
; CHECK-LABEL: @test(
-; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x ptr> poison, ptr [[ARG1:%.*]], i32 0
-; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x ptr> [[TMP1]], ptr [[ARG2:%.*]], i32 1
-; CHECK-NEXT: [[TMP3:%.*]] = getelementptr ptr, <2 x ptr> [[TMP2]], <2 x i64> <i64 -1, i64 128>
+; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i8, ptr [[ARG2:%.*]], i64 128
+; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds ptr, ptr [[ARG1:%.*]], i64 -1
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[ARG:%.*]], i64 0
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds ptr, ptr [[ARG]], i64 1
-; CHECK-NEXT: store <2 x ptr> [[TMP3]], ptr [[TMP4]], align 8
+; CHECK-NEXT: store ptr [[TMP3]], ptr [[TMP4]], align 8
+; CHECK-NEXT: store ptr [[TMP]], ptr [[TMP5]], align 8
; CHECK-NEXT: ret void
;
%tmp = getelementptr inbounds i8, ptr %arg2, i64 128
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -4274,9 +4274,9 @@
// We can't combine several GEPs into one vector if they operate on
// different types.
- Type *Ty0 = VL0->getOperand(0)->getType();
+ Type *Ty0 = cast<GEPOperator>(VL0)->getSourceElementType();
for (Value *V : VL) {
- Type *CurTy = cast<Instruction>(V)->getOperand(0)->getType();
+ Type *CurTy = cast<GEPOperator>(V)->getSourceElementType();
if (Ty0 != CurTy) {
LLVM_DEBUG(dbgs()
<< "SLP: not-vectorizable GEP (different types).\n");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119980.409413.patch
Type: text/x-patch
Size: 2003 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220216/f2d38957/attachment.bin>
More information about the llvm-commits
mailing list