ScopInfo: Correct schedule construction
commit5c606c9ab7943ac9181f7d3d962c51509a15c6be
authorTobias Grosser <tobias@grosser.es>
Mon, 1 Feb 2016 11:54:13 +0000 (1 11:54 +0000)
committerTobias Grosser <tobias@grosser.es>
Mon, 1 Feb 2016 11:54:13 +0000 (1 11:54 +0000)
tree42ff3ff23de499ffe3cb64372333f0e8bc7d9b93
parent3595d08e8175f38c3be54bb3b6d2c13ccddfb869
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

git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@259354 91177308-0d34-0410-b5e6-96231b3b80d8
include/polly/ScopInfo.h
lib/Analysis/ScopInfo.cpp
test/ScopInfo/schedule-const-post-dominator-walk-2.ll [new file with mode: 0644]
test/ScopInfo/schedule-const-post-dominator-walk.ll [new file with mode: 0644]