[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