From 80e237bd535b058fdda3b04281bd61ed185f70af Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Wed, 29 Jul 2015 13:52:05 +0000 Subject: [PATCH] Do not detect scops that are delinearized to arrays with "undef" size Such codes are not interesting to optimize and most likely never appear in the normal compilation flow. However, they show up during test case reduction with bugpoint and trigger -- without this change -- an assert in polly::MemoryAccess::foldAccess(). It is better to detect them in ScopDetection itself and just bail out. Contributed-by: Utpal Bora Reviewers: grosser Subscribers: pollydev, llvm-commits Differential Revision: http://reviews.llvm.org/D11425 llvm-svn: 243515 --- polly/lib/Analysis/ScopDetection.cpp | 12 +++++++- .../ScopDetect/restrict-undef-size-scopdetect.ll | 33 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 polly/test/ScopDetect/restrict-undef-size-scopdetect.ll diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 67f5b8b..0f08fd2 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -512,11 +512,21 @@ bool ScopDetection::hasAffineMemoryAccesses(DetectionContext &Context) const { Context.ElementSize[BasePointer]); if (!AllowNonAffine) - for (const SCEV *DelinearizedSize : Shape->DelinearizedSizes) + for (const SCEV *DelinearizedSize : Shape->DelinearizedSizes) { + if (auto *Unknown = dyn_cast(DelinearizedSize)) { + auto *value = dyn_cast(Unknown->getValue()); + if (isa(value)) { + invalid( + Context, /*Assert=*/true, + Context.Accesses[BasePointer].front().first, BaseValue); + return false; + } + } if (hasScalarDepsInsideRegion(DelinearizedSize, &CurRegion)) invalid( Context, /*Assert=*/true, DelinearizedSize, Context.Accesses[BasePointer].front().first, BaseValue); + } // No array shape derived. if (Shape->DelinearizedSizes.empty()) { diff --git a/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll b/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll new file mode 100644 index 0000000..4918e58 --- /dev/null +++ b/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll @@ -0,0 +1,33 @@ +; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s +; CHECK-NOT: Valid Region for Scop: + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +%struct.bar = type { i32, [4 x i32] } + +define void @f(%struct.bar* %arg) { +bb: + %tmp = alloca [4 x i32], align 16 + br label %bb1 + +bb1: ; preds = %bb8, %bb + %tmp2 = phi i64 [ 0, %bb ], [ %tmp9, %bb8 ] + br i1 false, label %bb3, label %bb6 + +bb3: ; preds = %bb1 + %tmp4 = getelementptr inbounds [4 x i32], [4 x i32]* %tmp, i64 0, i64 0 + %tmp5 = load i32, i32* %tmp4 + br label %bb8 + +bb6: ; preds = %bb1 + %tmp7 = getelementptr inbounds %struct.bar, %struct.bar* %arg, i64 0, i32 1, i64 undef + store i32 42, i32* %tmp7 + br label %bb8 + +bb8: ; preds = %bb6, %bb3 + %tmp9 = add nuw nsw i64 %tmp2, 1 + br i1 false, label %bb1, label %bb10 + +bb10: ; preds = %bb8 + ret void +} -- 2.7.4