diff options
author | Chris Lattner <sabre@nondot.org> | 2011-01-02 07:35:53 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-01-02 07:35:53 +0000 |
commit | d9e079706e782c5f054322a0d15f063a1a683230 (patch) | |
tree | d4d2b264fb313a72054717b1655f0fd9dc9a8c30 /lib/Transforms/Scalar/LoopRotation.cpp | |
parent | 8252ad1351594039fa5d6633ff3eef1bafb7fdf9 (diff) | |
download | llvm-d9e079706e782c5f054322a0d15f063a1a683230.tar.gz llvm-d9e079706e782c5f054322a0d15f063a1a683230.tar.bz2 llvm-d9e079706e782c5f054322a0d15f063a1a683230.tar.xz |
improve loop rotation to use CodeMetrics to analyze the
size of a loop header instead of its own code size estimator.
This allows it to handle bitcasts etc more precisely.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122681 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopRotation.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopRotation.cpp | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/lib/Transforms/Scalar/LoopRotation.cpp b/lib/Transforms/Scalar/LoopRotation.cpp index 88cb9d73b2..efa46f4781 100644 --- a/lib/Transforms/Scalar/LoopRotation.cpp +++ b/lib/Transforms/Scalar/LoopRotation.cpp @@ -14,9 +14,9 @@ #define DEBUG_TYPE "loop-rotate" #include "llvm/Transforms/Scalar.h" #include "llvm/Function.h" -#include "llvm/IntrinsicInst.h" #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/Dominators.h" +#include "llvm/Analysis/CodeMetrics.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" @@ -142,23 +142,14 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) { if (ExitBlocks.size() > 1) return false; - // Check size of original header and reject - // loop if it is very big. - unsigned Size = 0; - - // FIXME: Use common api to estimate size. - for (BasicBlock::const_iterator OI = OrigHeader->begin(), - OE = OrigHeader->end(); OI != OE; ++OI) { - if (isa<PHINode>(OI)) - continue; // PHI nodes don't count. - if (isa<DbgInfoIntrinsic>(OI)) - continue; // Debug intrinsics don't count as size. - ++Size; + // Check size of original header and reject loop if it is very big. + { + CodeMetrics Metrics; + Metrics.analyzeBasicBlock(OrigHeader); + if (Metrics.NumInsts > MAX_HEADER_SIZE) + return false; } - if (Size > MAX_HEADER_SIZE) - return false; - // Now, this loop is suitable for rotation. // Anything ScalarEvolution may know about this loop or the PHI nodes |