Skip to content

[MemCpyOpt] Don't perform call slot opt if alloc type is scalable #75027

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 11, 2023

Conversation

wangpc-pp
Copy link
Contributor

This fixes #75010.

@llvmbot
Copy link
Member

llvmbot commented Dec 11, 2023

@llvm/pr-subscribers-llvm-transforms

Author: Wang Pengcheng (wangpc-pp)

Changes

This fixes #75010.


Full diff: https://github.com/llvm/llvm-project/pull/75027.diff

2 Files Affected:

  • (modified) llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp (+5-2)
  • (added) llvm/test/Transforms/MemCpyOpt/pr75010.ll (+19)
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index 0e55249d63a829..9d058e0d248378 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -880,8 +880,11 @@ bool MemCpyOptPass::performCallSlotOptzn(Instruction *cpyLoad,
     return false;
 
   const DataLayout &DL = cpyLoad->getModule()->getDataLayout();
-  uint64_t srcSize = DL.getTypeAllocSize(srcAlloca->getAllocatedType()) *
-                     srcArraySize->getZExtValue();
+  TypeSize SrcAllocaSize = DL.getTypeAllocSize(srcAlloca->getAllocatedType());
+  // We can't optimize scalable types.
+  if (SrcAllocaSize.isScalable())
+    return false;
+  uint64_t srcSize = SrcAllocaSize * srcArraySize->getZExtValue();
 
   if (cpySize < srcSize)
     return false;
diff --git a/llvm/test/Transforms/MemCpyOpt/pr75010.ll b/llvm/test/Transforms/MemCpyOpt/pr75010.ll
new file mode 100644
index 00000000000000..c9af7543b42e64
--- /dev/null
+++ b/llvm/test/Transforms/MemCpyOpt/pr75010.ll
@@ -0,0 +1,19 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -passes=memcpyopt < %s | FileCheck %s
+
+define void @f(ptr nocapture noundef writeonly %r, <vscale x 2 x i32> %x) {
+; CHECK-LABEL: @f(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[X_ADDR:%.*]] = alloca <vscale x 2 x i32>, align 8
+; CHECK-NEXT:    store <vscale x 2 x i32> [[X:%.*]], ptr [[X_ADDR]], align 8
+; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[X_ADDR]], align 8
+; CHECK-NEXT:    store i64 [[TMP0]], ptr [[R:%.*]], align 1
+; CHECK-NEXT:    ret void
+;
+entry:
+  %x.addr = alloca <vscale x 2 x i32>, align 8
+  store <vscale x 2 x i32> %x, ptr %x.addr, align 8
+  %0 = load i64, ptr %x.addr, align 8
+  store i64 %0, ptr %r, align 1
+  ret void
+}

Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@wangpc-pp wangpc-pp merged commit 6aa6ef7 into llvm:main Dec 11, 2023
@wangpc-pp wangpc-pp deleted the main-memcpy-opt-scalable branch December 11, 2023 11:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Crash on memcpy of RVV vector
3 participants