two minor changes: switch to the standard ValueToValueMapTy

map from ValueMapper.h (giving us access to its utilities)
and add a fastpath in the loop rotation code, avoiding expensive
ssa updator manipulation for values with nothing to update.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2011-01-08 07:21:31 +00:00
parent da7a32c07d
commit 6ccb365293

View File

@ -21,10 +21,10 @@
#include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/SSAUpdater.h" #include "llvm/Transforms/Utils/SSAUpdater.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
#include "llvm/ADT/SmallVector.h"
using namespace llvm; using namespace llvm;
#define MAX_HEADER_SIZE 16 #define MAX_HEADER_SIZE 16
@ -177,7 +177,7 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// Begin by walking OrigHeader and populating ValueMap with an entry for // Begin by walking OrigHeader and populating ValueMap with an entry for
// each Instruction. // each Instruction.
BasicBlock::iterator I = OrigHeader->begin(), E = OrigHeader->end(); BasicBlock::iterator I = OrigHeader->begin(), E = OrigHeader->end();
DenseMap<const Value *, Value *> ValueMap; ValueToValueMapTy ValueMap;
// For PHI nodes, the value available in OldPreHeader is just the // For PHI nodes, the value available in OldPreHeader is just the
// incoming value from OldPreHeader. // incoming value from OldPreHeader.
@ -233,6 +233,11 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
Value *OrigHeaderVal = I; Value *OrigHeaderVal = I;
Value *OrigPreHeaderVal = ValueMap[OrigHeaderVal]; Value *OrigPreHeaderVal = ValueMap[OrigHeaderVal];
// If there are no uses of the value (e.g. because it returns void), there
// is nothing to rewrite.
if (OrigHeaderVal->use_empty() && OrigPreHeaderVal->use_empty())
continue;
// The value now exits in two versions: the initial value in the preheader // The value now exits in two versions: the initial value in the preheader
// and the loop "next" value in the original header. // and the loop "next" value in the original header.
SSA.Initialize(OrigHeaderVal->getType(), OrigHeaderVal->getName()); SSA.Initialize(OrigHeaderVal->getType(), OrigHeaderVal->getName());