summaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-06-27 10:44:33 +0000
committered <ed@FreeBSD.org>2009-06-27 10:44:33 +0000
commitcf5cd875b51255602afaed29deb636b66b295671 (patch)
tree9794dc36f22f2a2b3f8063829d8a9b3a7794acc8 /lib/Transforms
parent5c1b5c146f3df07c75174aff06c3bb0968f6857e (diff)
downloadFreeBSD-src-cf5cd875b51255602afaed29deb636b66b295671.zip
FreeBSD-src-cf5cd875b51255602afaed29deb636b66b295671.tar.gz
Import LLVM r74383.
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/IPO/StripSymbols.cpp21
-rw-r--r--lib/Transforms/Scalar/CMakeLists.txt2
-rw-r--r--lib/Transforms/Scalar/IndVarSimplify.cpp201
-rw-r--r--lib/Transforms/Scalar/LoopRotation.cpp45
-rw-r--r--lib/Transforms/Scalar/LoopStrengthReduce.cpp15
-rw-r--r--lib/Transforms/Scalar/PredicateSimplifier.cpp5
-rw-r--r--lib/Transforms/Utils/CMakeLists.txt2
-rw-r--r--lib/Transforms/Utils/LCSSA.cpp13
-rw-r--r--lib/Transforms/Utils/Local.cpp41
9 files changed, 127 insertions, 218 deletions
diff --git a/lib/Transforms/IPO/StripSymbols.cpp b/lib/Transforms/IPO/StripSymbols.cpp
index ab8fe5f..046e044 100644
--- a/lib/Transforms/IPO/StripSymbols.cpp
+++ b/lib/Transforms/IPO/StripSymbols.cpp
@@ -26,6 +26,7 @@
#include "llvm/Instructions.h"
#include "llvm/Module.h"
#include "llvm/Pass.h"
+#include "llvm/Analysis/DebugInfo.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/TypeSymbolTable.h"
#include "llvm/Transforms/Utils/Local.h"
@@ -210,7 +211,25 @@ bool StripDebugInfo(Module &M) {
SmallPtrSet<const GlobalValue*, 8> llvmUsedValues;
findUsedValues(M, llvmUsedValues);
- // Delete all dbg variables.
+ SmallVector<GlobalVariable *, 2> CUs;
+ SmallVector<GlobalVariable *, 4> GVs;
+ SmallVector<GlobalVariable *, 4> SPs;
+ CollectDebugInfoAnchors(M, CUs, GVs, SPs);
+ // These anchors use LinkOnce linkage so that the optimizer does not
+ // remove them accidently. Set InternalLinkage for all these debug
+ // info anchors.
+ for (SmallVector<GlobalVariable *, 2>::iterator I = CUs.begin(),
+ E = CUs.end(); I != E; ++I)
+ (*I)->setLinkage(GlobalValue::InternalLinkage);
+ for (SmallVector<GlobalVariable *, 4>::iterator I = GVs.begin(),
+ E = GVs.end(); I != E; ++I)
+ (*I)->setLinkage(GlobalValue::InternalLinkage);
+ for (SmallVector<GlobalVariable *, 4>::iterator I = SPs.begin(),
+ E = SPs.end(); I != E; ++I)
+ (*I)->setLinkage(GlobalValue::InternalLinkage);
+
+
+ // Delete all dbg variables.
for (Module::global_iterator I = M.global_begin(), E = M.global_end();
I != E; ++I) {
GlobalVariable *GV = dyn_cast<GlobalVariable>(I);
diff --git a/lib/Transforms/Scalar/CMakeLists.txt b/lib/Transforms/Scalar/CMakeLists.txt
index 7a7c48b..8a8f83f 100644
--- a/lib/Transforms/Scalar/CMakeLists.txt
+++ b/lib/Transforms/Scalar/CMakeLists.txt
@@ -31,3 +31,5 @@ add_llvm_library(LLVMScalarOpts
TailDuplication.cpp
TailRecursionElimination.cpp
)
+
+target_link_libraries (LLVMScalarOpts LLVMTransformUtils)
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp
index 6c20e7d..27e377f 100644
--- a/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -70,6 +70,7 @@ namespace {
IVUsers *IU;
LoopInfo *LI;
ScalarEvolution *SE;
+ DominatorTree *DT;
bool Changed;
public:
@@ -101,14 +102,13 @@ namespace {
BasicBlock *ExitingBlock,
BranchInst *BI,
SCEVExpander &Rewriter);
- void RewriteLoopExitValues(Loop *L, const SCEV *BackedgeTakenCount);
+ void RewriteLoopExitValues(Loop *L, const SCEV *BackedgeTakenCount,
+ SCEVExpander &Rewriter);
void RewriteIVExpressions(Loop *L, const Type *LargestType,
SCEVExpander &Rewriter);
- void SinkUnusedInvariants(Loop *L, SCEVExpander &Rewriter);
-
- void FixUsesBeforeDefs(Loop *L, SCEVExpander &Rewriter);
+ void SinkUnusedInvariants(Loop *L);
void HandleFloatingPointIV(Loop *L, PHINode *PH);
};
@@ -169,10 +169,10 @@ ICmpInst *IndVarSimplify::LinearFunctionTestReplace(Loop *L,
CmpIndVar = IndVar;
}
- // Expand the code for the iteration count into the preheader of the loop.
- BasicBlock *Preheader = L->getLoopPreheader();
- Value *ExitCnt = Rewriter.expandCodeFor(RHS, IndVar->getType(),
- Preheader->getTerminator());
+ // Expand the code for the iteration count.
+ assert(RHS->isLoopInvariant(L) &&
+ "Computed iteration count is not loop invariant!");
+ Value *ExitCnt = Rewriter.expandCodeFor(RHS, IndVar->getType(), BI);
// Insert a new icmp_ne or icmp_eq instruction before the branch.
ICmpInst::Predicate Opcode;
@@ -214,28 +214,13 @@ ICmpInst *IndVarSimplify::LinearFunctionTestReplace(Loop *L,
/// able to brute-force evaluate arbitrary instructions as long as they have
/// constant operands at the beginning of the loop.
void IndVarSimplify::RewriteLoopExitValues(Loop *L,
- const SCEV *BackedgeTakenCount) {
+ const SCEV *BackedgeTakenCount,
+ SCEVExpander &Rewriter) {
// Verify the input to the pass in already in LCSSA form.
assert(L->isLCSSAForm());
- BasicBlock *Preheader = L->getLoopPreheader();
-
- // Scan all of the instructions in the loop, looking at those that have
- // extra-loop users and which are recurrences.
- SCEVExpander Rewriter(*SE);
-
- // We insert the code into the preheader of the loop if the loop contains
- // multiple exit blocks, or in the exit block if there is exactly one.
- BasicBlock *BlockToInsertInto;
SmallVector<BasicBlock*, 8> ExitBlocks;
L->getUniqueExitBlocks(ExitBlocks);
- if (ExitBlocks.size() == 1)
- BlockToInsertInto = ExitBlocks[0];
- else
- BlockToInsertInto = Preheader;
- BasicBlock::iterator InsertPt = BlockToInsertInto->getFirstNonPHI();
-
- std::map<Instruction*, Value*> ExitValues;
// Find all values that are computed inside the loop, but used outside of it.
// Because of LCSSA, these values will only occur in LCSSA PHI Nodes. Scan
@@ -285,11 +270,7 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L,
Changed = true;
++NumReplaced;
- // See if we already computed the exit value for the instruction, if so,
- // just reuse it.
- Value *&ExitVal = ExitValues[Inst];
- if (!ExitVal)
- ExitVal = Rewriter.expandCodeFor(ExitValue, PN->getType(), InsertPt);
+ Value *ExitVal = Rewriter.expandCodeFor(ExitValue, PN->getType(), Inst);
DOUT << "INDVARS: RLEV: AfterLoopVal = " << *ExitVal
<< " LoopVal = " << *Inst << "\n";
@@ -309,6 +290,15 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L,
break;
}
}
+ if (ExitBlocks.size() != 1) {
+ // Clone the PHI and delete the original one. This lets IVUsers and
+ // any other maps purge the original user from their records.
+ PHINode *NewPN = PN->clone();
+ NewPN->takeName(PN);
+ NewPN->insertBefore(PN);
+ PN->replaceAllUsesWith(NewPN);
+ PN->eraseFromParent();
+ }
}
}
}
@@ -340,16 +330,19 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
IU = &getAnalysis<IVUsers>();
LI = &getAnalysis<LoopInfo>();
SE = &getAnalysis<ScalarEvolution>();
+ DT = &getAnalysis<DominatorTree>();
Changed = false;
// If there are any floating-point recurrences, attempt to
// transform them to use integer recurrences.
RewriteNonIntegerIVs(L);
- BasicBlock *Header = L->getHeader();
BasicBlock *ExitingBlock = L->getExitingBlock(); // may be null
const SCEV* BackedgeTakenCount = SE->getBackedgeTakenCount(L);
+ // Create a rewriter object which we'll use to transform the code with.
+ SCEVExpander Rewriter(*SE);
+
// Check to see if this loop has a computable loop-invariant execution count.
// If so, this means that we can compute the final value of any expressions
// that are recurrent in the loop, and substitute the exit values from the
@@ -357,7 +350,7 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
// the current expressions.
//
if (!isa<SCEVCouldNotCompute>(BackedgeTakenCount))
- RewriteLoopExitValues(L, BackedgeTakenCount);
+ RewriteLoopExitValues(L, BackedgeTakenCount, Rewriter);
// Compute the type of the largest recurrence expression, and decide whether
// a canonical induction variable should be inserted.
@@ -388,9 +381,6 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
NeedCannIV = true;
}
- // Create a rewriter object which we'll use to transform the code with.
- SCEVExpander Rewriter(*SE);
-
// Now that we know the largest of of the induction variable expressions
// in this loop, insert a canonical induction variable of the largest size.
Value *IndVar = 0;
@@ -408,7 +398,7 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
OldCannIV = 0;
}
- IndVar = Rewriter.getOrInsertCanonicalInductionVariable(L,LargestType);
+ IndVar = Rewriter.getOrInsertCanonicalInductionVariable(L, LargestType);
++NumInserted;
Changed = true;
@@ -434,20 +424,14 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
ExitingBlock, BI, Rewriter);
}
- Rewriter.setInsertionPoint(Header->getFirstNonPHI());
-
// Rewrite IV-derived expressions. Clears the rewriter cache.
RewriteIVExpressions(L, LargestType, Rewriter);
- // The Rewriter may only be used for isInsertedInstruction queries from this
- // point on.
+ // The Rewriter may not be used from this point on.
// Loop-invariant instructions in the preheader that aren't used in the
// loop may be sunk below the loop to reduce register pressure.
- SinkUnusedInvariants(L, Rewriter);
-
- // Reorder instructions to avoid use-before-def conditions.
- FixUsesBeforeDefs(L, Rewriter);
+ SinkUnusedInvariants(L);
// For completeness, inform IVUsers of the IV use in the newly-created
// loop exit test instruction.
@@ -488,29 +472,35 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, const Type *LargestType,
// Compute the final addrec to expand into code.
const SCEV* AR = IU->getReplacementExpr(*UI);
- Value *NewVal = 0;
- if (AR->isLoopInvariant(L)) {
- BasicBlock::iterator I = Rewriter.getInsertionPoint();
- // Expand loop-invariant values in the loop preheader. They will
- // be sunk to the exit block later, if possible.
- NewVal =
- Rewriter.expandCodeFor(AR, UseTy,
- L->getLoopPreheader()->getTerminator());
- Rewriter.setInsertionPoint(I);
- ++NumReplaced;
- } else {
- // FIXME: It is an extremely bad idea to indvar substitute anything more
- // complex than affine induction variables. Doing so will put expensive
- // polynomial evaluations inside of the loop, and the str reduction pass
- // currently can only reduce affine polynomials. For now just disable
- // indvar subst on anything more complex than an affine addrec, unless
- // it can be expanded to a trivial value.
- if (!Stride->isLoopInvariant(L))
- continue;
-
- // Now expand it into actual Instructions and patch it into place.
- NewVal = Rewriter.expandCodeFor(AR, UseTy);
- }
+ // FIXME: It is an extremely bad idea to indvar substitute anything more
+ // complex than affine induction variables. Doing so will put expensive
+ // polynomial evaluations inside of the loop, and the str reduction pass
+ // currently can only reduce affine polynomials. For now just disable
+ // indvar subst on anything more complex than an affine addrec, unless
+ // it can be expanded to a trivial value.
+ if (!AR->isLoopInvariant(L) && !Stride->isLoopInvariant(L))
+ continue;
+
+ // Determine the insertion point for this user. By default, insert
+ // immediately before the user. The SCEVExpander class will automatically
+ // hoist loop invariants out of the loop. For PHI nodes, there may be
+ // multiple uses, so compute the nearest common dominator for the
+ // incoming blocks.
+ Instruction *InsertPt = User;
+ if (PHINode *PHI = dyn_cast<PHINode>(InsertPt))
+ for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i)
+ if (PHI->getIncomingValue(i) == Op) {
+ if (InsertPt == User)
+ InsertPt = PHI->getIncomingBlock(i)->getTerminator();
+ else
+ InsertPt =
+ DT->findNearestCommonDominator(InsertPt->getParent(),
+ PHI->getIncomingBlock(i))
+ ->getTerminator();
+ }
+
+ // Now expand it into actual Instructions and patch it into place.
+ Value *NewVal = Rewriter.expandCodeFor(AR, UseTy, InsertPt);
// Patch the new value into place.
if (Op->hasName())
@@ -543,19 +533,20 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, const Type *LargestType,
/// If there's a single exit block, sink any loop-invariant values that
/// were defined in the preheader but not used inside the loop into the
/// exit block to reduce register pressure in the loop.
-void IndVarSimplify::SinkUnusedInvariants(Loop *L, SCEVExpander &Rewriter) {
+void IndVarSimplify::SinkUnusedInvariants(Loop *L) {
BasicBlock *ExitBlock = L->getExitBlock();
if (!ExitBlock) return;
- Instruction *NonPHI = ExitBlock->getFirstNonPHI();
+ Instruction *InsertPt = ExitBlock->getFirstNonPHI();
BasicBlock *Preheader = L->getLoopPreheader();
BasicBlock::iterator I = Preheader->getTerminator();
while (I != Preheader->begin()) {
--I;
- // New instructions were inserted at the end of the preheader. Only
- // consider those new instructions.
- if (!Rewriter.isInsertedInstruction(I))
+ // New instructions were inserted at the end of the preheader.
+ if (isa<PHINode>(I))
break;
+ if (I->isTrapping())
+ continue;
// Determine if there is a use in or before the loop (direct or
// otherwise).
bool UsedInLoop = false;
@@ -582,75 +573,13 @@ void IndVarSimplify::SinkUnusedInvariants(Loop *L, SCEVExpander &Rewriter) {
--I;
else
Done = true;
- ToMove->moveBefore(NonPHI);
+ ToMove->moveBefore(InsertPt);
if (Done)
break;
+ InsertPt = ToMove;
}
}
-/// Re-schedule the inserted instructions to put defs before uses. This
-/// fixes problems that arrise when SCEV expressions contain loop-variant
-/// values unrelated to the induction variable which are defined inside the
-/// loop. FIXME: It would be better to insert instructions in the right
-/// place so that this step isn't needed.
-void IndVarSimplify::FixUsesBeforeDefs(Loop *L, SCEVExpander &Rewriter) {
- // Visit all the blocks in the loop in pre-order dom-tree dfs order.
- DominatorTree *DT = &getAnalysis<DominatorTree>();
- std::map<Instruction *, unsigned> NumPredsLeft;
- SmallVector<DomTreeNode *, 16> Worklist;
- Worklist.push_back(DT->getNode(L->getHeader()));
- do {
- DomTreeNode *Node = Worklist.pop_back_val();
- for (DomTreeNode::iterator I = Node->begin(), E = Node->end(); I != E; ++I)
- if (L->contains((*I)->getBlock()))
- Worklist.push_back(*I);
- BasicBlock *BB = Node->getBlock();
- // Visit all the instructions in the block top down.
- for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
- // Count the number of operands that aren't properly dominating.
- unsigned NumPreds = 0;
- if (Rewriter.isInsertedInstruction(I) && !isa<PHINode>(I))
- for (User::op_iterator OI = I->op_begin(), OE = I->op_end();
- OI != OE; ++OI)
- if (Instruction *Inst = dyn_cast<Instruction>(OI))
- if (L->contains(Inst->getParent()) && !NumPredsLeft.count(Inst))
- ++NumPreds;
- NumPredsLeft[I] = NumPreds;
- // Notify uses of the position of this instruction, and move the
- // users (and their dependents, recursively) into place after this
- // instruction if it is their last outstanding operand.
- for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
- UI != UE; ++UI) {
- Instruction *Inst = cast<Instruction>(UI);
- std::map<Instruction *, unsigned>::iterator Z = NumPredsLeft.find(Inst);
- if (Z != NumPredsLeft.end() && Z->second != 0 && --Z->second == 0) {
- SmallVector<Instruction *, 4> UseWorkList;
- UseWorkList.push_back(Inst);
- BasicBlock::iterator InsertPt = I;
- if (InvokeInst *II = dyn_cast<InvokeInst>(InsertPt))
- InsertPt = II->getNormalDest()->begin();
- else
- ++InsertPt;
- while (isa<PHINode>(InsertPt)) ++InsertPt;
- do {
- Instruction *Use = UseWorkList.pop_back_val();
- Use->moveBefore(InsertPt);
- NumPredsLeft.erase(Use);
- for (Value::use_iterator IUI = Use->use_begin(),
- IUE = Use->use_end(); IUI != IUE; ++IUI) {
- Instruction *IUIInst = cast<Instruction>(IUI);
- if (L->contains(IUIInst->getParent()) &&
- Rewriter.isInsertedInstruction(IUIInst) &&
- !isa<PHINode>(IUIInst))
- UseWorkList.push_back(IUIInst);
- }
- } while (!UseWorkList.empty());
- }
- }
- }
- } while (!Worklist.empty());
-}
-
/// Return true if it is OK to use SIToFPInst for an inducation variable
/// with given inital and exit values.
static bool useSIToFPInst(ConstantFP &InitV, ConstantFP &ExitV,
diff --git a/lib/Transforms/Scalar/LoopRotation.cpp b/lib/Transforms/Scalar/LoopRotation.cpp
index a088230..7a24b35 100644
--- a/lib/Transforms/Scalar/LoopRotation.cpp
+++ b/lib/Transforms/Scalar/LoopRotation.cpp
@@ -108,7 +108,7 @@ static RegisterPass<LoopRotate> X("loop-rotate", "Rotate Loops");
Pass *llvm::createLoopRotatePass() { return new LoopRotate(); }
/// Rotate Loop L as many times as possible. Return true if
-/// loop is rotated at least once.
+/// the loop is rotated at least once.
bool LoopRotate::runOnLoop(Loop *Lp, LPPassManager &LPM) {
bool RotatedOneLoop = false;
@@ -132,15 +132,15 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
OrigPreHeader = L->getLoopPreheader();
OrigLatch = L->getLoopLatch();
- // If loop has only one block then there is not much to rotate.
+ // If the loop has only one block then there is not much to rotate.
if (L->getBlocks().size() == 1)
return false;
assert(OrigHeader && OrigLatch && OrigPreHeader &&
"Loop is not in canonical form");
- // If loop header is not one of the loop exit block then
- // either this loop is already rotated or it is not
+ // If the loop header is not one of the loop exiting blocks then
+ // either this loop is already rotated or it is not
// suitable for loop rotation transformations.
if (!L->isLoopExit(OrigHeader))
return false;
@@ -189,19 +189,19 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
assert(L->contains(NewHeader) && !L->contains(Exit) &&
"Unable to determine loop header and exit blocks");
- // This code assumes that new header has exactly one predecessor. Remove any
- // single entry PHI nodes in it.
+ // This code assumes that the new header has exactly one predecessor.
+ // Remove any single-entry PHI nodes in it.
assert(NewHeader->getSinglePredecessor() &&
"New header doesn't have one pred!");
FoldSingleEntryPHINodes(NewHeader);
- // Copy PHI nodes and other instructions from original header
- // into original pre-header. Unlike original header, original pre-header is
- // not a member of loop.
+ // Copy PHI nodes and other instructions from the original header
+ // into the original pre-header. Unlike the original header, the original
+ // pre-header is not a member of the loop.
//
- // New loop header is one and only successor of original header that
+ // The new loop header is the one and only successor of original header that
// is inside the loop. All other original header successors are outside
- // the loop. Copy PHI Nodes from original header into new loop header.
+ // the loop. Copy PHI Nodes from the original header into the new loop header.
// Add second incoming value, from original loop pre-header into these phi
// nodes. If a value defined in original header is used outside original
// header then new loop header will need new phi nodes with two incoming
@@ -218,8 +218,8 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// are directly propagated.
Value *NPV = PN->getIncomingValueForBlock(OrigPreHeader);
- // Create new PHI node with two incoming values for NewHeader.
- // One incoming value is from OrigLatch (through OrigHeader) and
+ // Create a new PHI node with two incoming values for NewHeader.
+ // One incoming value is from OrigLatch (through OrigHeader) and the
// second incoming value is from original pre-header.
PHINode *NH = PHINode::Create(PN->getType(), PN->getName(),
NewHeader->begin());
@@ -334,8 +334,8 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// Add second incoming argument from new Pre header.
UPhi->addIncoming(ILoopHeaderInfo.PreHeader, OrigPreHeader);
} else {
- // Used outside Exit block. Create a new PHI node from exit block
- // to receive value from ne new header ane pre header.
+ // Used outside Exit block. Create a new PHI node in the exit block
+ // to receive the value from the new header and pre-header.
PHINode *PN = PHINode::Create(U->getType(), U->getName(),
Exit->begin());
PN->addIncoming(ILoopHeaderInfo.PreHeader, OrigPreHeader);
@@ -367,16 +367,13 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
}
/// Make sure all Exit block PHINodes have required incoming values.
-/// If incoming value is constant or defined outside the loop then
-/// PHINode may not have an entry for original pre-header.
+/// If an incoming value is constant or defined outside the loop then
+/// PHINode may not have an entry for the original pre-header.
void LoopRotate::updateExitBlock() {
- for (BasicBlock::iterator I = Exit->begin(), E = Exit->end();
- I != E; ++I) {
-
- PHINode *PN = dyn_cast<PHINode>(I);
- if (!PN)
- break;
+ PHINode *PN;
+ for (BasicBlock::iterator I = Exit->begin();
+ (PN = dyn_cast<PHINode>(I)); ++I) {
// There is already one incoming value from original pre-header block.
if (PN->getBasicBlockIndex(OrigPreHeader) != -1)
@@ -384,7 +381,7 @@ void LoopRotate::updateExitBlock() {
const RenameData *ILoopHeaderInfo;
Value *V = PN->getIncomingValueForBlock(OrigHeader);
- if (isa<Instruction>(V) &&
+ if (isa<Instruction>(V) &&
(ILoopHeaderInfo = findReplacementData(cast<Instruction>(V)))) {
assert(ILoopHeaderInfo->PreHeader && "Missing New Preheader Instruction");
PN->addIncoming(ILoopHeaderInfo->PreHeader, OrigPreHeader);
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index ba60058..a877c4e 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -409,16 +409,8 @@ Value *BasedUser::InsertCodeForBaseAtPosition(const SCEV* const &NewBase,
const SCEV* NewValSCEV = SE->getUnknown(Base);
- // If there is no immediate value, skip the next part.
- if (!Imm->isZero()) {
- // If we are inserting the base and imm values in the same block, make sure
- // to adjust the IP position if insertion reused a result.
- if (IP == BaseInsertPt)
- IP = Rewriter.getInsertionPoint();
-
- // Always emit the immediate (if non-zero) into the same block as the user.
- NewValSCEV = SE->getAddExpr(NewValSCEV, Imm);
- }
+ // Always emit the immediate into the same block as the user.
+ NewValSCEV = SE->getAddExpr(NewValSCEV, Imm);
return Rewriter.expandCodeFor(NewValSCEV, Ty, IP);
}
@@ -1642,7 +1634,8 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEV* const &Stride,
// the preheader, instead of being forward substituted into the uses. We
// do this by forcing a BitCast (noop cast) to be inserted into the
// preheader in this case.
- if (!fitsInAddressMode(Base, getAccessType(Inst), TLI, false)) {
+ if (!fitsInAddressMode(Base, getAccessType(Inst), TLI, false) &&
+ !isa<Instruction>(BaseV)) {
// We want this constant emitted into the preheader! This is just
// using cast as a copy so BitCast (no-op cast) is appropriate
BaseV = new BitCastInst(BaseV, BaseV->getType(), "preheaderinsert",
diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp
index b9b5688..a3cb751 100644
--- a/lib/Transforms/Scalar/PredicateSimplifier.cpp
+++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp
@@ -110,6 +110,8 @@ STATISTIC(NumSimple , "Number of simple replacements");
STATISTIC(NumBlocks , "Number of blocks marked unreachable");
STATISTIC(NumSnuggle , "Number of comparisons snuggled");
+static const ConstantRange empty(1, false);
+
namespace {
class DomTreeDFS {
public:
@@ -939,7 +941,6 @@ namespace {
const_iterator end() const { return RangeList.end(); }
iterator find(DomTreeDFS::Node *Subtree) {
- static ConstantRange empty(1, false);
iterator E = end();
iterator I = std::lower_bound(begin(), E,
std::make_pair(Subtree, empty), swo);
@@ -949,7 +950,6 @@ namespace {
}
const_iterator find(DomTreeDFS::Node *Subtree) const {
- static const ConstantRange empty(1, false);
const_iterator E = end();
const_iterator I = std::lower_bound(begin(), E,
std::make_pair(Subtree, empty), swo);
@@ -962,7 +962,6 @@ namespace {
assert(!CR.isEmptySet() && "Empty ConstantRange.");
assert(!CR.isSingleElement() && "Refusing to store single element.");
- static ConstantRange empty(1, false);
iterator E = end();
iterator I =
std::lower_bound(begin(), E, std::make_pair(Subtree, empty), swo);
diff --git a/lib/Transforms/Utils/CMakeLists.txt b/lib/Transforms/Utils/CMakeLists.txt
index 6628b4b..d68bf02 100644
--- a/lib/Transforms/Utils/CMakeLists.txt
+++ b/lib/Transforms/Utils/CMakeLists.txt
@@ -25,3 +25,5 @@ add_llvm_library(LLVMTransformUtils
ValueMapper.cpp
InstructionNamer.cpp
)
+
+target_link_libraries (LLVMTransformUtils LLVMSupport)
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp
index 7d4f3a3..d5e7303 100644
--- a/lib/Transforms/Utils/LCSSA.cpp
+++ b/lib/Transforms/Utils/LCSSA.cpp
@@ -149,7 +149,16 @@ void LCSSA::ProcessInstruction(Instruction *Instr,
// Keep track of the blocks that have the value available already.
DenseMap<DomTreeNode*, Value*> Phis;
- DomTreeNode *InstrNode = DT->getNode(Instr->getParent());
+ BasicBlock *DomBB = Instr->getParent();
+
+ // Invoke instructions are special in that their result value is not available
+ // along their unwind edge. The code below tests to see whether DomBB dominates
+ // the value, so adjust DomBB to the normal destination block, which is
+ // effectively where the value is first usable.
+ if (InvokeInst *Inv = dyn_cast<InvokeInst>(Instr))
+ DomBB = Inv->getNormalDest();
+
+ DomTreeNode *DomNode = DT->getNode(DomBB);
// Insert the LCSSA phi's into the exit blocks (dominated by the value), and
// add them to the Phi's map.
@@ -158,7 +167,7 @@ void LCSSA::ProcessInstruction(Instruction *Instr,
BasicBlock *BB = *BBI;
DomTreeNode *ExitBBNode = DT->getNode(BB);
Value *&Phi = Phis[ExitBBNode];
- if (!Phi && DT->dominates(InstrNode, ExitBBNode)) {
+ if (!Phi && DT->dominates(DomNode, ExitBBNode)) {
PHINode *PN = PHINode::Create(Instr->getType(), Instr->getName()+".lcssa",
BB->begin());
PN->reserveOperandSpace(PredCache.GetNumPreds(BB));
diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp
index c7fff54..8c08638 100644
--- a/lib/Transforms/Utils/Local.cpp
+++ b/lib/Transforms/Utils/Local.cpp
@@ -340,44 +340,3 @@ bool llvm::OnlyUsedByDbgInfoIntrinsics(Instruction *I,
return true;
}
-/// UserIsDebugInfo - Return true if U is a constant expr used by
-/// llvm.dbg.variable or llvm.dbg.global_variable
-bool llvm::UserIsDebugInfo(User *U) {
- ConstantExpr *CE = dyn_cast<ConstantExpr>(U);
-
- if (!CE || CE->getNumUses() != 1)
- return false;
-
- Constant *Init = dyn_cast<Constant>(CE->use_back());
- if (!Init || Init->getNumUses() != 1)
- return false;
-
- GlobalVariable *GV = dyn_cast<GlobalVariable>(Init->use_back());
- if (!GV || !GV->hasInitializer() || GV->getInitializer() != Init)
- return false;
-
- DIVariable DV(GV);
- if (!DV.isNull())
- return true; // User is llvm.dbg.variable
-
- DIGlobalVariable DGV(GV);
- if (!DGV.isNull())
- return true; // User is llvm.dbg.global_variable
-
- return false;
-}
-
-/// RemoveDbgInfoUser - Remove an User which is representing debug info.
-void llvm::RemoveDbgInfoUser(User *U) {
- assert (UserIsDebugInfo(U) && "Unexpected User!");
- ConstantExpr *CE = cast<ConstantExpr>(U);
- while (!CE->use_empty()) {
- Constant *C = cast<Constant>(CE->use_back());
- while (!C->use_empty()) {
- GlobalVariable *GV = cast<GlobalVariable>(C->use_back());
- GV->eraseFromParent();
- }
- C->destroyConstant();
- }
- CE->destroyConstant();
-}
OpenPOWER on IntegriCloud