Index: lib/IR/ConstantFold.cpp =================================================================== --- lib/IR/ConstantFold.cpp +++ lib/IR/ConstantFold.cpp @@ -2062,6 +2062,12 @@ Type *GEPTy = PointerType::get(Ty, PtrTy->getAddressSpace()); if (VectorType *VT = dyn_cast(C->getType())) GEPTy = VectorType::get(GEPTy, VT->getNumElements()); + // When the getelementptr has one of more vector indices, it will + // return a vector of pointers. We guarantee that all the vectors + // in this case will have the same width, so we can just look at + // the first one. + else if (VectorType *VT = dyn_cast(Idxs[0]->getType())) + GEPTy = VectorType::get(GEPTy, VT->getNumElements()); return UndefValue::get(GEPTy); } Index: test/Transforms/InstCombine/gep-vector.ll =================================================================== --- /dev/null +++ test/Transforms/InstCombine/gep-vector.ll @@ -0,0 +1,19 @@ +; RUN: opt -instcombine %s -S | FileCheck %s + +; CHECK-LABEL: patatino +; CHECK-NEXT: ret void +define void @patatino() { + %el = getelementptr i64, <8 x i64*> undef, <8 x i64> undef + %gather = call <8 x i64> @llvm.masked.gather.v8i64(<8 x i64*> %el, i32 8, <8 x i1> , <8 x i64> undef) + ret void +} + +; CHECK-LABEL: patatino2 +; CHECK-NEXT: ret void +define void @patatino2() { + %el = getelementptr inbounds i64, i64* undef, <8 x i64> undef + %gather = call <8 x i64> @llvm.masked.gather.v8i64(<8 x i64*> %el, i32 8, <8 x i1> , <8 x i64> undef) + ret void +} + +declare <8 x i64> @llvm.masked.gather.v8i64(<8 x i64*>, i32, <8 x i1>, <8 x i64>)