[PATCH] D26014: [ConstantFold] Get the correct vector type when folding a getelementptr instruction with vector indices
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 27 12:39:15 PDT 2016
davide updated this revision to Diff 76083.
davide added a comment.
David's comments (also added again the overload which I previously removed because it was unused).
https://reviews.llvm.org/D26014
Files:
include/llvm/IR/Instructions.h
lib/IR/ConstantFold.cpp
test/Transforms/InstCombine/gep-vector.ll
Index: test/Transforms/InstCombine/gep-vector.ll
===================================================================
--- /dev/null
+++ test/Transforms/InstCombine/gep-vector.ll
@@ -0,0 +1,15 @@
+; RUN: opt -instcombine %s -S | FileCheck %s
+
+; CHECK-LABEL: patatino
+; CHECK-NEXT: ret <8 x i64*> undef
+define <8 x i64*> @patatino() {
+ %el = getelementptr i64, <8 x i64*> undef, <8 x i64> undef
+ ret <8 x i64*> %el
+}
+
+; CHECK-LABEL: patatino2
+; CHECK-NEXT: ret <8 x i64*> undef
+define <8 x i64*> @patatino2() {
+ %el = getelementptr inbounds i64, i64* undef, <8 x i64> undef
+ ret <8 x i64*> %el
+}
Index: lib/IR/ConstantFold.cpp
===================================================================
--- lib/IR/ConstantFold.cpp
+++ lib/IR/ConstantFold.cpp
@@ -2062,6 +2062,11 @@
Type *GEPTy = PointerType::get(Ty, PtrTy->getAddressSpace());
if (VectorType *VT = dyn_cast<VectorType>(C->getType()))
GEPTy = VectorType::get(GEPTy, VT->getNumElements());
+ // When the getelementptr has one or more vector indices, it will
+ // return a vector of pointers.
+ else
+ GEPTy = GetElementPtrInst::getGEPReturnType(C,
+ makeArrayRef((Value * const *)Idxs.data(), Idxs.size()));
return UndefValue::get(GEPTy);
}
Index: include/llvm/IR/Instructions.h
===================================================================
--- include/llvm/IR/Instructions.h
+++ include/llvm/IR/Instructions.h
@@ -959,6 +959,11 @@
/// Returns the pointer type returned by the GEP
/// instruction, which may be a vector of pointers.
+ static Type *getGEPReturnType(Value *Ptr, ArrayRef<Value *> IdxList) {
+ return getGEPReturnType(
+ cast<PointerType>(Ptr->getType()->getScalarType())->getElementType(),
+ Ptr, IdxList);
+ }
static Type *getGEPReturnType(Type *ElTy, Value *Ptr,
ArrayRef<Value *> IdxList) {
Type *PtrTy = PointerType::get(checkGEPType(getIndexedType(ElTy, IdxList)),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26014.76083.patch
Type: text/x-patch
Size: 1975 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161027/e048e544/attachment.bin>
More information about the llvm-commits
mailing list