[llvm] [MemCpyOpt] Use `dyn_cast` to fix assertion failure in `processMemCpyMemCpyDependence` (PR #98686)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 12 12:56:52 PDT 2024
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/98686
>From 709de67f188e0c4a3389144abaebd25e56cd196c Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 13 Jul 2024 03:33:07 +0800
Subject: [PATCH 1/2] [MemCpyOpt] Always create gep instructions in
`processMemCpyMemCpyDependence`
---
llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 5 +++--
.../MemCpyOpt/memcpy-memcpy-offset.ll | 18 ++++++++++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index 1c65219585e5a..c542084c1ad2f 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -1188,8 +1188,9 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
if (MDestOffset == MForwardOffset)
CopySource = M->getDest();
else {
- NewCopySource = cast<Instruction>(Builder.CreateInBoundsPtrAdd(
- CopySource, Builder.getInt64(MForwardOffset)));
+ NewCopySource = GetElementPtrInst::CreateInBounds(
+ Builder.getInt8Ty(), CopySource, Builder.getInt64(MForwardOffset), "",
+ Builder.GetInsertPoint());
CopySource = NewCopySource;
}
// We need to update `MCopyLoc` if an offset exists.
diff --git a/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll b/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll
index 6abb0da827990..455a06045ab8d 100644
--- a/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll
+++ b/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll
@@ -197,6 +197,24 @@ define void @do_not_forward_offset_and_store(ptr %src, ptr %dest) {
ret void
}
+; Make sure we don't crash when the copy source is a constant.
+ at buf = external global [32 x i8]
+
+define void @pr98675(ptr noalias %p1, ptr noalias %p2) {
+; CHECK-LABEL: define void @pr98675(
+; CHECK-SAME: ptr noalias [[P1:%.*]], ptr noalias [[P2:%.*]]) {
+; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P1]], ptr @buf, i64 26, i1 false)
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 10
+; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr @buf, i64 10
+; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P2]], ptr [[TMP1]], i64 1, i1 false)
+; CHECK-NEXT: ret void
+;
+ call void @llvm.memcpy.p0.p0.i64(ptr %p1, ptr @buf, i64 26, i1 false)
+ %gep = getelementptr i8, ptr %p1, i64 10
+ call void @llvm.memmove.p0.p0.i64(ptr %p2, ptr %gep, i64 1, i1 false)
+ ret void
+}
+
declare void @use(ptr)
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
>From b9a2d08a1a4c82c8d58bee712a114dffd7dd38f8 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 13 Jul 2024 03:55:17 +0800
Subject: [PATCH 2/2] [MemCpyOpt] Address review comments.
---
llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 7 +++----
llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll | 3 +--
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index c542084c1ad2f..4063762c88a2e 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -1188,10 +1188,9 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
if (MDestOffset == MForwardOffset)
CopySource = M->getDest();
else {
- NewCopySource = GetElementPtrInst::CreateInBounds(
- Builder.getInt8Ty(), CopySource, Builder.getInt64(MForwardOffset), "",
- Builder.GetInsertPoint());
- CopySource = NewCopySource;
+ CopySource = Builder.CreateInBoundsPtrAdd(
+ CopySource, Builder.getInt64(MForwardOffset));
+ NewCopySource = dyn_cast<Instruction>(CopySource);
}
// We need to update `MCopyLoc` if an offset exists.
MCopyLoc = MCopyLoc.getWithNewPtr(CopySource);
diff --git a/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll b/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll
index 455a06045ab8d..da654438d7bd6 100644
--- a/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll
+++ b/llvm/test/Transforms/MemCpyOpt/memcpy-memcpy-offset.ll
@@ -205,8 +205,7 @@ define void @pr98675(ptr noalias %p1, ptr noalias %p2) {
; CHECK-SAME: ptr noalias [[P1:%.*]], ptr noalias [[P2:%.*]]) {
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P1]], ptr @buf, i64 26, i1 false)
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P1]], i64 10
-; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr @buf, i64 10
-; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P2]], ptr [[TMP1]], i64 1, i1 false)
+; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[P2]], ptr getelementptr inbounds (i8, ptr @buf, i64 10), i64 1, i1 false)
; CHECK-NEXT: ret void
;
call void @llvm.memcpy.p0.p0.i64(ptr %p1, ptr @buf, i64 26, i1 false)
More information about the llvm-commits
mailing list