From 3286c1f6932e9e34b0f0280f52b3e3b2d5fd831b Mon Sep 17 00:00:00 2001 From: Michael Zolotukhin Date: Tue, 22 Sep 2015 22:27:12 +0000 Subject: [PATCH] [Unroll] Do not crash trying to propagate a value to vector load. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248333 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopUnrollPass.cpp | 6 ++++++ .../LoopUnroll/full-unroll-crashers.ll | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/Transforms/Scalar/LoopUnrollPass.cpp b/lib/Transforms/Scalar/LoopUnrollPass.cpp index d9236a2c773..97c51dff84f 100644 --- a/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -423,6 +423,12 @@ private: if (!CDS) return false; + // We might have a vector load from an array. FIXME: for now we just bail + // out in this case, but we should be able to resolve and simplify such + // loads. + if(!CDS->isElementTypeCompatible(I.getType())) + return false; + int ElemSize = CDS->getElementType()->getPrimitiveSizeInBits() / 8U; assert(SimplifiedAddrOp->getValue().getActiveBits() < 64 && "Unexpectedly large index value."); diff --git a/test/Transforms/LoopUnroll/full-unroll-crashers.ll b/test/Transforms/LoopUnroll/full-unroll-crashers.ll index eebf5a0a2f2..e932851042a 100644 --- a/test/Transforms/LoopUnroll/full-unroll-crashers.ll +++ b/test/Transforms/LoopUnroll/full-unroll-crashers.ll @@ -81,3 +81,22 @@ for.inc: for.end: ret void } + +define <4 x i32> @vec_load() { +entry: + br label %for.body + +for.body: + %phi = phi i64 [ 0, %entry ], [ %inc, %for.body ] + %vec_phi = phi <4 x i32> [ , %entry ], [ %r, %for.body ] + %arrayidx = getelementptr inbounds [10 x i32], [10 x i32]* @known_constant, i64 0, i64 %phi + %bc = bitcast i32* %arrayidx to <4 x i32>* + %x = load <4 x i32>, < 4 x i32>* %bc, align 4 + %r = add <4 x i32> %x, %vec_phi + %inc = add nuw nsw i64 %phi, 1 + %cmp = icmp ult i64 %inc, 999 + br i1 %cmp, label %for.body, label %for.exit + +for.exit: + ret <4 x i32> %r +} -- 2.34.1