From b58f32f7a84e98b51fd87ac9b49dba02b06fa7bc Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 5 Jun 2015 10:52:40 +0000 Subject: [PATCH] [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. llvm-svn: 239143 --- llvm/lib/Transforms/Utils/LoopUtils.cpp | 3 +++ .../LoopVectorize/zero-sized-pointee-crash.ll | 27 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 llvm/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index a5890c0..5f25e6b 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -491,6 +491,9 @@ bool llvm::isInductionPHI(PHINode *Phi, ScalarEvolution *SE, const DataLayout &DL = Phi->getModule()->getDataLayout(); int64_t Size = static_cast(DL.getTypeAllocSize(PointerElementType)); + if (!Size) + return false; + int64_t CVSize = CV->getSExtValue(); if (CVSize % Size) return false; diff --git a/llvm/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll b/llvm/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll new file mode 100644 index 0000000..8771dd2 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll @@ -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 +} -- 2.7.4