Skip to content

Commit

Permalink
Do not detect scops that are delinearized to arrays with "undef" size
Browse files Browse the repository at this point in the history
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  <cs14mtech11017@iith.ac.in>

Reviewers: grosser

Subscribers: pollydev, llvm-commits

Differential Revision: http://reviews.llvm.org/D11425

llvm-svn: 243515
  • Loading branch information
tobiasgrosser committed Jul 29, 2015
1 parent 1998eb2 commit 80e237b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
12 changes: 11 additions & 1 deletion polly/lib/Analysis/ScopDetection.cpp
Expand Up @@ -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<SCEVUnknown>(DelinearizedSize)) {
auto *value = dyn_cast<Value>(Unknown->getValue());
if (isa<UndefValue>(value)) {
invalid<ReportDifferentArrayElementSize>(
Context, /*Assert=*/true,
Context.Accesses[BasePointer].front().first, BaseValue);
return false;
}
}
if (hasScalarDepsInsideRegion(DelinearizedSize, &CurRegion))
invalid<ReportNonAffineAccess>(
Context, /*Assert=*/true, DelinearizedSize,
Context.Accesses[BasePointer].front().first, BaseValue);
}

// No array shape derived.
if (Shape->DelinearizedSizes.empty()) {
Expand Down
33 changes: 33 additions & 0 deletions 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
}

0 comments on commit 80e237b

Please sign in to comment.