[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