mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-05 14:34:55 +00:00
Move SplitBlockAndInsertIfThen to BasicBlockUtils.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166278 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
17f68c52d2
commit
4a2dec05ce
@ -25,9 +25,11 @@ namespace llvm {
|
|||||||
|
|
||||||
class AliasAnalysis;
|
class AliasAnalysis;
|
||||||
class Instruction;
|
class Instruction;
|
||||||
|
class MDNode;
|
||||||
class Pass;
|
class Pass;
|
||||||
class ReturnInst;
|
class ReturnInst;
|
||||||
class TargetLibraryInfo;
|
class TargetLibraryInfo;
|
||||||
|
class TerminatorInst;
|
||||||
|
|
||||||
/// DeleteDeadBlock - Delete the specified block, which must have no
|
/// DeleteDeadBlock - Delete the specified block, which must have no
|
||||||
/// predecessors.
|
/// predecessors.
|
||||||
@ -203,6 +205,29 @@ void SplitLandingPadPredecessors(BasicBlock *OrigBB,ArrayRef<BasicBlock*> Preds,
|
|||||||
ReturnInst *FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
|
ReturnInst *FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
|
||||||
BasicBlock *Pred);
|
BasicBlock *Pred);
|
||||||
|
|
||||||
|
/// SplitBlockAndInsertIfThen - Split the containing block at the
|
||||||
|
/// specified instruction - everything before and including Cmp stays
|
||||||
|
/// in the old basic block, and everything after Cmp is moved to a
|
||||||
|
/// new block. The two blocks are connected by a conditional branch
|
||||||
|
/// (with value of Cmp being the condition).
|
||||||
|
/// Before:
|
||||||
|
/// Head
|
||||||
|
/// Cmp
|
||||||
|
/// Tail
|
||||||
|
/// After:
|
||||||
|
/// Head
|
||||||
|
/// Cmp
|
||||||
|
/// if (Cmp)
|
||||||
|
/// ThenBlock
|
||||||
|
/// Tail
|
||||||
|
///
|
||||||
|
/// If Unreachable is true, then ThenBlock ends with
|
||||||
|
/// UnreachableInst, otherwise it branches to Tail.
|
||||||
|
/// Returns the NewBasicBlock's terminator.
|
||||||
|
|
||||||
|
TerminatorInst *SplitBlockAndInsertIfThen(Instruction *Cmp,
|
||||||
|
bool Unreachable, MDNode *BranchWeights = 0);
|
||||||
|
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -245,38 +245,6 @@ static GlobalVariable *createPrivateGlobalForString(Module &M, StringRef Str) {
|
|||||||
GlobalValue::PrivateLinkage, StrConst, "");
|
GlobalValue::PrivateLinkage, StrConst, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split the basic block and insert an if-then code.
|
|
||||||
// Before:
|
|
||||||
// Head
|
|
||||||
// Cmp
|
|
||||||
// Tail
|
|
||||||
// After:
|
|
||||||
// Head
|
|
||||||
// if (Cmp)
|
|
||||||
// ThenBlock
|
|
||||||
// Tail
|
|
||||||
//
|
|
||||||
// ThenBlock block is created and its terminator is returned.
|
|
||||||
// If Unreachable, ThenBlock is terminated with UnreachableInst, otherwise
|
|
||||||
// it is terminated with BranchInst to Tail.
|
|
||||||
static TerminatorInst *splitBlockAndInsertIfThen(Value *Cmp, bool Unreachable) {
|
|
||||||
Instruction *SplitBefore = cast<Instruction>(Cmp)->getNextNode();
|
|
||||||
BasicBlock *Head = SplitBefore->getParent();
|
|
||||||
BasicBlock *Tail = Head->splitBasicBlock(SplitBefore);
|
|
||||||
TerminatorInst *HeadOldTerm = Head->getTerminator();
|
|
||||||
LLVMContext &C = Head->getParent()->getParent()->getContext();
|
|
||||||
BasicBlock *ThenBlock = BasicBlock::Create(C, "", Head->getParent(), Tail);
|
|
||||||
TerminatorInst *CheckTerm;
|
|
||||||
if (Unreachable)
|
|
||||||
CheckTerm = new UnreachableInst(C, ThenBlock);
|
|
||||||
else
|
|
||||||
CheckTerm = BranchInst::Create(Tail, ThenBlock);
|
|
||||||
BranchInst *HeadNewTerm =
|
|
||||||
BranchInst::Create(/*ifTrue*/ThenBlock, /*ifFalse*/Tail, Cmp);
|
|
||||||
ReplaceInstWithInst(HeadOldTerm, HeadNewTerm);
|
|
||||||
return CheckTerm;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) {
|
Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) {
|
||||||
// Shadow >> scale
|
// Shadow >> scale
|
||||||
Shadow = IRB.CreateLShr(Shadow, MappingScale);
|
Shadow = IRB.CreateLShr(Shadow, MappingScale);
|
||||||
@ -324,7 +292,7 @@ bool AddressSanitizer::instrumentMemIntrinsic(MemIntrinsic *MI) {
|
|||||||
|
|
||||||
Value *Cmp = IRB.CreateICmpNE(Length,
|
Value *Cmp = IRB.CreateICmpNE(Length,
|
||||||
Constant::getNullValue(Length->getType()));
|
Constant::getNullValue(Length->getType()));
|
||||||
InsertBefore = splitBlockAndInsertIfThen(Cmp, false);
|
InsertBefore = SplitBlockAndInsertIfThen(cast<Instruction>(Cmp), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
instrumentMemIntrinsicParam(MI, Dst, Length, InsertBefore, true);
|
instrumentMemIntrinsicParam(MI, Dst, Length, InsertBefore, true);
|
||||||
@ -480,7 +448,8 @@ void AddressSanitizer::instrumentAddress(Instruction *OrigIns,
|
|||||||
TerminatorInst *CrashTerm = 0;
|
TerminatorInst *CrashTerm = 0;
|
||||||
|
|
||||||
if (ClAlwaysSlowPath || (TypeSize < 8 * Granularity)) {
|
if (ClAlwaysSlowPath || (TypeSize < 8 * Granularity)) {
|
||||||
TerminatorInst *CheckTerm = splitBlockAndInsertIfThen(Cmp, false);
|
TerminatorInst *CheckTerm =
|
||||||
|
SplitBlockAndInsertIfThen(cast<Instruction>(Cmp), false);
|
||||||
assert(dyn_cast<BranchInst>(CheckTerm)->isUnconditional());
|
assert(dyn_cast<BranchInst>(CheckTerm)->isUnconditional());
|
||||||
BasicBlock *NextBB = CheckTerm->getSuccessor(0);
|
BasicBlock *NextBB = CheckTerm->getSuccessor(0);
|
||||||
IRB.SetInsertPoint(CheckTerm);
|
IRB.SetInsertPoint(CheckTerm);
|
||||||
@ -491,7 +460,7 @@ void AddressSanitizer::instrumentAddress(Instruction *OrigIns,
|
|||||||
BranchInst *NewTerm = BranchInst::Create(CrashBlock, NextBB, Cmp2);
|
BranchInst *NewTerm = BranchInst::Create(CrashBlock, NextBB, Cmp2);
|
||||||
ReplaceInstWithInst(CheckTerm, NewTerm);
|
ReplaceInstWithInst(CheckTerm, NewTerm);
|
||||||
} else {
|
} else {
|
||||||
CrashTerm = splitBlockAndInsertIfThen(Cmp, true);
|
CrashTerm = SplitBlockAndInsertIfThen(cast<Instruction>(Cmp), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Instruction *Crash =
|
Instruction *Crash =
|
||||||
|
@ -687,3 +687,42 @@ ReturnInst *llvm::FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
|
|||||||
return cast<ReturnInst>(NewRet);
|
return cast<ReturnInst>(NewRet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// SplitBlockAndInsertIfThen - Split the containing block at the
|
||||||
|
/// specified instruction - everything before and including Cmp stays
|
||||||
|
/// in the old basic block, and everything after Cmp is moved to a
|
||||||
|
/// new block. The two blocks are connected by a conditional branch
|
||||||
|
/// (with value of Cmp being the condition).
|
||||||
|
/// Before:
|
||||||
|
/// Head
|
||||||
|
/// Cmp
|
||||||
|
/// Tail
|
||||||
|
/// After:
|
||||||
|
/// Head
|
||||||
|
/// Cmp
|
||||||
|
/// if (Cmp)
|
||||||
|
/// ThenBlock
|
||||||
|
/// Tail
|
||||||
|
///
|
||||||
|
/// If Unreachable is true, then ThenBlock ends with
|
||||||
|
/// UnreachableInst, otherwise it branches to Tail.
|
||||||
|
/// Returns the NewBasicBlock's terminator.
|
||||||
|
|
||||||
|
TerminatorInst *llvm::SplitBlockAndInsertIfThen(Instruction *Cmp,
|
||||||
|
bool Unreachable, MDNode *BranchWeights) {
|
||||||
|
Instruction *SplitBefore = Cmp->getNextNode();
|
||||||
|
BasicBlock *Head = SplitBefore->getParent();
|
||||||
|
BasicBlock *Tail = Head->splitBasicBlock(SplitBefore);
|
||||||
|
TerminatorInst *HeadOldTerm = Head->getTerminator();
|
||||||
|
LLVMContext &C = Head->getContext();
|
||||||
|
BasicBlock *ThenBlock = BasicBlock::Create(C, "", Head->getParent(), Tail);
|
||||||
|
TerminatorInst *CheckTerm;
|
||||||
|
if (Unreachable)
|
||||||
|
CheckTerm = new UnreachableInst(C, ThenBlock);
|
||||||
|
else
|
||||||
|
CheckTerm = BranchInst::Create(Tail, ThenBlock);
|
||||||
|
BranchInst *HeadNewTerm =
|
||||||
|
BranchInst::Create(/*ifTrue*/ThenBlock, /*ifFalse*/Tail, Cmp);
|
||||||
|
HeadNewTerm->setMetadata(LLVMContext::MD_prof, BranchWeights);
|
||||||
|
ReplaceInstWithInst(HeadOldTerm, HeadNewTerm);
|
||||||
|
return CheckTerm;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user