[polly] r269053 - [FIX] Create error-restrictions late

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Tue May 10 05:42:27 PDT 2016


Author: jdoerfert
Date: Tue May 10 07:42:26 2016
New Revision: 269053

URL: http://llvm.org/viewvc/llvm-project?rev=269053&view=rev
Log:
[FIX] Create error-restrictions late

  Before this patch we generated error-restrictions only for
  error-blocks, thus blocks (or regions) containing a not represented
  function call. However, the same reasoning is needed if the invalid
  domain of a statement subsumes its actual domain. To this end we move
  the generation of error-restrictions after the propagation of the
  invalid domains. Consequently, error-statements are now defined more
  general as statements that are assumed to be not executed.
  Additionally, we do not record an empty domain for such statements but
  a nullptr instead. This allows to distinguish between error-statements
  and dead-statements.


Added:
    polly/trunk/test/ScopInfo/parameter_in_dead_statement.ll
    polly/trunk/test/ScopInfo/restriction_in_dead_block.ll
Modified:
    polly/trunk/lib/Analysis/ScopInfo.cpp

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=269053&r1=269052&r2=269053&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Tue May 10 07:42:26 2016
@@ -2383,8 +2383,10 @@ void Scop::propagateInvalidStmtDomains(R
     } else {
       isl_set_free(InvalidDomain);
       InvalidDomain = Domain;
-      auto *EmptyDom = isl_set_empty(isl_set_get_space(InvalidDomain));
-      Domain = EmptyDom;
+      isl_set *DomPar = isl_set_params(isl_set_copy(Domain));
+      recordAssumption(ERRORBLOCK, DomPar, BB->getTerminator()->getDebugLoc(),
+                       AS_RESTRICTION);
+      Domain = nullptr;
     }
 
     if (isl_set_is_empty(InvalidDomain)) {
@@ -2706,14 +2708,6 @@ void Scop::propagateDomainConstraints(Re
     Loop *BBLoop = getRegionNodeLoop(RN, LI);
     if (BBLoop && BBLoop->getHeader() == BB && getRegion().contains(BBLoop))
       addLoopBoundsToHeaderDomain(BBLoop, LI);
-
-    // Add assumptions for error blocks.
-    if (containsErrorBlock(RN, getRegion(), LI, DT)) {
-      IsOptimized = true;
-      isl_set *DomPar = isl_set_params(isl_set_copy(Domain));
-      recordAssumption(ERRORBLOCK, DomPar, BB->getTerminator()->getDebugLoc(),
-                       AS_RESTRICTION);
-    }
   }
 }
 
@@ -3180,7 +3174,7 @@ void Scop::simplifySCoP(bool AfterHoisti
 
     bool RemoveStmt = Stmt.isEmpty();
     if (!RemoveStmt)
-      RemoveStmt = isl_set_is_empty(DomainMap[Stmt.getEntryBlock()]);
+      RemoveStmt = !DomainMap[Stmt.getEntryBlock()];
 
     // Remove read only statements only after invariant loop hoisting.
     if (!RemoveStmt && AfterHoisting) {
@@ -3647,6 +3641,13 @@ void Scop::addRecordedAssumptions() {
       continue;
     }
 
+    // If the domain was deleted the assumptions are void.
+    isl_set *Dom = getDomainConditions(AS.BB);
+    if (!Dom) {
+      isl_set_free(AS.Set);
+      continue;
+    }
+
     // If a basic block was given use its domain to simplify the assumption.
     // In case of restrictions we know they only have to hold on the domain,
     // thus we can intersect them with the domain of the block. However, for
@@ -3657,7 +3658,6 @@ void Scop::addRecordedAssumptions() {
     // To avoid the complement we will register A - B as a restricton not an
     // assumption.
     isl_set *S = AS.Set;
-    isl_set *Dom = getDomainConditions(AS.BB);
     if (AS.Sign == AS_RESTRICTION)
       S = isl_set_params(isl_set_intersect(S, Dom));
     else /* (AS.Sign == AS_ASSUMPTION) */

Added: polly/trunk/test/ScopInfo/parameter_in_dead_statement.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/parameter_in_dead_statement.ll?rev=269053&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/parameter_in_dead_statement.ll (added)
+++ polly/trunk/test/ScopInfo/parameter_in_dead_statement.ll Tue May 10 07:42:26 2016
@@ -0,0 +1,41 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s --check-prefix=IR
+;
+; Verify we do not create assumptions based on the parameter p_1 which is the
+; load %0 and due to error-assumptions not "part of the SCoP".
+;
+; CHECK:        Invalid Context:
+; CHECK-NEXT:     [releaseCount, p_1] -> {  : releaseCount > 0 }
+;
+; IR: polly.start
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+; Function Attrs: uwtable
+define void @_ZN8NWindows16NSynchronization14CSemaphoreWFMO7ReleaseEi(i32 %releaseCount) {
+entry:
+  br label %entry.split
+
+entry.split:                                      ; preds = %entry
+  %cmp = icmp slt i32 %releaseCount, 1
+  br i1 %cmp, label %return, label %if.end
+
+if.end:                                           ; preds = %entry.split
+  tail call void @_ZN8NWindows16NSynchronization8CSynchro5EnterEv()
+  %0 = load i32, i32* null, align 8
+  %add = add nsw i32 %0, %releaseCount
+  %cmp2 = icmp sgt i32 %add, 0
+  br i1 %cmp2, label %if.then3, label %if.end5
+
+if.then3:                                         ; preds = %if.end
+  br label %return
+
+if.end5:                                          ; preds = %if.end
+  br label %return
+
+return:                                           ; preds = %if.end5, %if.then3, %entry.split
+  %retval.1 = phi i32 [ 1, %entry.split ], [ 1, %if.then3 ], [ 0, %if.end5 ]
+  ret void
+}
+
+; Function Attrs: nounwind uwtable
+declare void @_ZN8NWindows16NSynchronization8CSynchro5EnterEv()

Added: polly/trunk/test/ScopInfo/restriction_in_dead_block.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/restriction_in_dead_block.ll?rev=269053&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/restriction_in_dead_block.ll (added)
+++ polly/trunk/test/ScopInfo/restriction_in_dead_block.ll Tue May 10 07:42:26 2016
@@ -0,0 +1,55 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+;
+; Verify we do not generate an empty invalid context only because the wrap
+; in the second conditional will always happen if the block is executed.
+;
+; CHECK:       Invalid Context:
+; CHECK-NEXT:    [N] -> {  : N > 0 }
+;
+;    void f(char *A, char N) {
+;      for (char i = 0; i < 10; i++) {
+;        if (N > 0)
+;          if (1 + 127 * N > 0)
+;            A[i] = 1;
+;        A[i] = 0;
+;      }
+;    }
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @f(i8* %A, i8 signext %N) {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc, %entry
+  %indvars.iv = phi i8 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
+  %exitcond = icmp ne i8 %indvars.iv, 10
+  br i1 %exitcond, label %for.body, label %for.end
+
+for.body:                                         ; preds = %for.cond
+  %cmp3 = icmp sgt i8 %N, 0
+  br i1 %cmp3, label %if.then, label %if.end10
+
+if.then:                                           ; preds = %for.body
+  %mul = mul i8 %N, 127
+  %add = add i8 1, %mul
+  %cmp7 = icmp sgt i8 %add, 0
+  br i1 %cmp7, label %if.then9, label %if.end10
+
+if.then9:                                         ; preds = %if.end
+  %arrayidx = getelementptr inbounds i8, i8* %A, i8 %indvars.iv
+  store i8 1, i8* %arrayidx, align 1
+  br label %if.end10
+
+if.end10:                                         ; preds = %if.then9, %if.end
+  %arrayidx12 = getelementptr inbounds i8, i8* %A, i8 %indvars.iv
+  store i8 0, i8* %arrayidx12, align 1
+  br label %for.inc
+
+for.inc:                                          ; preds = %if.end10, %if.then
+  %indvars.iv.next = add nuw nsw i8 %indvars.iv, 1
+  br label %for.cond
+
+for.end:                                          ; preds = %for.cond
+  ret void
+}




More information about the llvm-commits mailing list