summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/CodePlacementOpt.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-05-12 23:58:14 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-05-12 23:58:14 +0000
commit85cca64dd759a1225544d58b54d612f99940b998 (patch)
treec3a5cd65f63f535370e334bdf15d3510c4163ce6 /llvm/lib/CodeGen/CodePlacementOpt.cpp
parent1b57ff32a828c485f5b685ffe02e2effa79f405a (diff)
downloadbcm5719-llvm-85cca64dd759a1225544d58b54d612f99940b998.tar.gz
bcm5719-llvm-85cca64dd759a1225544d58b54d612f99940b998.zip
If header of inner loop is aligned, do not align the outer loop header. We don't want to add nops in the outer loop for the sake of aligning the inner loop.
llvm-svn: 71609
Diffstat (limited to 'llvm/lib/CodeGen/CodePlacementOpt.cpp')
-rw-r--r--llvm/lib/CodeGen/CodePlacementOpt.cpp39
1 files changed, 33 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/CodePlacementOpt.cpp b/llvm/lib/CodeGen/CodePlacementOpt.cpp
index 2e1d12d2346..61a8b12860a 100644
--- a/llvm/lib/CodeGen/CodePlacementOpt.cpp
+++ b/llvm/lib/CodeGen/CodePlacementOpt.cpp
@@ -62,6 +62,8 @@ namespace {
private:
bool OptimizeIntraLoopEdges();
+ bool HeaderShouldBeAligned(MachineBasicBlock *MBB, MachineLoop *L,
+ SmallPtrSet<MachineBasicBlock*, 4> &DoNotAlign);
bool AlignLoops(MachineFunction &MF);
};
@@ -244,14 +246,37 @@ bool CodePlacementOpt::OptimizeIntraLoopEdges() {
/// should be aligned. For now, we will not align it if all the predcessors
/// (i.e. loop back edges) are laid out above the header. FIXME: Do not
/// align small loops.
-static bool HeaderShouldBeAligned(MachineBasicBlock *MBB) {
+bool
+CodePlacementOpt::HeaderShouldBeAligned(MachineBasicBlock *MBB, MachineLoop *L,
+ SmallPtrSet<MachineBasicBlock*, 4> &DoNotAlign) {
+ if (DoNotAlign.count(MBB))
+ return false;
+
+ bool BackEdgeBelow = false;
for (MachineBasicBlock::pred_iterator PI = MBB->pred_begin(),
PE = MBB->pred_end(); PI != PE; ++PI) {
MachineBasicBlock *PredMBB = *PI;
- if (PredMBB == MBB || PredMBB->getNumber() > MBB->getNumber())
- return true;
+ if (PredMBB == MBB || PredMBB->getNumber() > MBB->getNumber()) {
+ BackEdgeBelow = true;
+ break;
+ }
+ }
+
+ if (!BackEdgeBelow)
+ return false;
+
+ // Ok, we are going to align this loop header. If it's an inner loop,
+ // do not align its outer loop.
+ MachineBasicBlock *PreHeader = L->getLoopPreheader();
+ if (PreHeader) {
+ MachineLoop *L = MLI->getLoopFor(PreHeader);
+ if (L) {
+ MachineBasicBlock *HeaderBlock = L->getHeader();
+ HeaderBlock->setAlignment(0);
+ DoNotAlign.insert(HeaderBlock);
+ }
}
- return false;
+ return true;
}
/// AlignLoops - Align loop headers to target preferred alignments.
@@ -269,14 +294,16 @@ bool CodePlacementOpt::AlignLoops(MachineFunction &MF) {
MF.RenumberBlocks();
bool Changed = false;
+ SmallPtrSet<MachineBasicBlock*, 4> DoNotAlign;
for (unsigned i = 0, e = LoopHeaders.size(); i != e; ++i) {
MachineBasicBlock *HeaderMBB = LoopHeaders[i];
MachineBasicBlock *PredMBB = prior(MachineFunction::iterator(HeaderMBB));
- if (MLI->getLoopFor(HeaderMBB) == MLI->getLoopFor(PredMBB))
+ MachineLoop *L = MLI->getLoopFor(HeaderMBB);
+ if (L == MLI->getLoopFor(PredMBB))
// If previously BB is in the same loop, don't align this BB. We want
// to prevent adding noop's inside a loop.
continue;
- if (HeaderShouldBeAligned(HeaderMBB)) {
+ if (HeaderShouldBeAligned(HeaderMBB, L, DoNotAlign)) {
HeaderMBB->setAlignment(Align);
Changed = true;
++NumHeaderAligned;
OpenPOWER on IntegriCloud