[llvm] 4125afc - [MemCpyOpt] Fix handling of readnone byval arguments

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 22 09:48:41 PST 2021


Author: Nikita Popov
Date: 2021-02-22T18:48:31+01:00
New Revision: 4125afc35723b490556f7a38f7835f0914f70292

URL: https://github.com/llvm/llvm-project/commit/4125afc35723b490556f7a38f7835f0914f70292
DIFF: https://github.com/llvm/llvm-project/commit/4125afc35723b490556f7a38f7835f0914f70292.diff

LOG: [MemCpyOpt] Fix handling of readnone byval arguments

If the call is readnone, then there may not be any MemoryAccess
associated with the call. Bail out in that case.

This fixes the issue reported at
https://reviews.llvm.org/D94376#2578312.

Added: 
    llvm/test/Transforms/MemCpyOpt/byval-readnone.ll

Modified: 
    llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index 259e656091ad..da4513535542 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -1541,6 +1541,8 @@ bool MemCpyOptPass::processByValArgument(CallBase &CB, unsigned ArgNo) {
   MemCpyInst *MDep = nullptr;
   if (EnableMemorySSA) {
     MemoryUseOrDef *CallAccess = MSSA->getMemoryAccess(&CB);
+    if (!CallAccess)
+      return false;
     MemoryAccess *Clobber = MSSA->getWalker()->getClobberingMemoryAccess(
         CallAccess->getDefiningAccess(), Loc);
     if (auto *MD = dyn_cast<MemoryDef>(Clobber))

diff  --git a/llvm/test/Transforms/MemCpyOpt/byval-readnone.ll b/llvm/test/Transforms/MemCpyOpt/byval-readnone.ll
new file mode 100644
index 000000000000..cb62ff27f4be
--- /dev/null
+++ b/llvm/test/Transforms/MemCpyOpt/byval-readnone.ll
@@ -0,0 +1,18 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -memcpyopt -S -enable-memcpyopt-memoryssa=0 | FileCheck %s
+; RUN: opt < %s -memcpyopt -S -enable-memcpyopt-memoryssa=1 -verify-memoryssa | FileCheck %s
+
+%struct = type { i16 }
+
+declare i16 @g(%struct*) readnone
+
+define void @f() {
+; CHECK-LABEL: @f(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CALL:%.*]] = call i16 @g(%struct* byval(%struct) align 1 undef)
+; CHECK-NEXT:    ret void
+;
+entry:
+  %call = call i16 @g(%struct* byval(%struct) align 1 undef)
+  ret void
+}


        


More information about the llvm-commits mailing list