Add experimental support for unsigned expressions
authorTobias Grosser <tobias@grosser.es>
Fri, 9 Jan 2015 00:01:33 +0000 (00:01 +0000)
committerTobias Grosser <tobias@grosser.es>
Fri, 9 Jan 2015 00:01:33 +0000 (00:01 +0000)
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.

llvm-svn: 225480

polly/lib/Analysis/ScopDetection.cpp
polly/lib/Analysis/ScopInfo.cpp
polly/test/ScopInfo/unsigned-condition.ll [new file with mode: 0644]

index 1bfd969..abcf2c1 100644 (file)
@@ -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(BasicBlock &BB,
     //
     // 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?
index d43f264..aed507d 100644 (file)
@@ -767,10 +767,13 @@ __isl_give isl_set *ScopStmt::buildConditionSet(const Comparison &Comp) {
   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");
   }
diff --git a/polly/test/ScopInfo/unsigned-condition.ll b/polly/test/ScopInfo/unsigned-condition.ll
new file mode 100644 (file)
index 0000000..407ede9
--- /dev/null
@@ -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] };