Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
ScopInfo: Correct schedule construction For schedule generation we assumed that the reverse post order traversal used by the domain generation is sufficient, however it is not. Once a loop is discovered, we have to completely traverse it, before we can generate the schedule for any block/region that is only reachable through a loop exiting block. To this end, we add a "loop stack" that will keep track of loops we discovered during the traversal but have not yet traversed completely. We will never visit a basic block (or region) outside the most recent (thus smallest) loop in the loop stack but instead queue such blocks (or regions) in a waiting list. If the waiting list is not empty and (might) contain blocks from the most recent loop in the loop stack the next block/region to visit is drawn from there, otherwise from the reverse post order iterator. We exploit the new property of loops being always completed before additional loops are processed, by removing the LoopSchedules map and instead keep all information in LoopStack. This clarifies that we indeed always only keep a stack of in-process loops, but will never keep incomplete schedules for an arbitrary set of loops. As a result, we can simplify some of the existing code. This patch also adds some more documentation about how our schedule construction works. This fixes http://llvm.org/PR25879 This patch is an modified version of Johannes Doerfert's initial fix. Differential Revision: http://reviews.llvm.org/D15679 llvm-svn: 259709
- Loading branch information
1 parent
2d60342
commit b6ee445
Showing
4 changed files
with
233 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
42 changes: 42 additions & 0 deletions
42
polly/test/ScopInfo/schedule-const-post-dominator-walk-2.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
; RUN: opt %loadPolly -analyze -polly-scops < %s | FileCheck %s | ||
|
||
; CHECK: Stmt_loopA[i0] -> [0, 0, 0] | ||
; CHECK-DAG: Stmt_loopB[i0] -> [0, 0, 1] | ||
; CHECK-DAG: Stmt_bbB[] -> [1, 0, 0] | ||
; CHECK-DAG: Stmt_bbA[] -> [2, 0, 0] | ||
; CHECK-DAG: Stmt_bbMerge[] -> [3, 0, 0] | ||
|
||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
|
||
define void @hoge(i64 %p0, i64 %p1, i64 %p2, i64 %p3, float* %A) { | ||
entry: | ||
br label %loopA | ||
|
||
loopA: | ||
%tmp4 = phi i64 [ 0, %entry ], [ 0, %loopB] | ||
store float 42.0, float* %A | ||
%cmp0 = icmp sle i64 %p0, 100 | ||
br i1 %cmp0, label %loopB, label %bbB | ||
|
||
loopB: | ||
store float 42.0, float* %A | ||
%cmp1 = icmp sle i64 %p1, 100 | ||
br i1 %cmp1, label %loopA, label %bbA | ||
|
||
bbA: | ||
store float 42.0, float* %A | ||
%cmpbbA = icmp sle i64 %p2, 50 | ||
br i1 %cmpbbA, label %bbMerge, label %exit | ||
|
||
bbB: | ||
store float 42.0, float* %A | ||
%cmpbbB= icmp sle i64 %p3, 200 | ||
br i1 %cmpbbB, label %exit, label %bbMerge | ||
|
||
bbMerge: | ||
store float 42.0, float* %A | ||
br label %exit | ||
|
||
exit: | ||
ret void | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
; RUN: opt %loadPolly -analyze -polly-scops < %s | FileCheck %s | ||
|
||
; CHECK: { Stmt_bb3[i0] -> [0, 0] }; | ||
; CHECK: { Stmt_bb2[] -> [1, 0] }; | ||
|
||
; Verify that we generate the correct schedule. In older versions of Polly, | ||
; we generated an incorrect schedule: | ||
; | ||
; { Stmt_bb3[i0] -> [1, 0]; Stmt_bb2[] -> [0, 0] } | ||
; | ||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
|
||
define void @hoge() { | ||
bb: | ||
br label %bb3 | ||
|
||
bb1: ; preds = %bb5 | ||
br label %bb6 | ||
|
||
bb2: ; preds = %bb3 | ||
%tmp = phi i64 [ %tmp4, %bb3 ] | ||
br label %bb6 | ||
|
||
bb3: ; preds = %bb5, %bb | ||
%tmp4 = phi i64 [ 0, %bb ], [ 0, %bb5 ] | ||
br i1 false, label %bb5, label %bb2 | ||
|
||
bb5: ; preds = %bb3 | ||
br i1 false, label %bb3, label %bb1 | ||
|
||
bb6: ; preds = %bb2, %bb1 | ||
%tmp2 = phi i64 [ %tmp, %bb2 ], [ undef, %bb1 ] | ||
ret void | ||
} |