[llvm] r239143 - [LoopVectorize] Don't crash on zero-sized types in isInductionPHI

David Majnemer david.majnemer at gmail.com
Fri Jun 5 03:52:41 PDT 2015


Author: majnemer
Date: Fri Jun  5 05:52:40 2015
New Revision: 239143

URL: http://llvm.org/viewvc/llvm-project?rev=239143&view=rev
Log:
[LoopVectorize] Don't crash on zero-sized types in isInductionPHI

isInductionPHI wants to calculate the stride based on the pointee size.
However, this is not possible when the pointee is zero sized.

This fixes PR23763.

Added:
    llvm/trunk/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp

Modified: llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp?rev=239143&r1=239142&r2=239143&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp Fri Jun  5 05:52:40 2015
@@ -491,6 +491,9 @@ bool llvm::isInductionPHI(PHINode *Phi,
 
   const DataLayout &DL = Phi->getModule()->getDataLayout();
   int64_t Size = static_cast<int64_t>(DL.getTypeAllocSize(PointerElementType));
+  if (!Size)
+    return false;
+
   int64_t CVSize = CV->getSExtValue();
   if (CVSize % Size)
     return false;

Added: llvm/trunk/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll?rev=239143&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll (added)
+++ llvm/trunk/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll Fri Jun  5 05:52:40 2015
@@ -0,0 +1,27 @@
+; RUN: opt -S -loop-vectorize < %s | FileCheck %s
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-LABEL: @fn1
+define void @fn1() {
+entry-block:
+  br label %middle
+
+middle:
+  %0 = phi {}* [ %3, %middle ], [ inttoptr (i64 0 to {}*), %entry-block ]
+  %1 = bitcast {}* %0 to i8*
+  %2 = getelementptr i8, i8* %1, i64 1
+  %3 = bitcast i8* %2 to {}*
+  %4 = icmp eq i8* %2, undef
+  br i1 %4, label %exit, label %middle
+
+; CHECK:      %[[phi:.*]] = phi {}* [ %3, %middle ], [ null, %entry-block ]
+; CHECK-NEXT: %[[bc1:.*]] = bitcast {}* %[[phi]] to i8*
+; CHECK-NEXT: %[[gep:.*]] = getelementptr i8, i8* %[[bc1]], i64 1
+; CHECK-NEXT: %[[bc2:.*]] = bitcast i8* %[[gep]] to {}*
+; CHECK-NEXT: %[[cmp:.*]] = icmp eq i8* %[[gep]], undef
+; CHECK-NEXT: br i1 %[[cmp]],
+
+exit:
+  ret void
+}





More information about the llvm-commits mailing list