diff options
author | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-06-06 12:08:34 +0000 |
---|---|---|
committer | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-06-06 12:08:34 +0000 |
commit | 4b2fd892ec5873105bc3ca90d908ae8d1f08e05c (patch) | |
tree | 9f35b29a78c7488ad32d7154e6fa8bbf9e994519 | |
parent | 0ca86fe84dc916b9af9c70c1d1163298e1928993 (diff) | |
download | llvm-4b2fd892ec5873105bc3ca90d908ae8d1f08e05c.zip llvm-4b2fd892ec5873105bc3ca90d908ae8d1f08e05c.tar.gz llvm-4b2fd892ec5873105bc3ca90d908ae8d1f08e05c.tar.bz2 |
[FIX] Do not recognize division by 0 as affine
llvm-svn: 271885
-rw-r--r-- | polly/lib/Support/SCEVValidator.cpp | 4 | ||||
-rw-r--r-- | polly/test/ScopInfo/div_by_zero.ll | 36 |
2 files changed, 38 insertions, 2 deletions
diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp index eba4d0d..85bf815 100644 --- a/polly/lib/Support/SCEVValidator.cpp +++ b/polly/lib/Support/SCEVValidator.cpp @@ -307,7 +307,7 @@ public: // First check if we might be able to model the division, thus if the // divisor is constant. If so, check the dividend, otherwise check if // the whole division can be seen as a parameter. - if (isa<SCEVConstant>(Divisor)) + if (isa<SCEVConstant>(Divisor) && !Divisor->isZero()) return visit(Dividend); // For signed divisions use the SDiv instruction to check for a parameter @@ -345,7 +345,7 @@ public: auto *Divisor = SRem->getOperand(1); auto *CI = dyn_cast<ConstantInt>(Divisor); - if (!CI) + if (!CI || CI->isZeroValue()) return visitGenericInst(SRem, S); auto *Dividend = SRem->getOperand(0); diff --git a/polly/test/ScopInfo/div_by_zero.ll b/polly/test/ScopInfo/div_by_zero.ll new file mode 100644 index 0000000..5cd408c --- /dev/null +++ b/polly/test/ScopInfo/div_by_zero.ll @@ -0,0 +1,36 @@ +; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s +; +; void f(int *A, int N) { +; for (int i = 0; i < N; i++) +; A[i / 0]++; +; } +; +; CHECK-NOT: Statement +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @f(i32* %A, i32 %N) { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc1, %for.inc ] + %cmp = icmp slt i32 %i.0, %N + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %div = sdiv i32 %i.0, 0 + %idxprom = sext i32 %div to i64 + %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom + %tmp = load i32, i32* %arrayidx, align 4 + %inc = add nsw i32 %tmp, 1 + store i32 %inc, i32* %arrayidx, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %inc1 = add nuw nsw i32 %i.0, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} |