[polly] r225480 - Add experimental support for unsigned expressions

Tobias Grosser tobias at grosser.es
Thu Jan 8 16:01:33 PST 2015


Author: grosser
Date: Thu Jan  8 18:01:33 2015
New Revision: 225480

URL: http://llvm.org/viewvc/llvm-project?rev=225480&view=rev
Log:
Add experimental support for unsigned expressions

This support is still incomplete and consequently hidden behind a switch that
needs to be enabled. One problem is ATM that we incorrectly interpret very large
unsigned values as negative values even if used in an unsigned comparision.

Added:
    polly/trunk/test/ScopInfo/unsigned-condition.ll
Modified:
    polly/trunk/lib/Analysis/ScopDetection.cpp
    polly/trunk/lib/Analysis/ScopInfo.cpp

Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=225480&r1=225479&r2=225480&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Thu Jan  8 18:01:33 2015
@@ -120,6 +120,11 @@ static cl::opt<bool>
                    cl::Hidden, cl::init(false), cl::ZeroOrMore,
                    cl::cat(PollyCategory));
 
+static cl::opt<bool> AllowUnsigned("polly-allow-unsigned",
+                                   cl::desc("Allow unsigned expressions"),
+                                   cl::Hidden, cl::init(false), cl::ZeroOrMore,
+                                   cl::cat(PollyCategory));
+
 static cl::opt<bool, true>
     TrackFailures("polly-detect-track-failures",
                   cl::desc("Track failure strings in detecting scop regions"),
@@ -292,7 +297,7 @@ bool ScopDetection::isValidCFG(BasicBloc
     //
     // TODO: This is not sufficient and just hides bugs. However it does pretty
     // well.
-    if (ICmp->isUnsigned())
+    if (ICmp->isUnsigned() && !AllowUnsigned)
       return false;
 
     // Are both operands of the ICmp affine?

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=225480&r1=225479&r2=225480&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Jan  8 18:01:33 2015
@@ -767,10 +767,13 @@ __isl_give isl_set *ScopStmt::buildCondi
   case ICmpInst::ICMP_SGE:
     return isl_pw_aff_ge_set(L, R);
   case ICmpInst::ICMP_ULT:
+    return isl_pw_aff_lt_set(L, R);
   case ICmpInst::ICMP_UGT:
+    return isl_pw_aff_gt_set(L, R);
   case ICmpInst::ICMP_ULE:
+    return isl_pw_aff_le_set(L, R);
   case ICmpInst::ICMP_UGE:
-    llvm_unreachable("Unsigned comparisons not yet supported");
+    return isl_pw_aff_ge_set(L, R);
   default:
     llvm_unreachable("Non integer predicate not supported");
   }

Added: polly/trunk/test/ScopInfo/unsigned-condition.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/unsigned-condition.ll?rev=225480&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/unsigned-condition.ll (added)
+++ polly/trunk/test/ScopInfo/unsigned-condition.ll Thu Jan  8 18:01:33 2015
@@ -0,0 +1,47 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-allow-unsigned < %s | FileCheck %s
+
+; void f(int a[], int N, unsigned P) {
+;   int i;
+;   for (i = 0; i < N; ++i)
+;     if (P > 42)
+;       a[i] = i;
+; }
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @f(i64* nocapture %a, i64 %N, i64 %P) nounwind {
+entry:
+  br label %bb
+
+bb:
+  %i = phi i64 [ 0, %entry ], [ %i.inc, %bb.backedge ]
+  %brcond = icmp uge i64 %P, 42
+  br i1 %brcond, label %store, label %bb.backedge
+
+store:
+  %scevgep = getelementptr i64* %a, i64 %i
+  store i64 %i, i64* %scevgep
+  br label %bb.backedge
+
+bb.backedge:
+  %i.inc = add nsw i64 %i, 1
+  %exitcond = icmp eq i64 %i.inc, %N
+  br i1 %exitcond, label %return, label %bb
+
+return:
+  ret void
+}
+
+; CHECK: Assumed Context:
+; CHECK:   {  :  }
+
+; CHECK:  Stmt_store
+; CHECK:        Domain :=
+; CHECK:            [N, P] -> { Stmt_store[i0] :
+; CHECK:              i0 >= 0 and i0 <= -1 + N and P >= 42
+; CHECK:                   };
+; CHECK:        Scattering :=
+; CHECK:            [N, P] -> { Stmt_store[i0] -> scattering[i0] };
+; CHECK:        MustWriteAccess := [Reduction Type: NONE]
+; CHECK:            [N, P] -> { Stmt_store[i0] -> MemRef_a[i0] };





More information about the llvm-commits mailing list