Make a somewhat subtle change in the logic of block placement. Sometimes

the loop header has a non-loop predecessor which has been pre-fused into
its chain due to unanalyzable branches. In this case, rotating the
header into the body of the loop in order to place a loop exit at the
bottom of the loop is a Very Bad Idea as it makes the loop
non-contiguous.

I'm working on a good test case for this, but it's a bit annoynig to
craft. I should get one shortly, but I'm submitting this now so I can
begin the (lengthy) performance analysis process. An initial run of LNT
looks really, really good, but there is too much noise there for me to
trust it much.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154395 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2012-04-10 13:35:57 +00:00
parent 999821cddf
commit 45fb79bc54

View File

@ -547,6 +547,18 @@ MachineBasicBlock *
MachineBlockPlacement::findBestLoopTop(MachineFunction &F, MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
MachineLoop &L, MachineLoop &L,
const BlockFilterSet &LoopBlockSet) { const BlockFilterSet &LoopBlockSet) {
// We don't want to layout the loop linearly in all cases. If the loop header
// is just a normal basic block in the loop, we want to look for what block
// within the loop is the best one to layout at the top. However, if the loop
// header has be pre-merged into a chain due to predecessors not having
// analyzable branches, *and* the predecessor it is merged with is *not* part
// of the loop, rotating the header into the middle of the loop will create
// a non-contiguous range of blocks which is Very Bad. So start with the
// header and only rotate if safe.
BlockChain &HeaderChain = *BlockToChain[L.getHeader()];
if (!LoopBlockSet.count(*HeaderChain.begin()))
return L.getHeader();
BlockFrequency BestExitEdgeFreq; BlockFrequency BestExitEdgeFreq;
MachineBasicBlock *ExitingBB = 0; MachineBasicBlock *ExitingBB = 0;
MachineBasicBlock *LoopingBB = 0; MachineBasicBlock *LoopingBB = 0;