diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 37cd4caaca71d..8ff3e79745aa6 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -6715,9 +6715,10 @@ static bool isSameUnderlyingObjectInLoop(const PHINode *PN, const Value *llvm::getUnderlyingObject(const Value *V, unsigned MaxLookup) { for (unsigned Count = 0; MaxLookup == 0 || Count < MaxLookup; ++Count) { if (auto *GEP = dyn_cast(V)) { - V = GEP->getPointerOperand(); - if (!V->getType()->isPointerTy()) // Only handle scalar pointer base. - return nullptr; + const Value *PtrOp = GEP->getPointerOperand(); + if (!PtrOp->getType()->isPointerTy()) // Only handle scalar pointer base. + return V; + V = PtrOp; } else if (Operator::getOpcode(V) == Instruction::BitCast || Operator::getOpcode(V) == Instruction::AddrSpaceCast) { Value *NewV = cast(V)->getOperand(0); diff --git a/llvm/test/Transforms/FunctionAttrs/vector-of-pointers-getunderlyingobject-crash.ll b/llvm/test/Transforms/FunctionAttrs/vector-of-pointers-getunderlyingobject-crash.ll new file mode 100644 index 0000000000000..2ccb1efd85e33 --- /dev/null +++ b/llvm/test/Transforms/FunctionAttrs/vector-of-pointers-getunderlyingobject-crash.ll @@ -0,0 +1,14 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes=function-attrs < %s | FileCheck %s + +define double @getUnderlyingObject_vector_ptr(<4 x i1> %arg0, <4 x i1> %arg1) { +; CHECK-LABEL: define double @getUnderlyingObject_vector_ptr( +; CHECK-SAME: <4 x i1> [[ARG0:%.*]], <4 x i1> [[ARG1:%.*]]) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: [[GATHER:%.*]] = tail call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> getelementptr inbounds (i8, <4 x ptr> zeroinitializer, <4 x i64> splat (i64 8)), i32 0, <4 x i1> [[ARG0]], <4 x double> zeroinitializer) +; CHECK-NEXT: [[REDUCE_FADD:%.*]] = tail call double @llvm.vector.reduce.fadd.v4f64(double 0.000000e+00, <4 x double> [[GATHER]]) +; CHECK-NEXT: ret double [[REDUCE_FADD]] +; + %gather = tail call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> getelementptr inbounds (i8, <4 x ptr> zeroinitializer, <4 x i64> ), i32 0, <4 x i1> %arg0, <4 x double> zeroinitializer) + %reduce.fadd = tail call double @llvm.vector.reduce.fadd.v4f64(double 0.000000e+00, <4 x double> %gather) + ret double %reduce.fadd +}