summaryrefslogtreecommitdiff
path: root/lib/CodeGen/MachineLoopInfo.cpp
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-06-20 05:23:33 +0000
committerAndrew Trick <atrick@apple.com>2012-06-20 05:23:33 +0000
commit37aa33bc11c01a7142bfa2428a5a4d219b07b6c3 (patch)
tree2f976a6c7e2893caac5cec7813fa9dffdbc853a2 /lib/CodeGen/MachineLoopInfo.cpp
parent9059390cf0a6d57add00169c28805bb9a59308b6 (diff)
downloadllvm-37aa33bc11c01a7142bfa2428a5a4d219b07b6c3.tar.gz
llvm-37aa33bc11c01a7142bfa2428a5a4d219b07b6c3.tar.bz2
llvm-37aa33bc11c01a7142bfa2428a5a4d219b07b6c3.tar.xz
A new algorithm for computing LoopInfo. Temporarily disabled.
-stable-loops enables a new algorithm for generating the Loop forest. It differs from the original algorithm in a few respects: - Not determined by use-list order. - Initially guarantees RPO order of block and subloops. - Linear in the number of CFG edges. - Nonrecursive. I didn't want to change the LoopInfo API yet, so the block lists are still inclusive. This seems strange to me, and it means that building LoopInfo is not strictly linear, but it may not be a problem in practice. At least the block lists start out in RPO order now. In the future we may add an attribute or wrapper analysis that allows other passes to assume RPO order. The primary motivation of this work was not to optimize LoopInfo, but to allow reproducing performance issues by decomposing the compilation stages. I'm often unable to do this with the current LoopInfo, because the loop tree order determines Loop pass order. Serializing the IR tends to invert the order, which reverses the optimization order. This makes it nearly impossible to debug interdependent loop optimizations such as LSR. I also believe this will provide more stable performance results across time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158790 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineLoopInfo.cpp')
-rw-r--r--lib/CodeGen/MachineLoopInfo.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/CodeGen/MachineLoopInfo.cpp b/lib/CodeGen/MachineLoopInfo.cpp
index b5d5ad9be9..b7298e48ee 100644
--- a/lib/CodeGen/MachineLoopInfo.cpp
+++ b/lib/CodeGen/MachineLoopInfo.cpp
@@ -18,6 +18,7 @@
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/Analysis/LoopInfoImpl.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
using namespace llvm;
@@ -25,6 +26,10 @@ using namespace llvm;
template class llvm::LoopBase<MachineBasicBlock, MachineLoop>;
template class llvm::LoopInfoBase<MachineBasicBlock, MachineLoop>;
+static cl::opt<bool>
+StableLoopInfo("stable-machine-loops", cl::Hidden, cl::init(false),
+ cl::desc("Compute a stable loop tree."));
+
char MachineLoopInfo::ID = 0;
INITIALIZE_PASS_BEGIN(MachineLoopInfo, "machine-loops",
"Machine Natural Loop Construction", true, true)
@@ -36,7 +41,10 @@ char &llvm::MachineLoopInfoID = MachineLoopInfo::ID;
bool MachineLoopInfo::runOnMachineFunction(MachineFunction &) {
releaseMemory();
- LI.Calculate(getAnalysis<MachineDominatorTree>().getBase()); // Update
+ if (StableLoopInfo)
+ LI.Analyze(getAnalysis<MachineDominatorTree>().getBase());
+ else
+ LI.Calculate(getAnalysis<MachineDominatorTree>().getBase()); // Update
return false;
}