diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 54ff1af52ee8..6dd63ce4d3de 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -1240,15 +1240,23 @@ buildConditionSets(Scop &S, Value *Condition, TerminatorInst *TI, Loop *L, // under which @p Condition is true/false. if (!TI) ConsequenceCondSet = isl_set_params(ConsequenceCondSet); - assert(ConsequenceCondSet); - isl_set *AlternativeCondSet = - isl_set_complement(isl_set_copy(ConsequenceCondSet)); + ConsequenceCondSet = isl_set_coalesce( + isl_set_intersect(ConsequenceCondSet, isl_set_copy(Domain))); - ConditionSets.push_back(isl_set_coalesce( - isl_set_intersect(ConsequenceCondSet, isl_set_copy(Domain)))); - ConditionSets.push_back(isl_set_coalesce( - isl_set_intersect(AlternativeCondSet, isl_set_copy(Domain)))); + isl_set *AlternativeCondSet; + unsigned NumParams = isl_set_n_param(ConsequenceCondSet); + unsigned NumBasicSets = isl_set_n_basic_set(ConsequenceCondSet); + if (NumBasicSets + NumParams < MaxConjunctsInDomain) { + AlternativeCondSet = isl_set_subtract(isl_set_copy(Domain), + isl_set_copy(ConsequenceCondSet)); + } else { + S.invalidate(COMPLEXITY, TI ? TI->getDebugLoc() : DebugLoc()); + AlternativeCondSet = isl_set_empty(isl_set_get_space(ConsequenceCondSet)); + } + + ConditionSets.push_back(ConsequenceCondSet); + ConditionSets.push_back(isl_set_coalesce(AlternativeCondSet)); } /// @brief Build the conditions sets for the terminator @p TI in the @p Domain. @@ -2390,7 +2398,7 @@ bool Scop::buildDomainsWithBranchConstraints(Region *R, ScopDetection &SD, // Check if the maximal number of domain conjuncts was reached. // In case this happens we will clean up and bail. - if (isl_set_n_basic_set(SuccDomain) <= MaxConjunctsInDomain) + if (isl_set_n_basic_set(SuccDomain) < MaxConjunctsInDomain) continue; invalidate(COMPLEXITY, DebugLoc()); diff --git a/polly/test/ScopInfo/complex-condition.ll b/polly/test/ScopInfo/complex-condition.ll new file mode 100644 index 000000000000..b0c12e8b3556 --- /dev/null +++ b/polly/test/ScopInfo/complex-condition.ll @@ -0,0 +1,145 @@ +; RUN: opt %loadPolly -pass-remarks-analysis="polly-scops" -polly-scops \ +; RUN: < %s 2>&1 | FileCheck %s +; +; CHECK: Low complexity assumption: { : 1 = 0 } +; +; The IR is a modified version of the following C: +; +; void f(int *A) { +; Begin: +; if (A[0] == 1 | A[1] == 1 | A[2] == 1 | A[3] == 1 | A[4] == 1 | A[5] == 1 | +; A[6] == 1 | A[7] == 1 | A[8] == 1 | A[9] == 1 | A[10] == 1 | A[11] == 1 | +; A[12] == 1 | A[13] == 1 | A[14] == 1 | A[15] == 1 | A[16] == 1 | +; A[17] == 1 | A[18] == 1 | A[19] == 1 | A[20] == 1 | A[21] == 1 | +; A[22] == 1 | A[23]) { +; A[-1]++; +; } else { +; A[-1]--; +; } +; End: +; return; +; } +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @f(i32* %A) { +entry: + br label %Begin + +Begin: ; preds = %entry + %tmp = load i32, i32* %A, align 4 + %cmp = icmp eq i32 %tmp, 1 + %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 1 + %tmp1 = load i32, i32* %arrayidx1, align 4 + %cmp2 = icmp eq i32 %tmp1, 1 + %or = or i1 %cmp, %cmp2 + %arrayidx4 = getelementptr inbounds i32, i32* %A, i64 2 + %tmp2 = load i32, i32* %arrayidx4, align 4 + %cmp5 = icmp eq i32 %tmp2, 1 + %or7 = or i1 %or, %cmp5 + %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 3 + %tmp3 = load i32, i32* %arrayidx8, align 4 + %cmp9 = icmp eq i32 %tmp3, 1 + %or11 = or i1 %or7, %cmp9 + %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 4 + %tmp4 = load i32, i32* %arrayidx12, align 4 + %cmp13 = icmp eq i32 %tmp4, 1 + %or15 = or i1 %or11, %cmp13 + %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 5 + %tmp5 = load i32, i32* %arrayidx16, align 4 + %cmp17 = icmp eq i32 %tmp5, 1 + %or19 = or i1 %or15, %cmp17 + %arrayidx20 = getelementptr inbounds i32, i32* %A, i64 6 + %tmp6 = load i32, i32* %arrayidx20, align 4 + %cmp21 = icmp eq i32 %tmp6, 1 + %or23 = or i1 %or19, %cmp21 + %arrayidx24 = getelementptr inbounds i32, i32* %A, i64 7 + %tmp7 = load i32, i32* %arrayidx24, align 4 + %cmp25 = icmp eq i32 %tmp7, 1 + %or27 = or i1 %or23, %cmp25 + %arrayidx28 = getelementptr inbounds i32, i32* %A, i64 8 + %tmp8 = load i32, i32* %arrayidx28, align 4 + %cmp29 = icmp eq i32 %tmp8, 1 + %or31 = or i1 %or27, %cmp29 + %arrayidx32 = getelementptr inbounds i32, i32* %A, i64 9 + %tmp9 = load i32, i32* %arrayidx32, align 4 + %cmp33 = icmp eq i32 %tmp9, 1 + %or35 = or i1 %or31, %cmp33 + %arrayidx36 = getelementptr inbounds i32, i32* %A, i64 10 + %tmp10 = load i32, i32* %arrayidx36, align 4 + %cmp37 = icmp eq i32 %tmp10, 1 + %or39 = or i1 %or35, %cmp37 + %arrayidx40 = getelementptr inbounds i32, i32* %A, i64 11 + %tmp11 = load i32, i32* %arrayidx40, align 4 + %cmp41 = icmp eq i32 %tmp11, 1 + %or43 = or i1 %or39, %cmp41 + %arrayidx44 = getelementptr inbounds i32, i32* %A, i64 12 + %tmp12 = load i32, i32* %arrayidx44, align 4 + %cmp45 = icmp eq i32 %tmp12, 1 + %or47 = or i1 %or43, %cmp45 + %arrayidx48 = getelementptr inbounds i32, i32* %A, i64 13 + %tmp13 = load i32, i32* %arrayidx48, align 4 + %cmp49 = icmp eq i32 %tmp13, 1 + %or51 = or i1 %or47, %cmp49 + %arrayidx52 = getelementptr inbounds i32, i32* %A, i64 14 + %tmp14 = load i32, i32* %arrayidx52, align 4 + %cmp53 = icmp eq i32 %tmp14, 1 + %or55 = or i1 %or51, %cmp53 + %arrayidx56 = getelementptr inbounds i32, i32* %A, i64 15 + %tmp15 = load i32, i32* %arrayidx56, align 4 + %cmp57 = icmp eq i32 %tmp15, 1 + %or59 = or i1 %or55, %cmp57 + %arrayidx60 = getelementptr inbounds i32, i32* %A, i64 16 + %tmp16 = load i32, i32* %arrayidx60, align 4 + %cmp61 = icmp eq i32 %tmp16, 1 + %or63 = or i1 %or59, %cmp61 + %arrayidx64 = getelementptr inbounds i32, i32* %A, i64 17 + %tmp17 = load i32, i32* %arrayidx64, align 4 + %cmp65 = icmp eq i32 %tmp17, 1 + %or67 = or i1 %or63, %cmp65 + %arrayidx68 = getelementptr inbounds i32, i32* %A, i64 18 + %tmp18 = load i32, i32* %arrayidx68, align 4 + %cmp69 = icmp eq i32 %tmp18, 1 + %or71 = or i1 %or67, %cmp69 + %arrayidx72 = getelementptr inbounds i32, i32* %A, i64 19 + %tmp19 = load i32, i32* %arrayidx72, align 4 + %cmp73 = icmp eq i32 %tmp19, 1 + %or75 = or i1 %or71, %cmp73 + %arrayidx76 = getelementptr inbounds i32, i32* %A, i64 20 + %tmp20 = load i32, i32* %arrayidx76, align 4 + %cmp77 = icmp eq i32 %tmp20, 1 + %or79 = or i1 %or75, %cmp77 + %arrayidx80 = getelementptr inbounds i32, i32* %A, i64 21 + %tmp21 = load i32, i32* %arrayidx80, align 4 + %cmp81 = icmp eq i32 %tmp21, 1 + %or83 = or i1 %or79, %cmp81 + %arrayidx84 = getelementptr inbounds i32, i32* %A, i64 22 + %tmp22 = load i32, i32* %arrayidx84, align 4 + %cmp85 = icmp eq i32 %tmp22, 1 + %or87 = or i1 %or83, %cmp85 + %arrayidx88 = getelementptr inbounds i32, i32* %A, i64 23 + %tmp23 = load i32, i32* %arrayidx88, align 4 + %cmp88 = icmp eq i32 %tmp23, 1 + %or89 = or i1 %or87, %cmp88 + br i1 %or89, label %if.else, label %if.then + +if.then: ; preds = %Begin + %arrayidx90 = getelementptr inbounds i32, i32* %A, i64 -1 + %tmp24 = load i32, i32* %arrayidx90, align 4 + %inc = add nsw i32 %tmp24, 1 + store i32 %inc, i32* %arrayidx90, align 4 + br label %if.end + +if.else: ; preds = %Begin + %arrayidx91 = getelementptr inbounds i32, i32* %A, i64 -1 + %tmp25 = load i32, i32* %arrayidx91, align 4 + %dec = add nsw i32 %tmp25, -1 + store i32 %dec, i32* %arrayidx91, align 4 + br label %if.end + +if.end: ; preds = %if.else, %if.then + br label %End + +End: ; preds = %if.end + ret void +} diff --git a/polly/test/ScopInfo/complex-successor-structure-2.ll b/polly/test/ScopInfo/complex-successor-structure-2.ll index beb308c370e4..1bd11dba90a3 100644 --- a/polly/test/ScopInfo/complex-successor-structure-2.ll +++ b/polly/test/ScopInfo/complex-successor-structure-2.ll @@ -4,7 +4,7 @@ ; We build a scop for the region for.body->B13. The CFG is of the following ; form and the branch conditions are build from "smax" SCEVs. However, in ; contrast to complex-success-structure.ll the smax constraints do not grow -; anymore after B4. This will keep the condition construction bounded. +; anymore after B3. This will keep the condition construction bounded. ; Since we propagate the domains from one B(X) to the B(X+1) we can also keep ; the domains simple. We will bail anyway due to invalid required invariant ; loads. @@ -443,7 +443,7 @@ A4: ; preds = %B3 B4: ; preds = %A4, %B3 %46 = phi i16 [ %add84.3, %A4 ], [ %45, %B3 ] - %add84.4 = add i16 %46, 128 + %add84.4 = add i16 %44, 128 %arrayidx74.5 = getelementptr inbounds i16, i16* %Output, i32 5 %47 = load i16, i16* %arrayidx74.5, align 2 %cmp77.5 = icmp slt i16 %47, %add84.4 @@ -455,7 +455,7 @@ A5: ; preds = %B4 B5: ; preds = %A5, %B4 %48 = phi i16 [ %add84.4, %A5 ], [ %47, %B4 ] - %add84.5 = add i16 %46, 128 + %add84.5 = add i16 %44, 128 %arrayidx74.6 = getelementptr inbounds i16, i16* %Output, i32 6 %49 = load i16, i16* %arrayidx74.6, align 2 %cmp77.6 = icmp slt i16 %49, %add84.5 @@ -467,7 +467,7 @@ A6: ; preds = %B5 B6: ; preds = %A6, %B5 %50 = phi i16 [ %add84.5, %A6 ], [ %49, %B5 ] - %add84.6 = add i16 %46, 128 + %add84.6 = add i16 %44, 128 %arrayidx74.7 = getelementptr inbounds i16, i16* %Output, i32 7 %51 = load i16, i16* %arrayidx74.7, align 2 %cmp77.7 = icmp slt i16 %51, %add84.6 @@ -479,7 +479,7 @@ A7: ; preds = %B6 B7: ; preds = %A7, %B6 %52 = phi i16 [ %add84.6, %A7 ], [ %51, %B6 ] - %add84.7 = add i16 %46, 128 + %add84.7 = add i16 %44, 128 %arrayidx74.8 = getelementptr inbounds i16, i16* %Output, i32 8 %53 = load i16, i16* %arrayidx74.8, align 2 %cmp77.8 = icmp slt i16 %53, %add84.7 @@ -491,7 +491,7 @@ A8: ; preds = %B7 B8: ; preds = %A8, %B7 %54 = phi i16 [ %add84.7, %A8 ], [ %53, %B7 ] - %add84.8 = add i16 %46, 128 + %add84.8 = add i16 %44, 128 %cmp77.9 = icmp slt i16 %.reload, %add84.8 br i1 %cmp77.9, label %A9, label %B9 @@ -502,7 +502,7 @@ A9: ; preds = %B8 B9: ; preds = %A9, %B8 %55 = phi i16 [ %add84.8, %A9 ], [ %.reload, %B8 ] - %add84.9 = add i16 %46, 128 + %add84.9 = add i16 %44, 128 %cmp77.10 = icmp slt i16 %.reload151, %add84.9 br i1 %cmp77.10, label %A10, label %B10 @@ -513,7 +513,7 @@ A10: ; preds = %B9 B10: ; preds = %A10, %B9 %56 = phi i16 [ %add84.9, %A10 ], [ %.reload151, %B9 ] - %add84.10 = add i16 %46, 128 + %add84.10 = add i16 %44, 128 %cmp77.11 = icmp slt i16 %.reload153, %add84.10 br i1 %cmp77.11, label %A11, label %B11 @@ -524,7 +524,7 @@ A11: ; preds = %B10 B11: ; preds = %A11, %B10 %57 = phi i16 [ %add84.10, %A11 ], [ %.reload153, %B10 ] - %add84.11 = add i16 %46, 128 + %add84.11 = add i16 %44, 128 %cmp77.12 = icmp slt i16 %.reload155, %add84.11 br i1 %cmp77.12, label %A12, label %B13 diff --git a/polly/test/ScopInfo/user_provided_assumptions.ll b/polly/test/ScopInfo/user_provided_assumptions.ll index 9e68d863f3da..22691ab5e7d0 100644 --- a/polly/test/ScopInfo/user_provided_assumptions.ll +++ b/polly/test/ScopInfo/user_provided_assumptions.ll @@ -5,7 +5,7 @@ ; CHECK-NEXT: remark: :0:0: Use user assumption: [M, N] -> { : N <= 2147483647 - M } ; CHECK-NEXT: remark: :0:0: Use user assumption: [M, N] -> { : -2147483648 - M <= N <= 2147483647 - M } ; CHECK-NEXT: remark: :0:0: Use user assumption: [M, N, Debug] -> { : Debug = 0 and 0 < M <= 100 and -2147483648 - M <= N <= 2147483647 - M } -; CHECK-NEXT: remark: :0:0: Use user assumption: [M, N, Debug] -> { : Debug = 0 and 0 < M <= 100 and N > 0 and -2147483648 - M <= N <= 2147483647 - M } +; CHECK-NEXT: remark: :0:0: Use user assumption: [M, N, Debug] -> { : Debug = 0 and 0 < M <= 100 and 0 < N <= 2147483647 - M } ; CHECK-NEXT: remark: :0:0: SCoP ends here. ; SCOP: Context: