[PATCH] D135886: [MemCpyOpt] Move lifetime marker before call to enable call slot optimization
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 7 06:26:13 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG9a45e4beede2: [MemCpyOpt] Move lifetime marker before call to enable call slot optimization (authored by nikic).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135886/new/
https://reviews.llvm.org/D135886
Files:
llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
llvm/test/Transforms/MemCpyOpt/lifetime.ll
Index: llvm/test/Transforms/MemCpyOpt/lifetime.ll
===================================================================
--- llvm/test/Transforms/MemCpyOpt/lifetime.ll
+++ llvm/test/Transforms/MemCpyOpt/lifetime.ll
@@ -55,9 +55,8 @@
; CHECK-LABEL: @call_slot_move_lifetime_start(
; CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4
; CHECK-NEXT: [[DST:%.*]] = alloca i32, align 4
-; CHECK-NEXT: call void @call(ptr [[TMP]])
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[DST]])
-; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[DST]], ptr align 4 [[TMP]], i64 4, i1 false)
+; CHECK-NEXT: call void @call(ptr [[DST]])
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[DST]])
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[DST]], align 4
; CHECK-NEXT: ret i32 [[V]]
Index: llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -331,16 +331,27 @@
}
// Check for mod or ref of Loc between Start and End, excluding both boundaries.
-// Start and End must be in the same block
+// Start and End must be in the same block.
+// If SkippedLifetimeStart is provided, skip over one clobbering lifetime.start
+// intrinsic and store it inside SkippedLifetimeStart.
static bool accessedBetween(AliasAnalysis &AA, MemoryLocation Loc,
const MemoryUseOrDef *Start,
- const MemoryUseOrDef *End) {
+ const MemoryUseOrDef *End,
+ Instruction **SkippedLifetimeStart = nullptr) {
assert(Start->getBlock() == End->getBlock() && "Only local supported");
for (const MemoryAccess &MA :
make_range(++Start->getIterator(), End->getIterator())) {
- if (isModOrRefSet(AA.getModRefInfo(cast<MemoryUseOrDef>(MA).getMemoryInst(),
- Loc)))
+ Instruction *I = cast<MemoryUseOrDef>(MA).getMemoryInst();
+ if (isModOrRefSet(AA.getModRefInfo(I, Loc))) {
+ auto *II = dyn_cast<IntrinsicInst>(I);
+ if (II && II->getIntrinsicID() == Intrinsic::lifetime_start &&
+ SkippedLifetimeStart && !*SkippedLifetimeStart) {
+ *SkippedLifetimeStart = I;
+ continue;
+ }
+
return true;
+ }
}
return false;
}
@@ -913,8 +924,9 @@
// Check that nothing touches the dest of the copy between
// the call and the store/memcpy.
+ Instruction *SkippedLifetimeStart = nullptr;
if (accessedBetween(*AA, DestLoc, MSSA->getMemoryAccess(C),
- MSSA->getMemoryAccess(cpyStore))) {
+ MSSA->getMemoryAccess(cpyStore), &SkippedLifetimeStart)) {
LLVM_DEBUG(dbgs() << "Call Slot: Dest pointer modified after call\n");
return false;
}
@@ -1094,6 +1106,12 @@
cast<AllocaInst>(cpyDest)->setAlignment(srcAlign);
}
+ if (SkippedLifetimeStart) {
+ SkippedLifetimeStart->moveBefore(C);
+ MSSAU->moveBefore(MSSA->getMemoryAccess(SkippedLifetimeStart),
+ MSSA->getMemoryAccess(C));
+ }
+
// Update AA metadata
// FIXME: MD_tbaa_struct and MD_mem_parallel_loop_access should also be
// handled here, but combineMetadata doesn't support them yet
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135886.473647.patch
Type: text/x-patch
Size: 3333 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221107/75f211e3/attachment.bin>
More information about the llvm-commits
mailing list