llvm-project/polly/test/ScopInfo/schedule-const-post-dominat...

35 lines
999 B
LLVM
Raw Normal View 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: 259354
2016-02-01 19:54:13 +08:00
; 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
}