mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 06:00:28 +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,
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user