summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Fertile <sfertile@ca.ibm.com>2017-12-15 19:29:12 +0000
committerSean Fertile <sfertile@ca.ibm.com>2017-12-15 19:29:12 +0000
commit42b13343fd503d50d47996b80c53f921463cc875 (patch)
tree2cd16b0cf9ed3bebe1e5648237768fc6a81aff2f
parent574d7ce95412c95242a936bcfd54f414449ae365 (diff)
downloadbcm5719-llvm-42b13343fd503d50d47996b80c53f921463cc875.tar.gz
bcm5719-llvm-42b13343fd503d50d47996b80c53f921463cc875.zip
[Memcpy Loop Lowering] Insert loop BB inbetween the split BB.
The original memcpy expansion inserted the loop basic block inbetween the 2 new basic blocks created by splitting the original block the memcpy call was in. This commit makes the new memcpy expansion do the same to keep the layout of the IR matching between the old and new implementations. Differential Review: https://reviews.llvm.org/D41197 llvm-svn: 320848
-rw-r--r--llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp5
-rw-r--r--llvm/test/CodeGen/NVPTX/lower-aggr-copies.ll6
2 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp b/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp
index 900450b4006..33b8f62ea89 100644
--- a/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp
+++ b/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp
@@ -174,7 +174,7 @@ void llvm::createMemCpyLoopUnknownSize(Instruction *InsertBefore,
Value *RuntimeBytesCopied = PLBuilder.CreateSub(CopyLen, RuntimeResidual);
BasicBlock *LoopBB =
- BasicBlock::Create(Ctx, "loop-memcpy-expansion", ParentFunc, nullptr);
+ BasicBlock::Create(Ctx, "loop-memcpy-expansion", ParentFunc, PostLoopBB);
IRBuilder<> LoopBuilder(LoopBB);
PHINode *LoopIndex = LoopBuilder.CreatePHI(CopyLenType, 2, "loop-index");
@@ -193,7 +193,8 @@ void llvm::createMemCpyLoopUnknownSize(Instruction *InsertBefore,
if (LoopOpType != Int8Type) {
// Loop body for the residual copy.
BasicBlock *ResLoopBB = BasicBlock::Create(Ctx, "loop-memcpy-residual",
- PreLoopBB->getParent(), nullptr);
+ PreLoopBB->getParent(),
+ PostLoopBB);
// Residual loop header.
BasicBlock *ResHeaderBB = BasicBlock::Create(
Ctx, "loop-memcpy-residual-header", PreLoopBB->getParent(), nullptr);
diff --git a/llvm/test/CodeGen/NVPTX/lower-aggr-copies.ll b/llvm/test/CodeGen/NVPTX/lower-aggr-copies.ll
index 4298442157e..34654910613 100644
--- a/llvm/test/CodeGen/NVPTX/lower-aggr-copies.ll
+++ b/llvm/test/CodeGen/NVPTX/lower-aggr-copies.ll
@@ -50,6 +50,9 @@ entry:
; WIR: [[IndexInc]] = add i64 %loop-index, 1
; WIR: [[Cond2:%[0-9]+]] = icmp ult i64 [[IndexInc]], [[LoopCount]]
; WIR: br i1 [[Cond2]], label %loop-memcpy-expansion, label %post-loop-memcpy-expansion
+
+; WIR-LABEL: post-loop-memcpy-expansion:
+; WIR: ret i8* %dst
}
define i8* @memcpy_volatile_caller(i8* %dst, i8* %src, i64 %n) #0 {
@@ -85,6 +88,9 @@ entry:
; WIR: [[IndexInc]] = add i64 %loop-index, 1
; WIR: [[Cond2:%[0-9]+]] = icmp ult i64 [[IndexInc]], [[LoopCount]]
; WIR: br i1 [[Cond2]], label %loop-memcpy-expansion, label %post-loop-memcpy-expansion
+
+; WIR-LABEL: post-loop-memcpy-expansion:
+; WIR: ret i8* %dst
}
define i8* @memcpy_casting_caller(i32* %dst, i32* %src, i64 %n) #0 {
OpenPOWER on IntegriCloud