mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[LoopDist] Move loop-versioning helper functions to Cloning, NFC
Summary: This makes them available to the LoopVersioning class as that is moved to its own module in the next patch. Reviewers: ashutosh.nema, hfinkel Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10576 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241931 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/IR/CFG.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
@@ -720,3 +721,68 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
ModuleLevelChanges, Returns, NameSuffix, CodeInfo,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
/// \brief Remaps instructions in \p Blocks using the mapping in \p VMap.
|
||||
void llvm::remapInstructionsInBlocks(
|
||||
const SmallVectorImpl<BasicBlock *> &Blocks, ValueToValueMapTy &VMap) {
|
||||
// Rewrite the code to refer to itself.
|
||||
for (auto *BB : Blocks)
|
||||
for (auto &Inst : *BB)
|
||||
RemapInstruction(&Inst, VMap,
|
||||
RF_NoModuleLevelChanges | RF_IgnoreMissingEntries);
|
||||
}
|
||||
|
||||
/// \brief Clones a loop \p OrigLoop. Returns the loop and the blocks in \p
|
||||
/// Blocks.
|
||||
///
|
||||
/// Updates LoopInfo and DominatorTree assuming the loop is dominated by block
|
||||
/// \p LoopDomBB. Insert the new blocks before block specified in \p Before.
|
||||
Loop *llvm::cloneLoopWithPreheader(BasicBlock *Before, BasicBlock *LoopDomBB,
|
||||
Loop *OrigLoop, ValueToValueMapTy &VMap,
|
||||
const Twine &NameSuffix, LoopInfo *LI,
|
||||
DominatorTree *DT,
|
||||
SmallVectorImpl<BasicBlock *> &Blocks) {
|
||||
Function *F = OrigLoop->getHeader()->getParent();
|
||||
Loop *ParentLoop = OrigLoop->getParentLoop();
|
||||
|
||||
Loop *NewLoop = new Loop();
|
||||
if (ParentLoop)
|
||||
ParentLoop->addChildLoop(NewLoop);
|
||||
else
|
||||
LI->addTopLevelLoop(NewLoop);
|
||||
|
||||
BasicBlock *OrigPH = OrigLoop->getLoopPreheader();
|
||||
assert(OrigPH && "No preheader");
|
||||
BasicBlock *NewPH = CloneBasicBlock(OrigPH, VMap, NameSuffix, F);
|
||||
// To rename the loop PHIs.
|
||||
VMap[OrigPH] = NewPH;
|
||||
Blocks.push_back(NewPH);
|
||||
|
||||
// Update LoopInfo.
|
||||
if (ParentLoop)
|
||||
ParentLoop->addBasicBlockToLoop(NewPH, *LI);
|
||||
|
||||
// Update DominatorTree.
|
||||
DT->addNewBlock(NewPH, LoopDomBB);
|
||||
|
||||
for (BasicBlock *BB : OrigLoop->getBlocks()) {
|
||||
BasicBlock *NewBB = CloneBasicBlock(BB, VMap, NameSuffix, F);
|
||||
VMap[BB] = NewBB;
|
||||
|
||||
// Update LoopInfo.
|
||||
NewLoop->addBasicBlockToLoop(NewBB, *LI);
|
||||
|
||||
// Update DominatorTree.
|
||||
BasicBlock *IDomBB = DT->getNode(BB)->getIDom()->getBlock();
|
||||
DT->addNewBlock(NewBB, cast<BasicBlock>(VMap[IDomBB]));
|
||||
|
||||
Blocks.push_back(NewBB);
|
||||
}
|
||||
|
||||
// Move them physically from the end of the block list.
|
||||
F->getBasicBlockList().splice(Before, F->getBasicBlockList(), NewPH);
|
||||
F->getBasicBlockList().splice(Before, F->getBasicBlockList(),
|
||||
NewLoop->getHeader(), F->end());
|
||||
|
||||
return NewLoop;
|
||||
}
|
||||
|
Reference in New Issue
Block a user