Use all available range information for parameters

In the following even full-range information will help to avoid
  runtime checks for wrapping integers, hence we enable it now.

llvm-svn: 235823
This commit is contained in:
Johannes Doerfert 2015-04-26 20:07:21 +00:00
parent d5d8f67dc5
commit 8f8af43fef
6 changed files with 22 additions and 14 deletions

View File

@ -311,18 +311,18 @@ static __isl_give isl_set *addRangeBoundsToSet(__isl_take isl_set *S,
isl_val *V;
isl_ctx *ctx = isl_set_get_ctx(S);
bool isWrapping = Range.isSignWrappedSet();
const auto LB = isWrapping ? Range.getLower() : Range.getSignedMin();
bool useLowerUpperBound = Range.isSignWrappedSet() && !Range.isFullSet();
const auto LB = useLowerUpperBound ? Range.getLower() : Range.getSignedMin();
V = isl_valFromAPInt(ctx, LB, true);
isl_set *SLB = isl_set_lower_bound_val(isl_set_copy(S), type, dim, V);
const auto UB = isWrapping ? Range.getUpper() : Range.getSignedMax();
const auto UB = useLowerUpperBound ? Range.getUpper() : Range.getSignedMax();
V = isl_valFromAPInt(ctx, UB, true);
if (isWrapping)
if (useLowerUpperBound)
V = isl_val_sub_ui(V, 1);
isl_set *SUB = isl_set_upper_bound_val(S, type, dim, V);
if (isWrapping)
if (useLowerUpperBound)
return isl_set_union(SLB, SUB);
else
return isl_set_intersect(SLB, SUB);
@ -1345,10 +1345,6 @@ void Scop::addParameterBounds() {
ConstantRange SRange = SE->getSignedRange(ParamID.first);
// TODO: Find a case where the full set is actually helpful.
if (SRange.isFullSet())
continue;
Context = addRangeBoundsToSet(Context, SRange, dim, isl_dim_param);
}
}

View File

@ -5,7 +5,7 @@
; INNERMOST: Region: %bb9---%bb17
; INNERMOST: Max Loop Depth: 1
; INNERMOST: Context:
; INNERMOST: [N] -> { : }
; INNERMOST: [N] -> { : N >= -2147483648 and N <= 2147483647 }
; INNERMOST: Assumed Context:
; INNERMOST: [N] -> { : }
; INNERMOST: p0: %N

View File

@ -7,7 +7,7 @@
; CHECK: Region: %bb2---%bb24
; CHECK: Max Loop Depth: 1
; CHECK: Context:
; CHECK: [N] -> { : }
; CHECK: [N] -> { : N >= -2147483648 and N <= 2147483647 }
; CHECK: Assumed Context:
; CHECK: [N] -> { : }
; CHECK: p0: %N

View File

@ -16,7 +16,11 @@
; values for which our assumption holds.
; CHECK: Assumed Context
; CHECK-NEXT: [n, m, p] -> { : p <= 30 and m <= 20 }
; CHECK-NEXT: [n, m, p] -> { :
; CHECK-DAG: p <= 30
; CHECK-DAG: and
; CHECK-DAG: m <= 20
; CHECK: }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

View File

@ -16,7 +16,11 @@
; accessed. In this case the value of m does not matter.
; CHECK: Assumed Context:
; CHECK-NEXT: [n, m, p] -> { : (n >= 1 and m <= 20 and p <= 20) or (n <= 0 and p <= 20) }
; CHECK-NEXT: [n, m, p] -> { :
; CHECK-DAG: (n >= 1 and m <= 20 and p <= 20)
; CHECK-DAG: or
; CHECK-DAG: (n <= 0 and p <= 20)
; CHECK: }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

View File

@ -10,7 +10,11 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
; }
; CHECK: Assumed Context:
; CHECK: [o, m] -> { : m >= 150 and o >= 200 }
; CHECK: [o, m] -> { :
; CHECK-DAG: m >= 150
; CHECK-DAG: and
; CHECK-DAG: o >= 200
; CHECK: }
; CHECK: p0: %o
; CHECK: p1: %m
; CHECK: Statements {