[llvm] 826fae5 - [SLPVectorizer][OpaquePtrs] Check GEP source element type
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 16 14:47:35 PST 2022
Author: Arthur Eubanks
Date: 2022-02-16T14:47:20-08:00
New Revision: 826fae51d2a445027d1fe6694bc92b84fe0ec9f0
URL: https://github.com/llvm/llvm-project/commit/826fae51d2a445027d1fe6694bc92b84fe0ec9f0
DIFF: https://github.com/llvm/llvm-project/commit/826fae51d2a445027d1fe6694bc92b84fe0ec9f0.diff
LOG: [SLPVectorizer][OpaquePtrs] Check GEP source element type
Fixes a miscompile with opaque pointers.
Reviewed By: #opaque-pointers, nikic
Differential Revision: https://reviews.llvm.org/D119980
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index ca1922e80c2cf..f1e42ae9ddec6 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -4274,9 +4274,9 @@ void BoUpSLP::buildTree_rec(ArrayRef<Value *> VL, unsigned Depth,
// We can't combine several GEPs into one vector if they operate on
//
diff erent 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 (
diff erent types).\n");
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll b/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
index a2c7f1d202999..8390ebb7ff569 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr-2.ll
@@ -6,12 +6,12 @@ target triple = "x86_64-unknown-linux-gnu"
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
More information about the llvm-commits
mailing list