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

43 lines
985 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_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
}