[polly] r271885 - [FIX] Do not recognize division by 0 as affine
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 6 05:08:36 PDT 2016
Author: jdoerfert
Date: Mon Jun 6 07:08:34 2016
New Revision: 271885
URL: http://llvm.org/viewvc/llvm-project?rev=271885&view=rev
Log:
[FIX] Do not recognize division by 0 as affine
Added:
polly/trunk/test/ScopInfo/div_by_zero.ll
Modified:
polly/trunk/lib/Support/SCEVValidator.cpp
Modified: polly/trunk/lib/Support/SCEVValidator.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/SCEVValidator.cpp?rev=271885&r1=271884&r2=271885&view=diff
==============================================================================
--- polly/trunk/lib/Support/SCEVValidator.cpp (original)
+++ polly/trunk/lib/Support/SCEVValidator.cpp Mon Jun 6 07:08:34 2016
@@ -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);
Added: polly/trunk/test/ScopInfo/div_by_zero.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/div_by_zero.ll?rev=271885&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/div_by_zero.ll (added)
+++ polly/trunk/test/ScopInfo/div_by_zero.ll Mon Jun 6 07:08:34 2016
@@ -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
+}
More information about the llvm-commits
mailing list