Skip to content

Commit

Permalink
[Polly] Don't crash on invalid delinearization result.
Browse files Browse the repository at this point in the history
In certain cases, it's possible for delinearization to decide one of the
array dimensions should be some function of an induction variable inside
the scop.  Make sure if this happens, we refuse to use those dimensions
for delinearization.

Usually, we end up rejecting the scop before it actually crashes, but it
looks like it's possible to slip past other checks in certain cases
involving smax expressions.

Fixes a crash that started showing up this week on the polly AOSP
builder.  As far as I can tell, this is a longstanding issue, though;
it was just exposed by better SCEV analysis of smin expressions.

Differential Revision: https://reviews.llvm.org/D61807

llvm-svn: 360708
  • Loading branch information
efriedma-quic authored and MrSidims committed May 24, 2019
1 parent 15bb657 commit 8480d55
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
4 changes: 3 additions & 1 deletion polly/lib/Analysis/ScopDetection.cpp
Expand Up @@ -913,7 +913,9 @@ bool ScopDetection::hasValidArraySizes(DetectionContext &Context,
Value *BaseValue = BasePointer->getValue();
Region &CurRegion = Context.CurRegion;
for (const SCEV *DelinearizedSize : Sizes) {
if (!isAffine(DelinearizedSize, Scope, Context)) {
// Don't pass down the scope to isAfffine; array dimensions must be
// invariant across the entire scop.
if (!isAffine(DelinearizedSize, nullptr, Context)) {
Sizes.clear();
break;
}
Expand Down
27 changes: 27 additions & 0 deletions polly/test/ScopInfo/multidim_invalid_dimension.ll
@@ -0,0 +1,27 @@
; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnueabi"

; Make sure we don't crash trying delinearize the memory access
; CHECK: region: 'bb4 => bb14'
; CHECK-NEXT: Invalid Scop!
define void @f(i8* %arg, i32 %arg1, i32 %arg2, i32 %arg3) {
bb:
br label %bb4

bb4:
%tmp = phi i32 [ %arg2, %bb ], [ %tmp12, %bb4 ]
%tmp5 = icmp sgt i32 %tmp, 0
%tmp6 = select i1 %tmp5, i32 %tmp, i32 0
%tmp7 = mul nsw i32 %tmp6, %arg3
%tmp8 = sext i32 %tmp7 to i64
%tmp9 = getelementptr inbounds i8, i8* %arg, i64 %tmp8
%tmp10 = bitcast i8* %tmp9 to i32*
%tmp11 = load i32, i32* %tmp10, align 4
%tmp12 = add nsw i32 %tmp, 1
%tmp13 = icmp slt i32 %tmp, %arg1
br i1 %tmp13, label %bb4, label %bb14

bb14:
ret void
}

0 comments on commit 8480d55

Please sign in to comment.