diff options
author | Davide Italiano <davide@freebsd.org> | 2017-05-11 19:37:43 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2017-05-11 19:37:43 +0000 |
commit | 36acbc716d7da51dc7f1306a172eb7f512a394ae (patch) | |
tree | 3978ad8365b6efbca4449b856922764d45682eb7 | |
parent | 2cbd1f6c9fd9792bc5a7e04a5b5defdb64b08c86 (diff) | |
download | bcm5719-llvm-36acbc716d7da51dc7f1306a172eb7f512a394ae.tar.gz bcm5719-llvm-36acbc716d7da51dc7f1306a172eb7f512a394ae.zip |
[LiveVariables] Switch Kill/Defs sets to be DenseSet(s).
The testcase in PR32984 shows a non linear compile time increase
after a change that made the LoopUnroll pass more aggressive
(increasing the threshold).
My profiling shows all the time of PHI elimination goes to
llvm::LiveVariables::addNewBlock. This is because we keep
Defs/Kills registers in a SmallSet and vfind(const T &V); is O(N).
Switching to a DenseSet reduces the time spent in the pass from
297 seconds to 97 seconds. Profiling still shows a lot of time is
spent iterating the data structure, so I guess there's room for
improvement.
Dan tells me GCC uses real set operations for live registers and
it takes no-time on this testcase. Matthias points out we might
want to switch all this to LiveIntervalAnalysis so it's not entirely
sure if a rewrite is worth it.
Differential Revision: https://reviews.llvm.org/D33088
llvm-svn: 302819
-rw-r--r-- | llvm/lib/CodeGen/LiveVariables.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp index 3568b0294ad..a9aec926115 100644 --- a/llvm/lib/CodeGen/LiveVariables.cpp +++ b/llvm/lib/CodeGen/LiveVariables.cpp @@ -767,7 +767,7 @@ void LiveVariables::addNewBlock(MachineBasicBlock *BB, MachineBasicBlock *SuccBB) { const unsigned NumNew = BB->getNumber(); - SmallSet<unsigned, 16> Defs, Kills; + DenseSet<unsigned> Defs, Kills; MachineBasicBlock::iterator BBI = SuccBB->begin(), BBE = SuccBB->end(); for (; BBI != BBE && BBI->isPHI(); ++BBI) { |