diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-01 13:22:02 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-01 13:22:02 +0000 | 
| commit | 9df3605dea17e84f8183581f6103bd0c79e2a606 (patch) | |
| tree | 70a2f36ce9eb9bb213603cd7f2f120af53fc176f /lib/Transforms/Utils/LowerMemIntrinsics.cpp | |
| parent | 08bbd35a80bf7765fe0d3043f9eb5a2f2786b649 (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils/LowerMemIntrinsics.cpp')
| -rw-r--r-- | lib/Transforms/Utils/LowerMemIntrinsics.cpp | 19 | 
1 files changed, 14 insertions, 5 deletions
| diff --git a/lib/Transforms/Utils/LowerMemIntrinsics.cpp b/lib/Transforms/Utils/LowerMemIntrinsics.cpp index 0a51f9a0e4a26..1c2a60a6b8b24 100644 --- a/lib/Transforms/Utils/LowerMemIntrinsics.cpp +++ b/lib/Transforms/Utils/LowerMemIntrinsics.cpp @@ -27,7 +27,6 @@ void llvm::createMemCpyLoop(Instruction *InsertBefore,    BasicBlock *LoopBB = BasicBlock::Create(F->getContext(), "loadstoreloop",                                            F, NewBB); -  OrigBB->getTerminator()->setSuccessor(0, LoopBB);    IRBuilder<> Builder(OrigBB->getTerminator());    // SrcAddr and DstAddr are expected to be pointer types, @@ -39,6 +38,11 @@ void llvm::createMemCpyLoop(Instruction *InsertBefore,    SrcAddr = Builder.CreateBitCast(SrcAddr, Builder.getInt8PtrTy(SrcAS));    DstAddr = Builder.CreateBitCast(DstAddr, Builder.getInt8PtrTy(DstAS)); +  Builder.CreateCondBr( +      Builder.CreateICmpEQ(ConstantInt::get(TypeOfCopyLen, 0), CopyLen), NewBB, +      LoopBB); +  OrigBB->getTerminator()->eraseFromParent(); +    IRBuilder<> LoopBuilder(LoopBB);    PHINode *LoopIndex = LoopBuilder.CreatePHI(TypeOfCopyLen, 0);    LoopIndex->addIncoming(ConstantInt::get(TypeOfCopyLen, 0), OrigBB); @@ -167,6 +171,7 @@ static void createMemMoveLoop(Instruction *InsertBefore,  static void createMemSetLoop(Instruction *InsertBefore,                               Value *DstAddr, Value *CopyLen, Value *SetValue,                               unsigned Align, bool IsVolatile) { +  Type *TypeOfCopyLen = CopyLen->getType();    BasicBlock *OrigBB = InsertBefore->getParent();    Function *F = OrigBB->getParent();    BasicBlock *NewBB = @@ -174,7 +179,6 @@ static void createMemSetLoop(Instruction *InsertBefore,    BasicBlock *LoopBB      = BasicBlock::Create(F->getContext(), "loadstoreloop", F, NewBB); -  OrigBB->getTerminator()->setSuccessor(0, LoopBB);    IRBuilder<> Builder(OrigBB->getTerminator());    // Cast pointer to the type of value getting stored @@ -182,9 +186,14 @@ static void createMemSetLoop(Instruction *InsertBefore,    DstAddr = Builder.CreateBitCast(DstAddr,                                    PointerType::get(SetValue->getType(), dstAS)); +  Builder.CreateCondBr( +      Builder.CreateICmpEQ(ConstantInt::get(TypeOfCopyLen, 0), CopyLen), NewBB, +      LoopBB); +  OrigBB->getTerminator()->eraseFromParent(); +    IRBuilder<> LoopBuilder(LoopBB); -  PHINode *LoopIndex = LoopBuilder.CreatePHI(CopyLen->getType(), 0); -  LoopIndex->addIncoming(ConstantInt::get(CopyLen->getType(), 0), OrigBB); +  PHINode *LoopIndex = LoopBuilder.CreatePHI(TypeOfCopyLen, 0); +  LoopIndex->addIncoming(ConstantInt::get(TypeOfCopyLen, 0), OrigBB);    LoopBuilder.CreateStore(        SetValue, @@ -192,7 +201,7 @@ static void createMemSetLoop(Instruction *InsertBefore,        IsVolatile);    Value *NewIndex = -      LoopBuilder.CreateAdd(LoopIndex, ConstantInt::get(CopyLen->getType(), 1)); +      LoopBuilder.CreateAdd(LoopIndex, ConstantInt::get(TypeOfCopyLen, 1));    LoopIndex->addIncoming(NewIndex, LoopBB);    LoopBuilder.CreateCondBr(LoopBuilder.CreateICmpULT(NewIndex, CopyLen), LoopBB, | 
