mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
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:
parent
999821cddf
commit
45fb79bc54
@ -547,6 +547,18 @@ MachineBasicBlock *
|
||||
MachineBlockPlacement::findBestLoopTop(MachineFunction &F,
|
||||
MachineLoop &L,
|
||||
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;
|
||||
MachineBasicBlock *ExitingBB = 0;
|
||||
MachineBasicBlock *LoopingBB = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user