[llvm] r327638 - [ConstantFolding, InstSimplify] Handle more vector GEPs

Matthew Simpson via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 15 09:00:30 PDT 2018


Author: mssimpso
Date: Thu Mar 15 09:00:29 2018
New Revision: 327638

URL: http://llvm.org/viewvc/llvm-project?rev=327638&view=rev
Log:
[ConstantFolding, InstSimplify] Handle more vector GEPs

This patch addresses some additional cases where the compiler crashes upon
encountering vector GEPs. This should fix PR36116.

Differential Revision: https://reviews.llvm.org/D44219
Reference: https://bugs.llvm.org/show_bug.cgi?id=36116

Modified:
    llvm/trunk/lib/Analysis/InstructionSimplify.cpp
    llvm/trunk/lib/IR/ConstantFold.cpp
    llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll
    llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll

Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Mar 15 09:00:29 2018
@@ -3723,7 +3723,7 @@ static Value *SimplifyGEPInst(Type *SrcT
 
   if (Ops.size() == 2) {
     // getelementptr P, 0 -> P.
-    if (match(Ops[1], m_Zero()))
+    if (match(Ops[1], m_Zero()) && Ops[0]->getType() == GEPTy)
       return Ops[0];
 
     Type *Ty = SrcTy;
@@ -3732,7 +3732,7 @@ static Value *SimplifyGEPInst(Type *SrcT
       uint64_t C;
       uint64_t TyAllocSize = Q.DL.getTypeAllocSize(Ty);
       // getelementptr P, N -> P if P points to a type of zero size.
-      if (TyAllocSize == 0)
+      if (TyAllocSize == 0 && Ops[0]->getType() == GEPTy)
         return Ops[0];
 
       // The following transforms are only safe if the ptrtoint cast

Modified: llvm/trunk/lib/IR/ConstantFold.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/ConstantFold.cpp?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/lib/IR/ConstantFold.cpp (original)
+++ llvm/trunk/lib/IR/ConstantFold.cpp Thu Mar 15 09:00:29 2018
@@ -2027,8 +2027,16 @@ static bool isInBoundsIndices(ArrayRef<I
 
   // If the first index is one and all the rest are zero, it's in bounds,
   // by the one-past-the-end rule.
-  if (!cast<ConstantInt>(Idxs[0])->isOne())
-    return false;
+  if (auto *CI = dyn_cast<ConstantInt>(Idxs[0])) {
+    if (!CI->isOne())
+      return false;
+  } else {
+    auto *CV = cast<ConstantDataVector>(Idxs[0]);
+    CI = dyn_cast_or_null<ConstantInt>(CV->getSplatValue());
+    if (!CI || !CI->isOne())
+      return false;
+  }
+
   for (unsigned i = 1, e = Idxs.size(); i != e; ++i)
     if (!cast<Constant>(Idxs[i])->isNullValue())
       return false;
@@ -2058,15 +2066,18 @@ Constant *llvm::ConstantFoldGetElementPt
                                           ArrayRef<Value *> Idxs) {
   if (Idxs.empty()) return C;
 
-  if (isa<UndefValue>(C)) {
-    Type *GEPTy = GetElementPtrInst::getGEPReturnType(
-        C, makeArrayRef((Value * const *)Idxs.data(), Idxs.size()));
+  Type *GEPTy = GetElementPtrInst::getGEPReturnType(
+      C, makeArrayRef((Value *const *)Idxs.data(), Idxs.size()));
+
+  if (isa<UndefValue>(C))
     return UndefValue::get(GEPTy);
-  }
 
   Constant *Idx0 = cast<Constant>(Idxs[0]);
   if (Idxs.size() == 1 && (Idx0->isNullValue() || isa<UndefValue>(Idx0)))
-    return C;
+    return GEPTy->isVectorTy() && !C->getType()->isVectorTy()
+               ? ConstantVector::getSplat(
+                     cast<VectorType>(GEPTy)->getNumElements(), C)
+               : C;
 
   if (C->isNullValue()) {
     bool isNull = true;

Modified: llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll (original)
+++ llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll Thu Mar 15 09:00:29 2018
@@ -38,3 +38,29 @@ vector.body:
   %VectorGep = getelementptr [65 x %struct.A], [65 x %struct.A]* @G, <16 x i32> zeroinitializer, <16 x i64> <i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15, i64 16>, <16 x i32> zeroinitializer
   ret <16 x i32*> %VectorGep
 }
+
+ at g = external global i8, align 1
+
+define <2 x i8*> @constant_zero_index() {
+; CHECK-LABEL: @constant_zero_index(
+; CHECK-NEXT:    ret <2 x i8*> <i8* @g, i8* @g>
+;
+  %gep = getelementptr i8, i8* @g, <2 x i64> zeroinitializer
+  ret <2 x i8*> %gep
+}
+
+define <2 x i8*> @constant_undef_index() {
+; CHECK-LABEL: @constant_undef_index(
+; CHECK-NEXT:    ret <2 x i8*> <i8* @g, i8* @g>
+;
+  %gep = getelementptr i8, i8* @g, <2 x i64> undef
+  ret <2 x i8*> %gep
+}
+
+define <2 x i8*> @constant_inbounds() {
+; CHECK-LABEL: @constant_inbounds(
+; CHECK-NEXT:    ret <2 x i8*> getelementptr inbounds (i8, i8* @g, <2 x i64> <i64 1, i64 1>)
+;
+  %gep = getelementptr i8, i8* @g, <2 x i64> <i64 1, i64 1>
+  ret <2 x i8*> %gep
+}

Modified: llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll Thu Mar 15 09:00:29 2018
@@ -86,3 +86,21 @@ define <4 x i8*> @laalaa() {
   %patatino = getelementptr i8, <4 x i8 *> undef, i64 undef
   ret <4 x i8*> %patatino
 }
+
+define <2 x i8*> @zero_index(i8* %p) {
+; CHECK-LABEL: @zero_index(
+; CHECK-NEXT:    %gep = getelementptr i8, i8* %p, <2 x i64> zeroinitializer
+; CHECK-NEXT:    ret <2 x i8*> %gep
+;
+  %gep = getelementptr i8, i8* %p, <2 x i64> zeroinitializer
+  ret <2 x i8*> %gep
+}
+
+define <2 x {}*> @unsized({}* %p) {
+; CHECK-LABEL: @unsized(
+; CHECK-NEXT:    %gep = getelementptr {}, {}* %p, <2 x i64> undef
+; CHECK-NEXT:    ret <2 x {}*> %gep
+;
+  %gep = getelementptr {}, {}* %p, <2 x i64> undef
+  ret <2 x {}*> %gep
+}




More information about the llvm-commits mailing list